ASLR
Osnovne Informacije
Randomizacija rasporeda adresnog prostora (ASLR) je sigurnosna tehnika korišćena 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 određenih procesa i podataka, kao što su stek, hip i biblioteke, čime se umanjuje određene vrste eksploatacija, posebno prelivanje bafera.
Provera Statusa ASLR-a
Da biste proverili status ASLR-a na Linux sistemu, možete pročitati vrednost iz datoteke /proc/sys/kernel/randomize_va_space
. Vrednost sačuvana u ovoj datoteci određuje vrstu primenjene ASLR:
0: Bez randomizacije. Sve je statično.
1: Konzervativna randomizacija. Deljeni biblioteke, stek, mmap(), VDSO stranica su randomizovani.
2: Potpuna randomizacija. Pored elemenata randomizovanih konzervativnom randomizacijom, memorija upravljana putem
brk()
je randomizovana.
Možete proveriti status ASLR-a pomoću sledeće komande:
Onemogućavanje ASLR-a
Da biste onemogućili ASLR, postavite vrednost /proc/sys/kernel/randomize_va_space
na 0. Onemogućavanje ASLR-a generalno se ne preporučuje osim u testnim ili debagirajućim scenarijima. Evo kako to možete onemogućiti:
Takođe možete onemogućiti ASLR za izvršavanje sa:
Omogućavanje ASLR-a
Za omogućavanje ASLR-a, možete upisati vrednost 2 u datoteku /proc/sys/kernel/randomize_va_space
. Obično je potrebno imati privilegije root korisnika. Omogućavanje potpune randomizacije može se postići sledećom komandom:
Upornost preko ponovnog pokretanja
Promene napravljene pomoću echo
komandi su privremene i biće resetovane prilikom ponovnog pokretanja. Da biste napravili promenu postojanom, morate urediti datoteku /etc/sysctl.conf
i dodati ili izmeniti sledeću liniju:
Nakon uređivanja /etc/sysctl.conf
, primenite promene pomoću:
Ovo će osigurati da vaše ASLR postavke ostanu nepromenjene nakon ponovnog pokretanja.
Bypass-ovi
Brute-force napadi za 32 bitne sisteme
PaX deli prostor adresa procesa u 3 grupe:
Kod i podaci (inicijalizovani i neinicijalizovani):
.text
,.data
, i.bss
—> 16 bitova entropije u promenljivojdelta_exec
. Ova promenljiva se nasumično inicijalizuje sa svakim procesom i dodaje se početnim adresama.Memorija alocirana pomoću
mmap()
i deljeni bibliotekama —> 16 bitova, nazvanodelta_mmap
.Stek —> 24 bita, nazvan
delta_stack
. Međutim, efektivno koristi 11 bitova (od 10. do 20. bajta uključujući), poravnato na 16 bajtova —> Ovo rezultira u 524,288 mogućih stvarnih adresa steka.
Prethodni podaci su za 32-bitne sisteme i smanjena konačna entropija omogućava zaobilaženje ASLR-a pokušavanjem izvršavanja sve dok eksploatacija ne uspe.
Ideje za brute-force napade:
Ako imate dovoljno veliko preplavljivanje da biste mogli da postavite veliki NOP sled pre shell koda, možete jednostavno brute-force adrese na steku dok tok preskoči neki deo NOP sleda.
Druga opcija za ovo u slučaju da preplavljivanje nije toliko veliko i eksploatacija može da se pokrene lokalno je moguće dodati NOP sled i shell kod u promenljivu okruženja.
Ako je eksploatacija lokalna, možete pokušati brute-force osnovnu 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 potroši 10 sekundi da odgovori, pronašli ste adresu ove funkcije.
Na 64-bitnim sistemima entropija je mnogo veća i ovo ne bi trebalo da bude moguće.
Bruteforce-ovanje steka na 64 bita
Moguće je zauzeti veliki deo steka sa env promenljivama i zatim pokušati zloupotrebiti binarni fajl stotine/hiljade puta lokalno da bi ga iskoristili. Sledeći kod pokazuje kako je moguće samo izabrati adresu na steku i svakih nekoliko stotina izvršavanja ta adresa će sadržati NOP instrukciju:
Lokalne informacije (/proc/[pid]/stat
)
/proc/[pid]/stat
)Datoteka /proc/[pid]/stat
procesa uvek je čitljiva za sve i sadrži zanimljive informacije kao što su:
startcode i endcode: Adrese iznad i ispod sa TEXT delom binarnog fajla
startstack: Adresa početka steka
start_data i end_data: Adrese iznad i ispod gde se nalazi BSS
kstkesp i kstkeip: Trenutne adrese ESP i EIP
arg_start i arg_end: Adrese iznad i ispod gde se nalaze CLI argumenti
env_start i env_end: Adrese iznad i ispod gde se nalaze okružne promenljive.
Stoga, ako je napadač na istom računaru kao binarni fajl koji se eksploatiše i taj binarni fajl ne očekuje prekoračenje iz sirovih argumenata, već iz drugog ulaza koji može biti oblikovan nakon čitanja ove datoteke. Moguće je da napadač dobije neke adrese iz ove datoteke i konstruiše ofsete iz njih za eksploataciju.
Za više informacija o ovoj datoteci pogledajte https://man7.org/linux/man-pages/man5/proc.5.html tražeći /proc/pid/stat
Imajući curenje
Izazov je dati curenje
Ako vam je dato curenje (jednostavni 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 sa ovog mesta (proverite tu stranicu za više detalja):
ret2plt
Zloupotrebom preliva bafera bilo bi moguće iskoristiti ret2plt da bi se izvukla adresa funkcije iz libc-a. Proverite:
pageRet2pltProizvoljno čitanje formatiranih stringova
Baš kao i u ret2plt, ako imate proizvoljno čitanje putem ranjivosti formatiranih stringova, moguće je izvući adresu libc funkcije iz GOT-a. Sledeći primer je odavde:
Možete pronaći više informacija o proizvoljnom čitanju formatnih stringova u:
pageFormat StringsRet2ret & Ret2pop
Pokušajte zaobići ASLR zloupotrebom adresa unutar steka:
pageRet2ret & Reo2popvsyscall
Mehanizam vsyscall
služi za poboljšanje performansi omogućavajući određenim sistemskim pozivima da se izvrše u korisničkom prostoru, iako su oni suštinski deo jezgra. Ključna prednost vsyscall leži u njihovim fiksnim adresama, koje nisu podložne ASLR (Randomizacija rasporeda prostora adresa). Ova fiksna priroda znači da napadači ne zahtevaju ranjivost curenja informacija da bi odredili njihove adrese i koristili ih u eksploataciji.
Međutim, ovde neće biti pronađeni super interesantni gedžeti (iako je na primer moguće dobiti ekvivalent ret;
)
(Sledeći primer i kod su iz ovog writeupa)
Na primer, napadač može koristiti adresu 0xffffffffff600800
unutar eksploatacije. Dok pokušaj skoka direktno na ret
instrukciju može dovesti do nestabilnosti ili rušenja nakon izvršavanja nekoliko gedžeta, skakanje na početak syscall
koji pruža odeljak vsyscall može biti uspešno. Pažljivim postavljanjem ROP gedžeta koji vodi izvršavanje na ovu adresu vsyscall, napadač može postići izvršenje koda bez potrebe za zaobilaženjem ASLR za ovaj deo eksploatacije.
vDSO
Zato obratite pažnju kako bi bilo moguće zaobići ASLR zloupotrebom vdso-a ako je kernel kompajliran sa CONFIG_COMPAT_VDSO jer adresa vdso-a neće biti randomizovana. Za više informacija pogledajte:
pageRet2vDSOLast updated