Ret2lib
Impara e pratica l'Hacking su AWS: HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking su GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Informazioni di Base
L'essenza di Ret2Libc è quella di reindirizzare il flusso di esecuzione di un programma vulnerabile verso una funzione all'interno di una libreria condivisa (ad esempio, system, execve, strcpy) anziché 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, predisponendo anche eventuali argomenti necessari in base alla convenzione di chiamata.
Passaggi di Esempio (semplificati)
Ottenere l'indirizzo della funzione da chiamare (ad esempio, system) e il comando da chiamare (ad esempio, /bin/sh)
Generare una catena ROP per passare il primo argomento puntando alla stringa del comando e il flusso di esecuzione alla funzione
Trovare gli indirizzi
Supponendo che la
libc
utilizzata sia quella della macchina corrente, è possibile trovare dove verrà caricata in memoria con:
Se vuoi verificare se l'ASLR sta cambiando l'indirizzo di libc, puoi fare:
Sapendo quale libc viene utilizzato, è anche possibile trovare l'offset della funzione
system
con:
Sapendo quale libc viene utilizzato, è anche possibile trovare l'offset alla stringa della funzione
/bin/sh
con:
Usando gdb-peda / GEF
Conoscendo la libc utilizzata, è anche possibile utilizzare Peda o GEF per ottenere l'indirizzo della funzione system, della funzione exit e della stringa /bin/sh
:
Utilizzo di /proc/<PID>/maps
Se il processo crea figli ogni volta che si comunica con esso (server di rete) prova a leggere quel file (probabilmente avrai bisogno dei privilegi di root).
Qui puoi trovare esattamente dove è caricata la libc all'interno del processo e dove verrà caricata per ogni figlio del processo.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-bdf76a39d8fddd45a0ddc9ac9e31b7c694be00cc%252Fimage%2520%28853%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=63da926a&sv=1)
In questo caso è caricata in 0xb75dc000 (Questo sarà l'indirizzo di base della libc)
Libreria libc sconosciuta
Potrebbe essere possibile che non conosci la libc che il binario sta caricando (perché potrebbe trovarsi in un server a cui non hai accesso). In tal caso potresti sfruttare la vulnerabilità per rilevare alcuni indirizzi e trovare quale libreria libc viene utilizzata:
Leaking libc address with ROPE puoi trovare un modello di pwntools per questo in:
Leaking libc - templateConoscere la libc con 2 offset
Controlla la pagina https://libc.blukat.me/ e utilizza un paio di indirizzi di funzioni all'interno della libc per scoprire la versione utilizzata.
Bypassare l'ASLR in 32 bit
Questi attacchi di forza bruta sono utili solo per sistemi a 32 bit.
Se l'exploit è locale, puoi provare a forzare l'indirizzo di base della libc (utile per sistemi a 32 bit):
Se si attacca un server remoto, potresti provare a forzare l'indirizzo della funzione
usleep
dellalibc
, 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.
One Gadget
Esegui una shell saltando semplicemente a un specifico indirizzo nella libc
:
Esempio di Codice x86 Ret2lib
In questo esempio, la forzatura dell'ASLR è integrata nel codice e il binario vulnerabile è situato in un server remoto:
Esempio di codice x64 Ret2lib
Controlla l'esempio da:
ROP - Return Oriented ProgramingEsempio di 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 ciò che l'istruzione fa (non è possibile saltare nel mezzo delle istruzioni e trasformarle in nuove).
Controlla l'esempio da:
Ret2lib + Printf leak - arm64Ret-into-printf (o puts)
Questo permette di rivelare informazioni dal processo chiamando printf
/puts
con alcuni dati specifici posti come argomento. Ad esempio, mettendo l'indirizzo di puts
nella GOT in una chiamata a puts
si rivelerebbe l'indirizzo di puts
in memoria.
Ret2printf
Questo significa fondamentalmente abusare di un Ret2lib per trasformarlo in una vulnerabilità di stringhe di formato di printf
utilizzando il ret2lib
per chiamare printf con i valori da sfruttare (sembra inutile ma è possibile):
Altri Esempi e riferimenti
Ret2lib, dato un leak all'indirizzo di una funzione in libc, utilizzando un gadget
64 bit, ASLR abilitato ma nessun PIE, il primo passo è riempire un overflow fino al byte 0x00 del canary per poi chiamare puts e rivelarlo. Con il canary viene creato un ROP gadget per chiamare puts e rivelare l'indirizzo di puts dalla GOT e un ROP gadget per chiamare
system('/bin/sh')
64 bit, ASLR abilitato, nessun canary, stack overflow in main da una funzione figlio. ROP gadget per chiamare puts e rivelare l'indirizzo di puts dalla GOT e poi chiamare un one gadget.
64 bit, nessun pie, nessun canary, nessun relro, nx. Utilizza la funzione write per rivelare l'indirizzo di write (libc) e chiama un one gadget.
Utilizza una stringa di formato per rivelare il canary dallo stack e un buffer overflow per chiamare system (è nella GOT) con l'indirizzo di
/bin/sh
.32 bit, nessun relro, nessun canary, nx, pie. Abusa di un cattivo indicizzazione per rivelare gli indirizzi di libc e heap dallo stack. Abusa del buffer overflow per fare un ret2lib chiamando
system('/bin/sh')
(è necessario l'indirizzo dell'heap per eludere un controllo).
Last updated