Ret2lib
Last updated
Last updated
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Die Essenz von Ret2Libc besteht darin, den Ausführungsfluss eines verwundbaren Programms auf eine Funktion innerhalb einer gemeinsamen Bibliothek (z. B. system, execve, strcpy) umzuleiten, anstatt vom Angreifer bereitgestellten Shellcode auf dem Stack auszuführen. Der Angreifer erstellt ein Payload, das die Rücksprungadresse auf dem Stack so ändert, dass sie auf die gewünschte Bibliotheksfunktion zeigt, während auch sichergestellt wird, dass alle erforderlichen Argumente gemäß der Aufrufkonvention korrekt eingerichtet sind.
Holen Sie sich die Adresse der aufzurufenden Funktion (z. B. system) und den Befehl, der aufgerufen werden soll (z. B. /bin/sh)
Erzeugen Sie eine ROP-Kette, um das erste Argument, das auf die Befehlszeichenfolge zeigt, und den Ausführungsfluss zur Funktion zu übergeben
Angenommen, die verwendete libc
ist die von der aktuellen Maschine, 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:
Wenn die verwendete libc bekannt ist, ist es auch möglich, den Offset zur Funktion des Strings /bin/sh
mit:
Wenn die verwendete libc bekannt ist, ist es auch möglich, Peda oder GEF zu verwenden, um die Adresse der system-Funktion, der exit-Funktion und des Strings /bin/sh
zu erhalten:
Wenn der Prozess Kinder erstellt, jedes Mal, wenn Sie mit ihm sprechen (Netzwerkserver), 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 ist 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 möglicherweise auf einem Server befindet, auf den Sie keinen Zugriff haben). In diesem Fall könnten Sie die Schwachstelle ausnutzen, um einige Adressen zu leaken und herauszufinden, welche libc-Bibliothek verwendet wird:
Und Sie können eine pwntools-Vorlage dafür finden in:
Ü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 nützlich für 32-Bit-Systeme.
Wenn der Exploit lokal ist, können Sie versuchen, die Basisadresse der libc zu brute-forcen (nützlich für 32-Bit-Systeme):
Wenn Sie einen Remote-Server angreifen, könnten Sie versuchen, die Adresse der libc
-Funktion usleep
zu brute-forcen, indem Sie als Argument 10 übergeben (zum Beispiel). Wenn der Server irgendwann 10 Sekunden länger für die Antwort benötigt, haben Sie die Adresse dieser Funktion gefunden.
Führen Sie eine Shell aus, indem Sie einfach zu einer bestimmten Adresse in libc springen:
In diesem Beispiel ist ASLR-Brute-Force im Code integriert und die verwundbare Binärdatei befindet sich auf einem Remote-Server:
Überprüfen Sie das Beispiel von:
Im Fall von ARM64 springt die ret-Anweisung zu dem, worauf das x30-Register zeigt, und nicht zu dem, worauf das Stack-Register zeigt. Es ist also etwas komplizierter.
Auch in ARM64 führt eine Anweisung das aus, was die Anweisung tut (es ist nicht möglich, mitten in Anweisungen zu springen und sie in neue zu transformieren).
Überprüfen Sie das Beispiel von:
Dies ermöglicht es, Informationen aus dem Prozess zu leaken, indem printf
/puts
mit bestimmten Daten als Argument aufgerufen wird. Zum Beispiel wird das Einfügen der Adresse von puts
in die GOT in eine Ausführung von puts
die Adresse von puts
im Speicher leaken.
Das bedeutet im Grunde, eine Ret2lib auszunutzen, um sie in eine printf
-Formatstrings-Schwachstelle zu verwandeln, indem die ret2lib
verwendet wird, um printf mit den Werten aufzurufen, um sie auszunutzen (klingt nutzlos, ist aber möglich):
Ret2lib, gegeben einen Leak zur Adresse einer Funktion in libc, unter Verwendung eines Gadgets
64 Bit, ASLR aktiviert, aber kein PIE, der erste Schritt ist, einen Überlauf zu füllen, bis zum Byte 0x00 des Canary, um dann puts aufzurufen und es zu leaken. Mit dem Canary wird ein ROP-Gadget erstellt, um puts aufzurufen, um die Adresse von puts aus der GOT zu leaken und dann ein ROP-Gadget, um system('/bin/sh')
aufzurufen.
64 Bit, ASLR aktiviert, kein Canary, Stack-Overflow in main von einer Kindfunktion. ROP-Gadget, um puts aufzurufen, um die Adresse von puts aus der GOT zu leaken und dann ein Gadget aufzurufen.
64 Bit, kein PIE, kein Canary, kein RELRO, NX. Verwendet die write-Funktion, um die Adresse von write (libc) zu leaken und ruft ein Gadget auf.
Verwendet einen Format-String, um das Canary vom Stack zu leaken und einen Buffer-Overflow, um in system (es ist in der GOT) mit der Adresse von /bin/sh
aufzurufen.
32 Bit, kein RELRO, kein Canary, NX, PIE. Missbraucht eine schlechte Indizierung, um Adressen von libc und Heap vom Stack zu leaken. Missbraucht den Buffer-Overflow, um ein Ret2lib aufzurufen, das system('/bin/sh')
aufruft (die Heap-Adresse wird benötigt, um eine Überprüfung zu umgehen).
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)