House of Orange
Last updated
Last updated
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Finde ein Beispiel in https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_orange.c
Die Exploitationstechnik wurde in diesem Patch behoben, sodass dies nicht mehr funktioniert (funktioniert in Versionen vor 2.26)
Dasselbe Beispiel mit mehr Kommentaren in https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Missbrauch der malloc_printerr
-Funktion
Überschreibe die Größe des Top-Chunks
Libc- und Heap-Leaks
Einige benötigte Hintergründe aus den Kommentaren zu diesem Beispiel:
Die Sache ist, dass in älteren Versionen von libc, wenn die malloc_printerr
-Funktion aufgerufen wurde, sie durch eine Liste von _IO_FILE
-Strukturen, die in _IO_list_all
gespeichert sind, iterierte und tatsächlich einen Befehlszeiger in dieser Struktur ausführte.
Dieser Angriff wird eine falsche _IO_FILE
-Struktur fälschen, die wir in _IO_list_all
schreiben werden, und malloc_printerr
dazu bringen, ausgeführt zu werden.
Dann wird es jede Adresse ausführen, die wir in der Sprungtabelle der _IO_FILE
-Strukturen gespeichert haben, und wir werden Codeausführung erhalten.
Der Angriff beginnt damit, dass es gelingt, den Top-Chuck im unsortierten Bin zu erhalten. Dies wird erreicht, indem malloc
mit einer Größe aufgerufen wird, die größer ist als die aktuelle Top-Chuck-Größe, aber kleiner als mmp_.mmap_threshold
(Standard ist 128K), was andernfalls eine mmap
-Zuweisung auslösen würde. Wann immer die Größe des Top-Chunks geändert wird, ist es wichtig sicherzustellen, dass die Top-Chuck + seine Größe seitenaligned ist und dass das prev_inuse-Bit des Top-Chunks immer gesetzt ist.
Um den Top-Chuck im unsortierten Bin zu erhalten, allokiere einen Chunk, um den Top-Chuck zu erstellen, ändere die Größe des Top-Chunks (mit einem Überlauf im zugewiesenen Chunk), sodass Top-Chuck + Größe seitenaligned ist und das prev_inuse-Bit gesetzt ist. Dann allokiere einen Chunk, der größer ist als die neue Top-Chuck-Größe. Beachte, dass free
niemals aufgerufen wird, um den Top-Chuck in das unsortierte Bin zu bringen.
Der alte Top-Chuck befindet sich jetzt im unsortierten Bin. Vorausgesetzt, wir können Daten darin lesen (möglicherweise aufgrund einer Schwachstelle, die auch den Überlauf verursacht hat), ist es möglich, libc-Adressen daraus zu leaken und die Adresse von _IO_list_all zu erhalten.
Ein Angriff auf das unsortierte Bin wird durchgeführt, indem der Überlauf missbraucht wird, um topChunk->bk->fwd = _IO_list_all - 0x10
zu schreiben. Wenn ein neuer Chunk zugewiesen wird, wird der alte Top-Chuck aufgeteilt, und ein Zeiger auf das unsortierte Bin wird in _IO_list_all
geschrieben.
Der nächste Schritt besteht darin, die Größe des alten Top-Chunks zu verringern, um in ein kleines Bin zu passen, indem seine Größe auf 0x61 gesetzt wird. Dies dient zwei Zwecken:
Einfügen in Small Bin 4: Wenn malloc
durch das unsortierte Bin scannt und diesen Chunk sieht, wird es versuchen, ihn aufgrund seiner kleinen Größe in Small Bin 4 einzufügen. Dadurch landet der Chunk am Kopf der Small Bin 4-Liste, die der Standort des FD-Zeigers des Chunks von _IO_list_all
ist, da wir eine nahe Adresse in _IO_list_all
über den Angriff auf das unsortierte Bin geschrieben haben.
Auslösen einer Malloc-Prüfung: Diese Manipulation der Chunk-Größe wird dazu führen, dass malloc
interne Prüfungen durchführt. Wenn es die Größe des falschen Vorwärtschunks überprüft, die null sein wird, wird ein Fehler ausgelöst und malloc_printerr
aufgerufen.
Die Manipulation des kleinen Bins ermöglicht es dir, den Vorwärtszeiger des Chunks zu steuern. Die Überlappung mit _IO_list_all wird verwendet, um eine falsche _IO_FILE-Struktur zu fälschen. Die Struktur wird sorgfältig erstellt, um wichtige Felder wie _IO_write_base
und _IO_write_ptr
zu enthalten, die auf Werte gesetzt sind, die interne Prüfungen in libc bestehen. Darüber hinaus wird innerhalb der falschen Struktur eine Sprungtabelle erstellt, in der ein Befehlszeiger auf die Adresse gesetzt wird, an der beliebiger Code (z. B. die system
-Funktion) ausgeführt werden kann.
Um den verbleibenden Teil der Technik zusammenzufassen:
Verkleinere den alten Top-Chuck: Passe die Größe des alten Top-Chunks auf 0x61 an, um ihn in ein kleines Bin zu passen.
Richte die falsche _IO_FILE
-Struktur ein: Überlappe den alten Top-Chuck mit der falschen _IO_FILE-Struktur und setze die Felder entsprechend, um den Ausführungsfluss zu übernehmen.
Der nächste Schritt besteht darin, eine falsche _IO_FILE-Struktur zu fälschen, die mit dem alten Top-Chuck überlappt, der sich derzeit im unsortierten Bin befindet. Die ersten Bytes dieser Struktur werden sorgfältig erstellt, um einen Zeiger auf einen Befehl (z. B. "/bin/sh"), der ausgeführt werden soll, zu enthalten.
Wichtige Felder in der falschen _IO_FILE-Struktur, wie _IO_write_base
und _IO_write_ptr
, werden auf Werte gesetzt, die interne Prüfungen in libc bestehen. Darüber hinaus wird innerhalb der falschen Struktur eine Sprungtabelle erstellt, in der ein Befehlszeiger auf die Adresse gesetzt wird, an der beliebiger Code ausgeführt werden kann. Typischerweise wäre dies die Adresse der system
-Funktion oder einer anderen Funktion, die Shell-Befehle ausführen kann.
Der Angriff kulminiert, wenn ein Aufruf an malloc
die Ausführung des Codes über die manipulierte _IO_FILE-Struktur auslöst. Dies ermöglicht effektiv die Ausführung beliebigen Codes, was typischerweise dazu führt, dass eine Shell gestartet oder eine andere bösartige Nutzlast ausgeführt wird.
Zusammenfassung des Angriffs:
Richte den Top-Chuck ein: Allokiere einen Chunk und ändere die Größe des Top-Chunks.
Zwinge den Top-Chuck in das unsortierte Bin: Allokiere einen größeren Chunk.
Leake libc-Adressen: Nutze die Schwachstelle, um aus dem unsortierten Bin zu lesen.
Führe den Angriff auf das unsortierte Bin durch: Schreibe in _IO_list_all mithilfe eines Überlaufs.
Verkleinere den alten Top-Chuck: Passe seine Größe an, um in ein kleines Bin zu passen.
Richte eine falsche _IO_FILE-Struktur ein: Fälsche eine falsche Datei-Struktur, um den Kontrollfluss zu übernehmen.
Trigger die Codeausführung: Allokiere einen Chunk, um den Angriff auszuführen und beliebigen Code auszuführen.
Dieser Ansatz nutzt die Mechanismen des Heap-Managements, libc-Informationslecks und Heap-Überläufe aus, um die Codeausführung zu erreichen, ohne direkt free
aufzurufen. Durch die sorgfältige Erstellung der falschen _IO_FILE-Struktur und deren Platzierung an der richtigen Stelle kann der Angriff den Kontrollfluss während der Standard-Speicherzuweisungsoperationen übernehmen. Dies ermöglicht die Ausführung beliebigen Codes, was potenziell zu einer Shell oder anderen bösartigen Aktivitäten führen kann.
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)