House of Orange

Unterstützen Sie HackTricks

Grundlegende Informationen

Code

Ziel

  • Missbrauch der malloc_printerr-Funktion

Anforderungen

  • Überschreiben der Top-Chunk-Größe

  • Lecks von Libc und Heap

Hintergrund

Einige benötigte Hintergrundinformationen aus den Kommentaren von diesem Beispiel:

Das Ding ist, in älteren Versionen von libc, als die malloc_printerr-Funktion aufgerufen wurde, würde sie eine Liste von _IO_FILE-Strukturen durchlaufen, die in _IO_list_all gespeichert sind, und tatsächlich einen Befehlszeiger in dieser Struktur ausführen. Dieser Angriff wird eine gefälschte _IO_FILE-Struktur schmieden, die wir in _IO_list_all schreiben werden, und malloc_printerr dazu bringen, ausgeführt zu werden. Dann wird es ausführen, was auch immer Adresse wir in den _IO_FILE-Strukturen Sprungtabelle gespeichert haben, und wir werden Codeausführung erhalten

Angriff

Der Angriff beginnt damit, den Top-Chunk innerhalb des unsortierten Bins zu verwalten. Dies wird erreicht, indem malloc mit einer Größe aufgerufen wird, die größer ist als die aktuelle Top-Chunk-Größe, aber kleiner als mmp_.mmap_threshold (Standardwert ist 128K), was sonst eine mmap-Zuweisung auslösen würde. Immer wenn die Top-Chunk-Größe geändert wird, ist es wichtig sicherzustellen, dass der Top-Chunk + seine Größe seitenaligniert ist und dass das prev_inuse-Bit des Top-Chunks immer gesetzt ist.

Um den Top-Chunk innerhalb des unsortierten Bins zu erhalten, allozieren Sie einen Chunk, um den Top-Chunk zu erstellen, ändern Sie die Top-Chunk-Größe (mit einem Überlauf im allozierten Chunk), sodass Top-Chunk + Größe seitenaligniert ist und das prev_inuse-Bit gesetzt ist. Allozieren Sie dann einen Chunk, der größer ist als die neue Top-Chunk-Größe. Beachten Sie, dass free nie aufgerufen wird, um den Top-Chunk in das unsortierte Bin zu bringen.

Der alte Top-Chunk befindet sich nun im unsortierten Bin. Unter der Annahme, dass wir Daten darin lesen können (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 durch den Missbrauch des Überlaufs durchgeführt, um topChunk->bk->fwd = _IO_list_all - 0x10 zu schreiben. Wenn ein neuer Chunk alloziert wird, wird der alte Top-Chunk 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 verkleinern, um in einen kleinen Bin zu passen, und zwar speziell seine Größe auf 0x61 zu setzen. Dies dient zwei Zwecken:

  1. Einfügen in Small Bin 4: Wenn malloc durch das unsortierte Bin scannt und diesen Chunk sieht, wird versucht, ihn in den kleinen Bin 4 einzufügen, aufgrund seiner geringen Größe. Dadurch landet der Chunk am Anfang der Liste des kleinen Bins 4, was der Speicherort 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.

  2. Auslösen einer Malloc-Überprüfung: Diese Manipulation der Chunkgröße führt dazu, dass malloc interne Überprüfungen durchführt. Wenn es die Größe des falschen Vorwärtschunks überprüft, die null sein wird, löst es einen Fehler aus und ruft malloc_printerr auf.

Die Manipulation des kleinen Bins ermöglicht es Ihnen, den Vorwärtszeiger des Chunks zu steuern. Die Überlappung mit _IO_list_all wird verwendet, um eine gefälschte _IO_FILE-Struktur zu schmieden. Die Struktur wird sorgfältig erstellt, um Schlüsselfelder wie _IO_write_base und _IO_write_ptr einzuschließen, die auf Werte gesetzt sind, die interne Überprüfungen in libc bestehen. Darüber hinaus wird innerhalb der gefälschten Struktur eine Sprungtabelle erstellt, in der ein Befehlszeiger auf die Adresse gesetzt ist, an der beliebiger Code (z. B. die system-Funktion) ausgeführt werden kann.

Um den verbleibenden Teil der Technik zusammenzufassen:

  • Verkleinern des alten Top-Chunks: Passen Sie die Größe des alten Top-Chunks auf 0x61 an, um ihn in einen kleinen Bin zu passen.

  • Einrichten der gefälschten _IO_FILE-Struktur: Überlappen Sie den alten Top-Chunk mit der gefälschten _IO_FILE-Struktur und setzen Sie die Felder entsprechend, um den Ausführungsfluss zu kapern.

Der nächste Schritt besteht darin, eine gefälschte _IO_FILE-Struktur zu schmieden, die mit dem alten Top-Chunk, der sich derzeit im unsortierten Bin befindet, überlappt. Die ersten Bytes dieser Struktur werden sorgfältig erstellt, um einen Zeiger auf einen Befehl (z. B. "/bin/sh") zu enthalten, der ausgeführt wird.

Schlüsselfelder in der gefälschten _IO_FILE-Struktur, wie _IO_write_base und _IO_write_ptr, werden auf Werte gesetzt, die interne Überprüfungen in libc bestehen. Darüber hinaus wird innerhalb der gefälschten Struktur eine Sprungtabelle erstellt, in der ein Befehlszeiger auf die Adresse gesetzt ist, an der beliebiger Code ausgeführt werden kann. Typischerweise handelt es sich dabei um die Adresse der system-Funktion oder einer anderen Funktion, die Shell-Befehle ausführen kann.

Der Angriff kulminiert, wenn ein Aufruf von malloc die Ausführung des Codes durch die manipulierte _IO_FILE-Struktur auslöst. Dies ermöglicht effektiv die Ausführung beliebigen Codes, was in der Regel dazu führt, dass eine Shell gestartet oder eine andere bösartige Nutzlast ausgeführt wird.

Zusammenfassung des Angriffs:

  1. Einrichten des Top-Chunks: Einen Chunk zuweisen und die Top-Chunk-Größe ändern.

  2. Erzwingen des Top-Chunks in das unsortierte Bin: Einen größeren Chunk zuweisen.

  3. Lecken von libc-Adressen: Verwenden Sie die Schwachstelle, um aus dem unsortierten Bin zu lesen.

  4. Durchführen des Angriffs auf das unsortierte Bin: Schreiben Sie über einen Überlauf in _IO_list_all.

  5. Verkleinern des alten Top-Chunks: Passen Sie seine Größe an, um in einen kleinen Bin zu passen.

  6. Einrichten einer gefälschten _IO_FILE-Struktur: Eine gefälschte Dateistruktur erstellen, um die Steuerung zu kapern.

  7. Auslösen der Codeausführung: Einen Chunk zuweisen, um den Angriff auszuführen und beliebigen Code auszuführen.

Diese Methode nutzt Heap-Verwaltungsmechanismen, libc-Informationenlecks und Heap-Überläufe aus, um Codeausführung zu erreichen, ohne free direkt aufzurufen. Durch sorgfältiges Erstellen der gefälschten _IO_FILE-Struktur und Platzieren an der richtigen Stelle kann der Angriff den Steuerfluss während der Standard-Speicherzuweisungsvorgänge kapern. Dies ermöglicht die Ausführung beliebigen Codes, was möglicherweise zu einer Shell oder anderen bösartigen Aktivitäten führt.

Referenzen

Unterstützen Sie HackTricks

Last updated