
Costruisci un database degli offset di libc per semplificare lo sfruttamento
libc-database ha ora un servizio web e un frontend. Visita https://libc.rip/ per provarlo! Leggi https://github.com/niklasb/libc-database/tree/master/searchengine se sei interessato all'API.
Se si verificano errori, controlla la sezione "Requisiti" qui sotto.
Scarica le categorie di libc desiderate ed estrai gli offset dei simboli. Non scaricherà nulla due volte, quindi puoi anche usarlo per aggiornare il tuo database:
$ ./get # Elenca le categorie
$ ./get ubuntu debian # Scarica le libc di Ubuntu e Debian, vecchio comportamento predefinito
$ ./get all # Scarica tutte le categorie. Potrebbe richiedere del tempo!
Puoi anche aggiungere una libc personalizzata al tuo database.
$ ./add /usr/lib/libc-2.21.so
Trova tutte le libc nel database che hanno i nomi forniti agli indirizzi forniti. Vengono controllati solo gli ultimi 12 bit perché la randomizzazione di solito funziona a livello di dimensione di pagina.
$ ./find printf 260 puts f30
archive-glibc (libc6_2.19-10ubuntu2_i386)
Trova una libc dall'indirizzo di ritorno trapelato in __libc_start_main.
$ ./find __libc_start_main_ret a83
ubuntu-trusty-i386-libc6 (libc6_2.19-0ubuntu6.6_i386)
archive-eglibc (libc6_2.19-0ubuntu6_i386)
ubuntu-utopic-i386-libc6 (libc6_2.19-10ubuntu2.3_i386)
archive-glibc (libc6_2.19-10ubuntu2_i386)
archive-glibc (libc6_2.19-15ubuntu2_i386)
Estrai alcuni offset utili, dato un ID libc. Puoi anche fornire i tuoi nomi da estrarre.
$ ./dump libc6_2.19-0ubuntu6.6_i386
offset___libc_start_main_ret = 0x19a83
offset_system = 0x00040190
offset_dup2 = 0x000db590
offset_recv = 0x000ed2d0
offset_str_bin_sh = 0x160a24
Verifica se una libreria è già presente nel database.
$ ./identify /usr/lib/libc.so.6
local-f706181f06104ef6c7008c066290ea47aa4a82c5
Oppure trova una libc usando un hash (attualmente sono implementati BuildID, MD5, SHA1 e SHA256):
$ ./identify bid=ebeabf5f7039f53748e996fc976b4da2d486a626
libc6_2.17-93ubuntu4_i386
$ ./identify md5=af7c40da33c685d67cdb166bd6ab7ac0
libc6_2.17-93ubuntu4_i386
$ ./identify sha1=9054f5cb7969056b6816b1e2572f2506370940c4
libc6_2.17-93ubuntu4_i386
$ ./identify sha256=8dc102c06c50512d1e5142ce93a6faf4ec8b6f5d9e33d2e1b45311aef683d9b2
libc6_2.17-93ubuntu4_i386
Scarica tutte le librerie corrispondenti a un ID libc.
$ ./download libc6_2.23-0ubuntu10_amd64
Getting libc6_2.23-0ubuntu10_amd64
-> Location: http://security.ubuntu.com/ubuntu/pool/main/g/glibc/libc6_2.23-0ubuntu10_amd64.deb
-> Downloading package
-> Extracting package
-> Package saved to libs/libc6_2.23-0ubuntu10_amd64
$ ls libs/libc6_2.23-0ubuntu10_amd64
ld-2.23.so ... libc.so.6 ... libpthread.so.0 ...
Per eseguire questi script, avrai bisogno dei seguenti comandi nel tuo PATH:
Oltre ai requisiti basati su RPM, avrai bisogno di:
Oltre ai requisiti basati su Debian, avrai bisogno di:
Per installare tutto su Debian 10, esegui questi comandi:
apt-get update
apt-get install -y \
binutils file \
wget \
rpm2cpio cpio \
zstd jq