Ret2lib
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
L'essenza di Ret2Libc è reindirizzare il flusso di esecuzione di un programma vulnerabile a una funzione all'interno di una libreria condivisa (ad es., system, execve, strcpy) invece di eseguire shellcode fornito dall'attaccante nello stack. L'attaccante crea un payload che modifica l'indirizzo di ritorno nello stack per puntare alla funzione della libreria desiderata, mentre organizza anche eventuali argomenti necessari per essere impostati correttamente secondo la convenzione di chiamata.
Ottenere l'indirizzo della funzione da chiamare (ad es. system) e il comando da chiamare (ad es. /bin/sh)
Generare una catena ROP per passare il primo argomento che punta alla stringa del comando e il flusso di esecuzione alla funzione
Supponendo che la libc
utilizzata sia quella della macchina corrente, puoi trovare dove verrà caricata in memoria con:
Se vuoi controllare se l'ASLR sta cambiando l'indirizzo di libc, puoi fare:
Conoscendo la libc utilizzata, è anche possibile trovare l'offset della funzione system
con:
Conoscendo la libc utilizzata, è anche possibile trovare l'offset alla stringa /bin/sh
funzione con:
Conoscendo la libc utilizzata, è anche possibile usare Peda o GEF per ottenere l'indirizzo della funzione system, della funzione exit e della stringa /bin/sh
:
Se il processo sta creando figli ogni volta che parli con esso (server di rete) prova a leggere quel file (probabilmente avrai bisogno di essere root).
Qui puoi trovare esattamente dove è caricata la libc all'interno del processo e dove verrà caricata per ogni figlio del processo.
In questo caso è caricata in 0xb75dc000 (Questo sarà l'indirizzo base della libc)
Potrebbe essere possibile che non conosci la libc che il binario sta caricando (perché potrebbe trovarsi su un server a cui non hai accesso). In quel caso potresti abusare della vulnerabilità per leakare alcuni indirizzi e scoprire quale libreria libc viene utilizzata:
Leaking libc address with ROPE puoi trovare un template di pwntools per questo in:
Leaking libc - templateControlla la pagina https://libc.blukat.me/ e usa un paio di indirizzi di funzioni all'interno della libc per scoprire la versione utilizzata.
Questi attacchi di brute-forcing sono utili solo per sistemi a 32 bit.
Se l'exploit è locale, puoi provare a forzare l'indirizzo base della libc (utile per sistemi a 32 bit):
Se attacchi un server remoto, potresti provare a forzare l'indirizzo della funzione usleep
di libc
, passando come argomento 10 (ad esempio). Se a un certo punto il server impiega 10 secondi in più per rispondere, hai trovato l'indirizzo di questa funzione.
Esegui una shell semplicemente saltando a un specifico indirizzo in libc:
One GadgetIn questo esempio, il brute-force ASLR è integrato nel codice e il binario vulnerabile si trova su un server remoto:
Controlla l'esempio da:
ROP - Return Oriented ProgramingNel caso di ARM64, l'istruzione ret salta a dove punta il registro x30 e non a dove punta il registro dello stack. Quindi è un po' più complicato.
Inoltre, in ARM64 un'istruzione fa ciò che l'istruzione fa (non è possibile saltare nel mezzo delle istruzioni e trasformarle in nuove).
Controlla l'esempio da:
Ret2lib + Printf leak - arm64Questo consente di leak informazioni dal processo chiamando printf
/puts
con alcuni dati specifici posti come argomento. Ad esempio, mettere l'indirizzo di puts
nel GOT in un'esecuzione di puts
leakerà l'indirizzo di puts
in memoria.
Questo significa fondamentalmente abusare di un Ret2lib per trasformarlo in una vulnerabilità di stringhe di formato printf
utilizzando il ret2lib
per chiamare printf con i valori per sfruttarlo (sembra inutile ma è possibile):
Ret2lib, dato un leak all'indirizzo di una funzione in libc, utilizzando un gadget
64 bit, ASLR abilitato ma senza PIE, il primo passo è riempire un overflow fino al byte 0x00 del canary per poi chiamare puts e leakarlo. Con il canary viene creato un gadget ROP per chiamare puts per leakare l'indirizzo di puts dal GOT e poi un gadget ROP per chiamare system('/bin/sh')
64 bit, ASLR abilitato, senza canary, overflow dello stack in main da una funzione figlia. Gadget ROP per chiamare puts per leakare l'indirizzo di puts dal GOT e poi chiamare un gadget.
64 bit, senza pie, senza canary, senza relro, nx. Usa la funzione write per leakare l'indirizzo di write (libc) e chiama un gadget.
Usa una stringa di formato per leakare il canary dallo stack e un buffer overflow per chiamare system (è nel GOT) con l'indirizzo di /bin/sh
.
32 bit, senza relro, senza canary, nx, pie. Abusa di un indicizzazione errata per leakare indirizzi di libc e heap dallo stack. Abusa del buffer overflow per fare un ret2lib chiamando system('/bin/sh')
(l'indirizzo dell'heap è necessario per bypassare un controllo).
Impara e pratica Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)