Ret2lib
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:
Ako želite da proverite da li ASLR menja adresu libc-a, možete uraditi sledeće:
Znajući korišćeni libc, takođe je moguće pronaći offset do funkcije
system
pomoću:
Znajući korišćeni libc, takođe je moguće pronaći offset do stringa
/bin/sh
funkcije sa:
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
:
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 ROPTakođe možete pronaći šablon pwntools-a za ovo u:
Leaking libc - templatePoznavanje 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):
Ako napadate udaljeni server, možete pokušati bruteforce-ovati adresu
libc
funkcijeusleep
, 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 Gadgetx86 Ret2lib Primer Koda
U ovom primeru, ASLR bruteforce je integrisan u kod, a ranjivi binarni fajl se nalazi na udaljenom serveru:
Primer koda za x64 Ret2lib
Proverite primer sa:
ROP - Return Oriented ProgramingPrimer 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 - arm64Ret-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):
Ostali primeri i reference
Ret2lib, dajući procuru adresu funkcije u libc-u, koristeći jedan alat
64 bita, ASLR omogućen ali bez PIE-a, prvi korak je popuniti prekoračenje dok se ne dođe do bajta 0x00 kanara, a zatim pozvati puts i procuriti ga. Sa kanarom se kreira ROP alatka za pozivanje puts kako bi procurila adresa puts iz GOT-a, a zatim ROP alatka za pozivanje
system('/bin/sh')
64 bita, ASLR omogućen, bez kanara, prekoračenje steka u glavnoj funkciji iz podfunkcije. ROP alatka za pozivanje puts kako bi procurila adresu puts iz GOT-a, a zatim poziva jedan alat.
64 bita, bez PIE-a, bez kanara, bez relro, nx. Koristi funkciju pisanja za procurivanje adrese pisanja (libc) i poziva jedan alat.
Koristi formatiran string za procurivanje kanara sa steka i prekoračenje bafera za pozivanje sistema (nalazi se u GOT-u) sa adresom
/bin/sh
.32 bita, bez relro-a, bez kanara, nx, pie. Zloupotreba lošeg indeksiranja za procurivanje adresa libc-a i hipa sa steka. Zloupotreba prekoračenja bafera za pozivanje
system('/bin/sh')
preko ret2liba (potrebna je adresa hipa da bi se zaobišla provera).
Last updated