113 lines
6.2 KiB
Markdown

# House of Roman
{{#include ../../banners/hacktricks-training.md}}
## Grundinformationen
Dies war eine sehr interessante Technik, die RCE ohne Lecks über gefälschte Fastbins, den unsorted_bin-Angriff und relative Überschreibungen ermöglichte. Es wurde jedoch [**gepatcht**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c).
### Code
- Ein Beispiel finden Sie unter [https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)
### Ziel
- RCE durch Missbrauch relativer Zeiger
### Anforderungen
- Bearbeiten Sie die Zeiger für Fastbin und unsorted bin
- 12 Bits Zufälligkeit müssen brute-forced werden (0,02% Chance), um zu funktionieren
## Angriffs Schritte
### Teil 1: Fastbin Chunk zeigt auf \_\_malloc_hook
Erstellen Sie mehrere Chunks:
- `fastbin_victim` (0x60, Offset 0): UAF-Chunk, um später den Heap-Zeiger auf den LibC-Wert zu bearbeiten.
- `chunk2` (0x80, Offset 0x70): Für gute Ausrichtung
- `main_arena_use` (0x80, Offset 0x100)
- `relative_offset_heap` (0x60, Offset 0x190): relativer Offset auf den 'main_arena_use'-Chunk
Dann `free(main_arena_use)`, was diesen Chunk in die unsorted-Liste platziert und einen Zeiger auf `main_arena + 0x68` in den `fd`- und `bk`-Zeigern erhält.
Jetzt wird ein neuer Chunk `fake_libc_chunk(0x60)` zugewiesen, da er die Zeiger auf `main_arena + 0x68` in `fd` und `bk` enthalten wird.
Dann werden `relative_offset_heap` und `fastbin_victim` freigegeben.
```c
/*
Current heap layout:
0x0: fastbin_victim - size 0x70
0x70: alignment_filler - size 0x90
0x100: fake_libc_chunk - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main - size 0x20
0x190: relative_offset_heap - size 0x70
bin layout:
fastbin: fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
```
-  `fastbin_victim` hat einen `fd`, der auf `relative_offset_heap` zeigt
-  `relative_offset_heap` ist ein Offset von der Distanz zu `fake_libc_chunk`, das einen Zeiger auf `main_arena + 0x68` enthält
- Durch das Ändern des letzten Bytes von `fastbin_victim.fd` ist es möglich, dass `fastbin_victim` auf `main_arena + 0x68` zeigt
Für die vorherigen Aktionen muss der Angreifer in der Lage sein, den fd-Zeiger von `fastbin_victim` zu modifizieren.
Dann ist `main_arena + 0x68` nicht so interessant, also lassen Sie uns es ändern, damit der Zeiger auf **`__malloc_hook`** zeigt.
Beachten Sie, dass `__memalign_hook` normalerweise mit `0x7f` beginnt und davor Nullen hat, dann ist es möglich, es als einen Wert im `0x70` Fast Bin zu fälschen. Da die letzten 4 Bits der Adresse **zufällig** sind, gibt es `2^4=16` Möglichkeiten, dass der Wert dort endet, wo wir interessiert sind. Daher wird hier ein BF-Angriff durchgeführt, sodass der Chunk endet wie: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.**
(Für weitere Informationen zu den restlichen Bytes überprüfen Sie die Erklärung im [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[ Beispiel](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)). Wenn der BF nicht funktioniert, stürzt das Programm einfach ab (also starten Sie erneut, bis es funktioniert).
Dann werden 2 Mallocs durchgeführt, um die 2 initialen Fast Bin Chunks zu entfernen, und ein dritter wird alloziert, um einen Chunk in **`__malloc_hook:`** zu erhalten.
```c
malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);
```
### Teil 2: Unsorted_bin-Angriff
Für weitere Informationen können Sie überprüfen:
{{#ref}}
unsorted-bin-attack.md
{{#endref}}
Aber im Grunde ermöglicht es, `main_arena + 0x68` an jeden Ort zu schreiben, der in `chunk->bk` angegeben ist. Und für den Angriff wählen wir `__malloc_hook`. Dann, nachdem wir es überschrieben haben, verwenden wir eine relative Überschreibung, um auf ein `one_gadget` zu zeigen.
Dafür beginnen wir, einen Chunk zu erhalten und ihn in den **unsorted bin** zu legen:
```c
uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate
puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
```
Verwenden Sie ein UAF in diesem Chunk, um `unsorted_bin_ptr->bk` auf die Adresse von `__malloc_hook` zu zeigen (wir haben dies zuvor brute-forced).
> [!CAUTION]
> Beachten Sie, dass dieser Angriff den unsortierten Bin (und damit auch den kleinen und großen) beschädigt. Daher können wir jetzt nur **Allokationen aus dem schnellen Bin verwenden** (ein komplexeres Programm könnte andere Allokationen durchführen und abstürzen), und um dies auszulösen, müssen wir **die gleiche Größe allokieren, sonst wird das Programm abstürzen.**
Um also den Schreibvorgang von `main_arena + 0x68` in `__malloc_hook` auszulösen, führen wir nach dem Setzen von `__malloc_hook` in `unsorted_bin_ptr->bk` einfach aus: **`malloc(0x80)`**
### Schritt 3: Setzen Sie \_\_malloc_hook auf system
Im ersten Schritt haben wir einen Chunk kontrolliert, der `__malloc_hook` enthält (in der Variablen `malloc_hook_chunk`), und im zweiten Schritt haben wir es geschafft, `main_arena + 0x68` hier zu schreiben.
Jetzt missbrauchen wir eine partielle Überschreibung in `malloc_hook_chunk`, um die libc-Adresse, die wir dort geschrieben haben (`main_arena + 0x68`), zu **einer `one_gadget`-Adresse zu zeigen**.
Hier ist es notwendig, **12 Bits Zufälligkeit zu brute-forcen** (weitere Informationen im [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[ Beispiel](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)).
Schließlich, sobald die korrekte Adresse überschrieben ist, **rufen Sie `malloc` auf und lösen Sie die `one_gadget` aus.**
## Referenzen
- [https://github.com/shellphish/how2heap](https://github.com/shellphish/how2heap)
- [https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)
- [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/)
{{#include ../../banners/hacktricks-training.md}}