House of Roman
Last updated
Last updated
Lernen Sie AWS-Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen Sie 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.
Ein Beispiel finden Sie unter https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
RCE durch Ausnutzung relativer Zeiger
Bearbeiten von Fastbin- und Unsorted-Bin-Zeigern
12 Bits Zufälligkeit müssen erraten werden (0,02% Erfolgschance)
Erstellen mehrerer Chunks:
fastbin_victim
(0x60, Offset 0): UAF-Chunk, der später bearbeitet wird, um den Heap-Zeiger 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 dem 'main_arena_use'-Chunk
Dann free(main_arena_use)
, was diesen Chunk in die unsortierte Liste platziert und einen Zeiger auf main_arena + 0x68
in sowohl den fd
als auch bk
Zeigern erhält.
Nun wird ein neuer Chunk fake_libc_chunk(0x60)
allokiert, 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 ein fd
, das auf relative_offset_heap
zeigt
relative_offset_heap
ist ein Offset von der Entfernung zu fake_libc_chunk
, der einen Zeiger auf main_arena + 0x68
enthält
Durch Ä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 ändern.
Dann ist main_arena + 0x68
nicht so interessant, also ändern wir es so, dass der Zeiger auf __malloc_hook
zeigt.
Beachten Sie, dass __memalign_hook
normalerweise mit 0x7f
beginnt und Nullen davor hat, dann ist es möglich, es als Wert im 0x70
Fastbin zu fälschen. Da die letzten 4 Bits der Adresse zufällig sind, gibt es 2^4=16
Möglichkeiten für den Wert, um dorthin zu zeigen, wo wir interessiert sind. Daher wird hier ein BF-Angriff durchgeführt, damit der Chunk wie folgt endet: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)
.
(Weitere Informationen zu den restlichen Bytes finden Sie in der 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 anfänglichen Fastbin-Chunks zu entfernen, und dann wird ein dritter allokiert, um einen Chunk im __malloc_hook:
zu erhalten.
Für weitere Informationen kannst du überprüfen:
Unsorted Bin AttackAber im Grunde erlaubt es, main_arena + 0x68
an jede Stelle zu schreiben, die in chunk->bk
angegeben ist. Und für den Angriff wählen wir __malloc_hook
. Dann, nachdem wir es überschrieben haben, werden wir eine relative Überschreibung verwenden, um auf ein one_gadget
zu zeigen.
Dafür beginnen wir damit, einen Chunk zu erhalten und ihn in den unsorted bin zu platzieren:
Verwenden Sie einen UAF in diesem Abschnitt, um unsorted_bin_ptr->bk
auf die Adresse von __malloc_hook
zu zeigen (wir haben dies zuvor durch Brute-Force ermittelt).
Beachten Sie, dass dieser Angriff den unsortierten Bin beschädigt (und somit auch den kleinen und großen Bin). Daher können wir jetzt nur Zuweisungen aus dem Fast Bin verwenden (ein komplexeres Programm könnte andere Zuweisungen durchführen und abstürzen), und um dies auszulösen, müssen wir die gleiche Größe zuweisen, oder das Programm wird abstürzen.
Um also das Schreiben 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 kontrollierten wir einen Chunk, der __malloc_hook
enthält (in der Variablen malloc_hook_chunk
) und im zweiten Schritt gelang es uns, main_arena + 0x68
hierhin zu schreiben.
Nun nutzen wir eine teilweise Überschreibung in malloc_hook_chunk
, um die libc-Adresse, die wir dort geschrieben haben (main_arena + 0x68
), zu verwenden, um eine one_gadget
-Adresse zu zeigen.
Hier ist es erforderlich, 12 Bits Zufälligkeit zu bruteforcen (weitere Informationen im how2heap Beispiel).
Schließlich, sobald die richtige Adresse überschrieben ist, rufen Sie malloc
auf und lösen Sie den one_gadget
aus.
Lernen Sie & üben Sie AWS-Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen Sie & üben Sie GCP-Hacking: HackTricks Training GCP Red Team Expert (GRTE)