Leaking libc address with ROP
Last updated
Last updated
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)
Pronađite offset prelivanja
Pronađite POP_RDI
gadget, PUTS_PLT
i MAIN
gadgete
Koristite prethodne gadgete da curite adresu u memoriji funkcije puts ili druge libc funkcije i pronađite verziju libc (preuzmite je)
Sa bibliotekom, izračunajte ROP i iskoristite ga
Ovaj tutorijal će iskoristiti kod/binarni fajl predložen u ovom tutorijalu: https://tasteofsecurity.com/security/ret2libc-unknown-libc/ Još korisnih tutorijala: https://made0x78.com/bseries-ret2libc/, https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
Ime fajla: vuln.c
Преузмите експлоит и ставите га у исту директорију као и рањиви бинарни фајл и дајте потребне податке скрипти:
Leaking libc - templateШаблону је потребан офсет пре него што настави са експлоитом. Ако је било који пружен, извршиће потребан код да га пронађе (по подразумеваној вредности OFFSET = ""
):
Izvršite python template.py
GDB konzola će se otvoriti sa programom koji se srušio. Unutar te GDB konzole izvršite x/wx $rsp
da dobijete bajtove koji su trebali da prepišu RIP. Na kraju dobijte offset koristeći python konzolu:
Nakon pronalaženja ofseta (u ovom slučaju 40) promenite OFFSET promenljivu unutar šablona koristeći tu vrednost.
OFFSET = "A" * 40
Drugi način bi bio da se koristi: pattern create 1000
-- izvršiti do ret -- pattern seach $rsp
iz GEF-a.
Sada treba da pronađemo ROP gadžete unutar binarnog fajla. Ovi ROP gadžeti će biti korisni za pozivanje puts
kako bismo pronašli libc koja se koristi, a kasnije za pokretanje konačnog eksploita.
PUTS_PLT
je potreban za pozivanje funkcije puts.
MAIN_PLT
je potreban za ponovo pozivanje main funkcije nakon jedne interakcije da bi se iskoristio overflow ponovo (beskonačni krugovi eksploatacije). Koristi se na kraju svakog ROP-a da ponovo pozove program.
POP_RDI je potreban da se proslijedi parametar pozvanoj funkciji.
U ovom koraku ne morate izvršavati ništa jer će sve biti pronađeno od strane pwntools tokom izvršenja.
Sada je vreme da pronađemo koja verzija libc biblioteke se koristi. Da bismo to uradili, iskoristićemo leak adresu u memoriji funkcije puts
i zatim ćemo pretražiti u kojoj verziji biblioteke se nalazi verzija puts na toj adresi.
Da bi to uradili, najvažnija linija izvršenog koda je:
Ovo će poslati neke bajtove dok prepisivanje RIP nije moguće: OFFSET
.
Zatim, postaviće se adresa gadgeta POP_RDI
tako da će sledeća adresa (FUNC_GOT
) biti sačuvana u registru RDI. To je zato što želimo da pozovemo puts prosljeđujući mu adresu PUTS_GOT
jer je adresa u memoriji funkcije puts sačuvana u adresi na koju pokazuje PUTS_GOT
.
Nakon toga, biće pozvan PUTS_PLT
(sa PUTS_GOT
unutar RDI) tako da će puts pročitati sadržaj unutar PUTS_GOT
(adresa funkcije puts u memoriji) i odštampati ga.
Na kraju, glavna funkcija se ponovo poziva kako bismo mogli ponovo iskoristiti prelivanje.
Na ovaj način smo prevarili funkciju puts da odštampa adresu u memoriji funkcije puts (koja se nalazi u libc biblioteci). Sada kada imamo tu adresu možemo potražiti koja verzija libc se koristi.
Pošto iskorišćavamo neki lokalni binarni fajl, nije potrebno da otkrijemo koja verzija libc se koristi (samo pronađite biblioteku u /lib/x86_64-linux-gnu/libc.so.6
).
Ali, u slučaju udaljenog eksploata, objasniću ovde kako možete to pronaći:
Možete pretražiti koja biblioteka se koristi na veb stranici: https://libc.blukat.me/ Takođe će vam omogućiti da preuzmete otkrivenu verziju libc
Takođe možete uraditi:
$ git clone https://github.com/niklasb/libc-database.git
$ cd libc-database
$ ./get
Ovo će potrajati, budite strpljivi. Za ovo da bi radilo potrebni su nam:
Ime libc simbola: puts
Otkazana libc adresa: 0x7ff629878690
Možemo otkriti koja libc se najverovatnije koristi.
Dobijamo 2 podudaranja (trebalo bi da probate drugo ako prvo ne radi). Preuzmite prvo:
Kopirajte libc iz libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so
u naš radni direktorijum.
U ovom trenutku trebali bismo znati koja se libc biblioteka koristi. Pošto eksploatišemo lokalni binarni fajl, koristiću samo: /lib/x86_64-linux-gnu/libc.so.6
Dakle, na početku template.py
promenite libc promenljivu na: libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #Postavite putanju do biblioteke kada je znate
Davanjem putanje do libc biblioteke, ostatak eksploata će biti automatski izračunat.
Unutar get_addr
funkcije, bazna adresa libc će biti izračunata:
Napomena da konačna libc osnovna adresa mora završavati sa 00. Ako to nije vaš slučaj, možda ste iscurili pogrešnu biblioteku.
Zatim, adresa funkcije system
i adresa do stringa "/bin/sh" će biti izračunate iz osnovne adrese libc i date libc biblioteci.
Na kraju, eksploit za izvršenje /bin/sh će biti pripremljen i poslat:
Hajde da objasnimo ovaj konačni ROP.
Poslednji ROP (rop1
) je ponovo pozvao glavnu funkciju, tako da možemo ponovo iskoristiti overflow (zato je OFFSET
ovde ponovo). Zatim, želimo da pozovemo POP_RDI
koji pokazuje na adresu "/bin/sh" (BINSH
) i pozovemo system funkciju (SYSTEM
) jer će adresa "/bin/sh" biti prosleđena kao parametar.
Na kraju, adresa funkcije exit je pozvana tako da proces izlazi lepo i ne generiše se nikakvo upozorenje.
Na ovaj način će exploit izvršiti _/bin/sh_** shell.**
Takođe možete koristiti ONE_GADGET da dobijete shell umesto korišćenja system i "/bin/sh". ONE_GADGET će pronaći unutar libc biblioteke neki način da dobije shell koristeći samo jednu ROP adresu.
Međutim, obično postoje neka ograničenja, najčešća i lako izbegnuta su kao [rsp+0x30] == NULL
Pošto kontrolišete vrednosti unutar RSP, samo treba da pošaljete još nekoliko NULL vrednosti kako bi se ograničenje izbeglo.
Možete pronaći šablon za iskorišćavanje ove ranjivosti ovde:
Leaking libc - templateAko simbol "main" ne postoji. Tada možete pronaći gde je glavni kod:
и ручно поставите адресу:
Ako binarni fajl ne koristi Puts, trebali biste proveriti da li koristi
sh: 1: %s%s%s%s%s%s%s%s: nije pronađen
Ako pronađete ovu grešku nakon što ste kreirali sve eksploite: sh: 1: %s%s%s%s%s%s%s%s: nije pronađen
Pokušajte da oduzmete 64 bajta od adrese "/bin/sh":
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)