House of Roman
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Dies war eine sehr interessante Technik, die RCE ohne leaks über gefälschte Fastbins, den unsorted_bin-Angriff und relative Überschreibungen ermöglichte. Es wurde jedoch gepatcht.
Sie können ein Beispiel unter https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c finden.
RCE durch Missbrauch relativer Zeiger
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
Erstellen Sie mehrere Chunks:
fastbin_victim
(0x60, Offset 0): UAF-Chunk, um später den Heap-Zeiger zu bearbeiten, um auf den LibC-Wert zu zeigen.
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 beiden 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.
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 es uns ä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 Beispiel). 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.
Für weitere Informationen können Sie überprüfen:
Unsorted Bin AttackAber im Grunde ermöglicht es, main_arena + 0x68
an einen beliebigen 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:
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).
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 Fast 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)
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 Beispiel).
Schließlich, sobald die korrekte Adresse überschrieben ist, rufen Sie malloc
auf und lösen Sie die one_gadget
aus.
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)