mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			113 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			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}}
 |