Ret2lib
Last updated
Last updated
Lernen Sie und üben Sie AWS-Hacking: HackTricks Training AWS Red Team Expert (ARTE) Lernen Sie und üben Sie GCP-Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Die Essenz von Ret2Libc besteht darin, den Ausführungsfluss eines anfälligen Programms auf eine Funktion in einer gemeinsam genutzten Bibliothek (z. B. system, execve, strcpy) umzuleiten, anstatt ausführbaren Shellcode auf dem Stapel des Angreifers auszuführen. Der Angreifer erstellt eine Nutzlast, die die Rückkehradresse auf dem Stapel so ändert, dass sie auf die gewünschte Bibliotheksfunktion zeigt, und gleichzeitig dafür sorgt, dass alle erforderlichen Argumente gemäß dem Aufrufkonvention korrekt eingerichtet sind.
Ermitteln Sie die Adresse der zu aufrufenden Funktion (z. B. system) und den Befehl, der aufgerufen werden soll (z. B. /bin/sh)
Generieren Sie eine ROP-Kette, um das erste Argument zu übergeben, das auf den Befehlszeichenfolgenzeiger zeigt, und den Ausführungsfluss zur Funktion zu lenken
Angenommen, die verwendete libc
ist diejenige des aktuellen Rechners, können Sie herausfinden, wo sie im Speicher geladen wird mit:
Wenn Sie überprüfen möchten, ob ASLR die Adresse von libc ändert, können Sie Folgendes tun:
Wenn die verwendete libc bekannt ist, ist es auch möglich, den Offset zur system
-Funktion mit folgendem Befehl zu finden:
Wenn die verwendete libc bekannt ist, ist es auch möglich, den Offset zur Zeichenkette /bin/sh
-Funktion zu finden mit:
Wenn die verwendete libc bekannt ist, ist es auch möglich, Peda oder GEF zu verwenden, um die Adresse der Funktion system, der Funktion exit und des Strings /bin/sh
zu erhalten:
Wenn der Prozess jedes Mal, wenn Sie mit ihm sprechen (Netzwerkserver), Kinder erstellt, versuchen Sie, diese Datei zu lesen (wahrscheinlich müssen Sie root sein).
Hier können Sie genau herausfinden, wo die libc im Prozess geladen ist und wo sie für jedes Kind des Prozesses geladen wird.
In diesem Fall wird sie bei 0xb75dc000 geladen (Dies wird die Basisadresse der libc sein)
Es könnte möglich sein, dass Sie nicht wissen, welche libc die Binärdatei lädt (weil sie sich auf einem Server befinden könnte, auf den Sie keinen Zugriff haben). In diesem Fall könnten Sie die Schwachstelle ausnutzen, um einige Adressen preiszugeben und herauszufinden, welche libc-Bibliothek verwendet wird:
Leaking libc address with ROPUnd Sie können eine pwntools-Vorlage dafür finden unter:
Leaking libc - templateÜberprüfen Sie die Seite https://libc.blukat.me/ und verwenden Sie ein paar Adressen von Funktionen innerhalb der libc, um die verwendete Version herauszufinden.
Diese Brute-Force-Angriffe sind nur für 32-Bit-Systeme nützlich.
Wenn der Exploit lokal ist, können Sie versuchen, die Basisadresse der libc per Brute-Force anzugreifen (nützlich für 32-Bit-Systeme):
Wenn Sie einen Remote-Server angreifen, könnten Sie versuchen, die Adresse der libc
-Funktion usleep
durch Brute-Force zu ermitteln und dabei 10 (zum Beispiel) als Argument zu übergeben. Wenn der Server zu einem bestimmten Zeitpunkt 10 Sekunden länger braucht, um zu antworten, haben Sie die Adresse dieser Funktion gefunden.
Führen Sie eine Shell aus, indem Sie einfach zu einer bestimmten Adresse in libc springen:
One GadgetIn diesem Beispiel ist das ASLR-Brute-Force in den Code integriert und die verwundbare Binärdatei befindet sich auf einem Remote-Server:
Überprüfen Sie das Beispiel unter:
ROP - Return Oriented ProgramingIm Fall von ARM64 springt die ret
-Anweisung dorthin, wo der x30-Register zeigt, und nicht dorthin, wo der Stack-Register zeigt. Daher ist es etwas komplizierter.
Auch in ARM64 führt eine Anweisung das aus, was die Anweisung ausführt (es ist nicht möglich, mitten in Anweisungen zu springen und sie in neue zu verwandeln).
Überprüfen Sie das Beispiel unter:
Ret2lib + Printf leak - arm64Dies ermöglicht es, Informationen aus dem Prozess auszulesen, indem printf
/puts
mit bestimmten Daten als Argument aufgerufen wird. Wenn beispielsweise die Adresse von puts
im GOT in einem Aufruf von puts
platziert wird, wird die Adresse von puts
im Speicher ausgelesen.
Dies bedeutet im Grunde, einen Ret2lib zu missbrauchen, um ihn in eine printf
-Formatstrings-Schwachstelle zu verwandeln, indem man den ret2lib
verwendet, um printf mit den Werten aufzurufen, die ausgenutzt werden sollen (klingt nutzlos, ist aber möglich):
Ret2lib, gegeben ein Leak zur Adresse einer Funktion in libc, unter Verwendung eines Einzelgadgets
64 Bit, ASLR aktiviert, aber kein PIE, der erste Schritt besteht darin, einen Überlauf bis zum Byte 0x00 des Canary zu füllen, um dann puts
aufzurufen und ihn auszulesen. Mit dem Canary wird ein ROP-Gadget erstellt, um puts
aufzurufen und die Adresse von puts
aus dem GOT auszulesen, und dann ein ROP-Gadget, um system('/bin/sh')
aufzurufen.
64 Bit, ASLR aktiviert, kein Canary, Stapelüberlauf in main
von einer Unterfunktion. ROP-Gadget, um puts
aufzurufen und die Adresse von puts
aus dem GOT auszulesen, und dann ein Einzelgadget.
64 Bit, kein PIE, kein Canary, kein relro, nx. Verwendet die write
-Funktion, um die Adresse von write
(libc) auszulesen, und ruft ein Einzelgadget auf.
Verwendet eine Formatzeichenfolge, um den Canary vom Stapel auszulesen, und einen Pufferüberlauf, um in system
(es ist im GOT) mit der Adresse von /bin/sh
zu springen.
32 Bit, kein relro, kein Canary, nx, pie. Missbraucht eine schlechte Indizierung, um Adressen von libc und Heap vom Stapel auszulesen. Missbraucht den Pufferüberlauf, um einen Ret2lib aufzurufen, der system('/bin/sh')
aufruft (die Heap-Adresse wird benötigt, um eine Überprüfung zu umgehen).