Ret2lib
Last updated
Last updated
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)
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.
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
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:
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
:
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)
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 - templateProverite stranicu https://libc.blukat.me/ i koristite par adresa funkcija unutar libc-a da biste saznali verziju koja se koristi.
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
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.
Izvršite shell skočivši na jednu određenu adresu u libc-u:
One GadgetU ovom primeru, ASLR bruteforce je integrisan u kod, a ranjivi binarni fajl se nalazi na udaljenom serveru:
Proverite primer sa:
ROP - Return Oriented ProgramingU 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 - arm64Ovo 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.
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):
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).