ASLR
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Randomizacija rasporeda adresnog prostora (ASLR) je tehnika bezbednosti koja se koristi u operativnim sistemima za randomizaciju memorijskih adresa koje koriste sistemski i aplikativni procesi. Na taj način, značajno otežava napadaču da predvidi lokaciju specifičnih procesa i podataka, kao što su stek, heap i biblioteke, čime se ublažavaju određene vrste eksploatacija, posebno prelivanja bafera.
Da biste proverili ASLR status na Linux sistemu, možete pročitati vrednost iz /proc/sys/kernel/randomize_va_space
datoteke. Vrednost koja se čuva u ovoj datoteci određuje vrstu ASLR koja se primenjuje:
0: Nema randomizacije. Sve je statično.
1: Konzervativna randomizacija. Deljene biblioteke, stek, mmap(), VDSO stranica su randomizovani.
2: Potpuna randomizacija. Pored elemenata randomizovanih konzervativnom randomizacijom, memorija koja se upravlja putem brk()
je randomizovana.
Možete proveriti ASLR status sledećom komandom:
Da biste onemogućili ASLR, postavite vrednost /proc/sys/kernel/randomize_va_space
na 0. Onemogućavanje ASLR-a se generalno ne preporučuje van testiranja ili debagovanja. Evo kako možete to da uradite:
Možete takođe onemogućiti ASLR za izvršavanje sa:
Da biste omogućili ASLR, možete napisati vrednost 2 u datoteku /proc/sys/kernel/randomize_va_space
. To obično zahteva root privilegije. Omogućavanje potpune randomizacije može se izvršiti sledećom komandom:
Promene napravljene sa echo
komandama su privremene i biće resetovane prilikom ponovnog pokretanja. Da biste promenu učinili trajnom, potrebno je da uredite datoteku /etc/sysctl.conf
i dodate ili izmenite sledeću liniju:
После уређивања /etc/sysctl.conf
, примените промене са:
This will ensure that your ASLR settings remain across reboots.
PaX deli adresni prostor procesa na 3 grupe:
Kod i podaci (inicijalizovani i neinicijalizovani): .text
, .data
, i .bss
—> 16 bita entropije u delta_exec
varijabli. Ova varijabla se nasumično inicijalizuje sa svakim procesom i dodaje se početnim adresama.
Memorija alocirana pomoću mmap()
i deljene biblioteke —> 16 bita, nazvana delta_mmap
.
Stek —> 24 bita, nazvan delta_stack
. Međutim, efektivno koristi 11 bita (od 10. do 20. bajta uključivo), poravnato na 16 bajtova —> Ovo rezultira sa 524,288 mogućih stvarnih adresa steka.
Prethodni podaci su za 32-bitne sisteme i smanjena konačna entropija omogućava zaobilaženje ASLR ponovnim pokušajem izvršavanja iznova i iznova dok eksploatacija ne uspe.
Ako imate dovoljno veliki overflow da smestite veliki NOP sled pre shellcode-a, možete jednostavno brute-force-ovati adrese u steku dok tok ne preskoči neki deo NOP sled-a.
Druga opcija za ovo, u slučaju da overflow nije toliko veliki i da se eksploatacija može pokrenuti lokalno, je moguće dodati NOP sled i shellcode u promenljivu okruženja.
Ako je eksploatacija lokalna, možete pokušati da brute-force-ujete osnovnu adresu libc (korisno za 32bitne sisteme):
Ako napadate udaljeni server, možete pokušati da brute-force-ujete adresu libc
funkcije usleep
, prosledjujući kao argument 10 (na primer). Ako u nekom trenutku serveru treba dodatnih 10s da odgovori, pronašli ste adresu ove funkcije.
U 64-bitnim sistemima entropija je mnogo veća i ovo ne bi trebalo da bude moguće.
Moguće je zauzeti veliki deo steka sa env varijablama i zatim pokušati da zloupotrebite binarni fajl stotine/hiljade puta lokalno da biste ga iskoristili. Sledeći kod pokazuje kako je moguće samo odabrati adresu u steku i svaka nekoliko stotina izvršenja ta adresa će sadržati NOP instrukciju:
/proc/[pid]/stat
)Datoteka /proc/[pid]/stat
procesa je uvek čitljiva za sve i sadrži zanimljive informacije kao što su:
startcode & endcode: Adrese iznad i ispod sa TEXT-om binarnog fajla
startstack: Adresa početka stack-a
start_data & end_data: Adrese iznad i ispod gde se nalazi BSS
kstkesp & kstkeip: Trenutne ESP i EIP adrese
arg_start & arg_end: Adrese iznad i ispod gde su cli argumenti.
env_start &env_end: Adrese iznad i ispod gde su env promenljive.
Dakle, ako je napadač na istom računaru kao i binarni fajl koji se eksploatiše i ovaj binarni fajl ne očekuje prelivanje iz sirovih argumenata, već iz različitog ulaza koji se može kreirati nakon čitanja ove datoteke. Moguće je da napadač dobije neke adrese iz ove datoteke i konstruira ofsete iz njih za eksploataciju.
Za više informacija o ovoj datoteci proverite https://man7.org/linux/man-pages/man5/proc.5.html pretražujući /proc/pid/stat
Izazov je dati leak
Ako dobijete leak (laki CTF izazovi), možete izračunati ofsete iz njega (pretpostavljajući na primer da znate tačnu verziju libc koja se koristi u sistemu koji eksploatišete). Ovaj primer eksploatacije je izvučen iz primera ovde (proverite tu stranicu za više detalja):
ret2plt
Zloupotrebljavajući buffer overflow, bilo bi moguće iskoristiti ret2plt da se exfiltrira adresa funkcije iz libc. Proverite:
Ret2pltFormat Strings Arbitrary Read
Baš kao u ret2plt, ako imate arbitrarnu čitanje putem ranjivosti format stringova, moguće je exfiltrirati adresu libc funkcije iz GOT-a. Sledeći primer je odavde:
Možete pronaći više informacija o Format Strings proizvoljnom čitanju u:
Format StringsPokušajte da zaobiđete ASLR koristeći adrese unutar steka:
Ret2ret & Reo2popMehanizam vsyscall
služi za poboljšanje performansi omogućavajući izvršavanje određenih sistemskih poziva u korisničkom prostoru, iako su oni suštinski deo jezgra. Kritična prednost vsyscall-a leži u njihovim fiksnim adresama, koje nisu podložne ASLR (Randomizacija rasporeda adresnog prostora). Ova fiksna priroda znači da napadači ne zahtevaju ranjivost curenja informacija da bi odredili svoje adrese i koristili ih u eksploataciji.
Međutim, ovde se neće naći super zanimljivi gadgeti (iako je, na primer, moguće dobiti ekvivalent ret;
)
(Sledeći primer i kod su iz ovog izveštaja)
Na primer, napadač može koristiti adresu 0xffffffffff600800
unutar eksploatacije. Dok pokušaj da se direktno skoči na ret
instrukciju može dovesti do nestabilnosti ili rušenja nakon izvršavanja nekoliko gadgeta, skakanje na početak syscall
-a koji pruža sekcija vsyscall može se pokazati uspešnim. Pažljivim postavljanjem ROP gadgeta koji vodi izvršavanje na ovu vsyscall adresu, napadač može postići izvršavanje koda bez potrebe da zaobiđe ASLR za ovaj deo eksploatacije.
Napomena, stoga, kako bi moglo biti moguće obići ASLR koristeći vdso ako je kernel kompajliran sa CONFIG_COMPAT_VDSO, jer adresa vdso neće biti randomizovana. Za više informacija pogledajte:
Ret2vDSOLearn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)