Unsorted Bin Attack
Reading time: 8 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Grundinformationen
Für weitere Informationen darüber, was ein unsorted bin ist, siehe diese Seite:
Unsortierte Listen können die Adresse zu unsorted_chunks (av)
in der bk
-Adresse des Chunks schreiben. Daher, wenn ein Angreifer die Adresse des bk
-Zeigers in einem Chunk innerhalb des unsorted bins modifizieren kann, könnte er in der Lage sein, diese Adresse an einer beliebigen Adresse zu schreiben, was hilfreich sein könnte, um Glibc-Adressen zu leaken oder einige Abwehrmaßnahmen zu umgehen.
Im Grunde genommen ermöglicht dieser Angriff, eine große Zahl an einer beliebigen Adresse zu setzen. Diese große Zahl ist eine Adresse, die eine Heap-Adresse oder eine Glibc-Adresse sein könnte. Ein typisches Ziel ist global_max_fast
, um die Erstellung von Fast-Bin-Bins mit größeren Größen zu ermöglichen (und von einem unsorted bin Angriff zu einem Fast-Bin-Angriff überzugehen).
tip
Ein Blick auf das Beispiel, das in https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle bereitgestellt wird, und die Verwendung von 0x4000 und 0x5000 anstelle von 0x400 und 0x500 als Chunk-Größen (um Tcache zu vermeiden), zeigt, dass heutzutage der Fehler malloc(): unsorted double linked list corrupted
ausgelöst wird.
Daher erfordert dieser unsorted bin Angriff jetzt (neben anderen Überprüfungen) auch, dass die doppelt verlinkte Liste so repariert wird, dass victim->bk->fd == victim
oder nicht victim->fd == av (arena)
umgangen wird, was bedeutet, dass die Adresse, an die wir schreiben wollen, die Adresse des gefälschten Chunks in ihrer fd
-Position haben muss und dass der gefälschte Chunk fd
auf die Arena zeigt.
caution
Beachten Sie, dass dieser Angriff den unsorted 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.
Beachten Sie, dass das Überschreiben von global_max_fast
in diesem Fall hilfreich sein könnte, in der Annahme, dass der Fast Bin in der Lage sein wird, sich um alle anderen Allokationen zu kümmern, bis der Exploit abgeschlossen ist.
Der Code von guyinatuxedo erklärt es sehr gut, obwohl, wenn Sie die Mallocs ändern, um genügend Speicher zu allokieren, damit sie nicht in einem Tcache enden, können Sie sehen, dass der zuvor erwähnte Fehler auftritt, der diese Technik verhindert: malloc(): unsorted double linked list corrupted
Unsorted Bin Infoleak Angriff
Dies ist tatsächlich ein sehr grundlegendes Konzept. Die Chunks im unsorted bin werden Zeiger haben. Der erste Chunk im unsorted bin wird tatsächlich die fd
- und bk
-Links auf einen Teil der Hauptarena (Glibc) zeigen.
Daher, wenn Sie einen Chunk in einen unsorted bin legen und ihn lesen (use after free) oder ihn erneut allokieren, ohne mindestens 1 der Zeiger zu überschreiben, um ihn dann zu lesen, können Sie einen Glibc-Infoleak erhalten.
Ein ähnlicher Angriff, der in diesem Bericht verwendet wurde, bestand darin, eine Struktur mit 4 Chunks (A, B, C und D - D dient nur dazu, die Konsolidierung mit dem Top-Chunk zu verhindern) zu missbrauchen, sodass ein Null-Byte-Overflow in B verwendet wurde, um C anzuzeigen, dass B ungenutzt war. Außerdem wurde in B die prev_size
-Daten so modifiziert, dass die Größe anstelle der Größe von B A+B war.
Dann wurde C deallokiert und mit A+B konsolidiert (aber B war noch in Benutzung). Ein neuer Chunk der Größe A wurde allokiert und dann wurden die geleakten Adressen der libc in B geschrieben, von wo sie geleakt wurden.
Referenzen & Weitere Beispiele
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap
- Das Ziel ist es, eine globale Variable mit einem Wert größer als 4869 zu überschreiben, damit es möglich ist, die Flagge zu erhalten und PIE nicht aktiviert ist.
- Es ist möglich, Chunks beliebiger Größen zu generieren, und es gibt einen Heap-Overflow mit der gewünschten Größe.
- Der Angriff beginnt mit der Erstellung von 3 Chunks: chunk0, um den Overflow auszunutzen, chunk1, um überflutet zu werden, und chunk2, damit der Top-Chunk die vorherigen nicht konsolidiert.
- Dann wird chunk1 freigegeben und chunk0 wird überflutet, sodass der
bk
-Zeiger von chunk1 aufzeigt:bk = magic - 0x10
- Dann wird chunk3 mit der gleichen Größe wie chunk1 allokiert, was den unsorted bin Angriff auslöst und den Wert der globalen Variable ändert, wodurch es möglich wird, die Flagge zu erhalten.
- https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html
- Die Merge-Funktion ist anfällig, weil, wenn beide übergebenen Indizes gleich sind, sie darauf realloc und dann freigeben wird, aber einen Zeiger auf diesen freigegebenen Bereich zurückgibt, der verwendet werden kann.
- Daher werden 2 Chunks erstellt: chunk0, das mit sich selbst zusammengeführt wird, und chunk1, um die Konsolidierung mit dem Top-Chunk zu verhindern. Dann wird die Merge-Funktion mit chunk0 zweimal aufgerufen, was zu einem Use-After-Free führt.
- Dann wird die
view
-Funktion mit Index 2 (der Index des Use-After-Free-Chunks) aufgerufen, was eine libc-Adresse leakt. - Da die Binärdatei Schutzmaßnahmen hat, um nur Malloc-Größen größer als
global_max_fast
zuzulassen, wird ein unsorted bin Angriff verwendet, um die globale Variableglobal_max_fast
zu überschreiben. - Dann ist es möglich, die Edit-Funktion mit Index 2 (dem Use-After-Free-Zeiger) aufzurufen und den
bk
-Zeiger so zu überschreiben, dass er aufp64(global_max_fast-0x10)
zeigt. Dann wird ein neuer Chunk erstellt, der die zuvor kompromittierte freigegebene Adresse (0x20) verwendet, was den unsorted bin Angriff auslöst, derglobal_max_fast
überschreibt, was einen sehr großen Wert hat, wodurch jetzt Chunks in Fast Bins erstellt werden können. - Jetzt wird ein Fast Bin Angriff durchgeführt:
- Zunächst wird entdeckt, dass es möglich ist, mit schnellen Chunks der Größe 200 im
__free_hook
-Standort zu arbeiten: gef➤ p &__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
- Wenn es uns gelingt, einen schnellen Chunk der Größe 0x200 an diesem Ort zu erhalten, wird es möglich sein, einen Funktionszeiger zu überschreiben, der ausgeführt wird.
- Dazu wird ein neuer Chunk der Größe
0xfc
erstellt und die Merge-Funktion wird mit diesem Zeiger zweimal aufgerufen, sodass wir einen Zeiger auf einen freigegebenen Chunk der Größe0xfc*2 = 0x1f8
im Fast Bin erhalten. - Dann wird die Edit-Funktion in diesem Chunk aufgerufen, um die
fd
-Adresse dieses Fast Bins so zu ändern, dass sie auf die vorherige__free_hook
-Funktion zeigt. - Dann wird ein Chunk der Größe
0x1f8
erstellt, um den vorherigen nutzlosen Chunk aus dem Fast Bin abzurufen, sodass ein weiterer Chunk der Größe0x1f8
erstellt wird, um einen Fast Bin Chunk im__free_hook
zu erhalten, der mit der Adresse dersystem
-Funktion überschrieben wird. - Und schließlich wird ein Chunk, der den String
/bin/sh\x00
enthält, freigegeben, indem die Delete-Funktion aufgerufen wird, was die__free_hook
-Funktion auslöst, die auf system mit/bin/sh\x00
als Parameter zeigt. - CTF https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html
- Ein weiteres Beispiel für den Missbrauch eines 1B-Overflows zur Konsolidierung von Chunks im unsorted bin und zum Erhalten eines libc-Infoleaks und dann zur Durchführung eines Fast Bin Angriffs, um den Malloc-Hook mit einer One-Gadget-Adresse zu überschreiben.
- Robot Factory. BlackHat MEA CTF 2022
- Wir können nur Chunks mit einer Größe größer als
0x100
allokieren. - Überschreiben von
global_max_fast
mit einem Unsorted Bin Angriff (funktioniert 1/16 Mal aufgrund von ASLR, da wir 12 Bits modifizieren müssen, aber 16 Bits modifizieren müssen). - Fast Bin Angriff, um ein globales Array von Chunks zu modifizieren. Dies gibt eine beliebige Lese-/Schreibprimitive, die es ermöglicht, die GOT zu modifizieren und einige Funktionen auf
system
zu zeigen.
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.