ASLR
Last updated
Jifunze na zoezi la AWS Hacking:Mafunzo ya HackTricks ya Mtaalam wa Timu Nyekundu ya AWS (ARTE) Jifunze na zoezi la GCP Hacking: Mafunzo ya HackTricks ya Mtaalam wa Timu Nyekundu ya GCP (GRTE)
Urambazaji wa Mfumo wa Nafasi ya Anwani kwa Kuchanganyikiwa (ASLR) ni mbinu ya usalama inayotumika katika mifumo ya uendeshaji kwa kuchanganyikiwa nafasi za kumbukumbu zinazotumiwa na michakato ya mfumo na maombi. Kwa kufanya hivyo, inafanya iwe ngumu sana kwa mkaidi kutabiri mahali pa michakato na data maalum, kama vile stack, heap, na maktaba, hivyo kupunguza aina fulani za uvamizi, hasa mlipuko wa ujazo.
Kwa kuangalia hali ya ASLR kwenye mfumo wa Linux, unaweza kusoma thamani kutoka faili ya /proc/sys/kernel/randomize_va_space
. Thamani iliyohifadhiwa kwenye faili hii inaamua aina ya ASLR inayotumiwa:
0: Hakuna kuchanganyikiwa. Kila kitu ni tuli.
1: Kuchanganyikiwa kwa uangalifu. Maktaba zilizoshirikiwa, stack, mmap(), ukurasa wa VDSO zinachanganyikiwa.
2: Kuchanganyikiwa kamili. Mbali na vitu vilivyochanganyikiwa na kuchanganyikiwa kwa uangalifu, kumbukumbu inayosimamiwa kupitia brk()
inachanganyikiwa.
Unaweza kuangalia hali ya ASLR kwa amri ifuatayo:
Ili kulemaza ASLR, weka thamani ya /proc/sys/kernel/randomize_va_space
kuwa 0. Kulemaza ASLR kwa ujumla siyo jambo linalopendekezwa isipokuwa kwenye mazingira ya majaribio au kutatua hitilafu. Hapa ndio jinsi unavyoweza kulimaza:
Unaweza pia kulemaza ASLR kwa utekelezaji na:
Ili kuwezesha ASLR, unaweza kuandika thamani ya 2 kwa faili ya /proc/sys/kernel/randomize_va_space
. Kawaida hii inahitaji mamlaka ya mzizi. Kuwezesha ubadilishaji kamili unaweza kufanywa kwa amri ifuatayo:
Mabadiliko yaliyofanywa kwa kutumia amri za echo
ni ya muda na yatarejeshwa wakati wa kuzimwa upya. Ili kufanya mabadiliko yawe ya kudumu, unahitaji kuhariri faili ya /etc/sysctl.conf
na kuongeza au kuhariri mstari ufuatao:
Baada ya kuhariri /etc/sysctl.conf
, tumia mabadiliko kwa:
Hii itahakikisha mipangilio yako ya ASLR inabaki hata baada ya kuzima na kuanza upya.
PaX inagawa nafasi ya anwani ya mchakato katika makundi 3:
Msimbo na data (iliyoanzishwa na isiyoanzishwa): .text
, .data
, na .bss
—> biti 16 za entropy katika kifaa cha delta_exec
. Kifaa hiki kinaanzishwa kwa nasibu kila mchakato na kuongezwa kwa anwani za awali.
Kumbukumbu iliyotengwa na mmap()
na maktaba zilizoshirikiwa —> biti 16, inayoitwa delta_mmap
.
Stack —> biti 24, inayoitwa delta_stack
. Walakini, inatumia biti 11 kwa ufanisi (kutoka kwa byte ya 10 hadi ya 20 pamoja), imepangwa kwa biti 16 —> Hii inasababisha anwani halisi 524,288 za stack zinazowezekana.
Data iliyotangulia ni kwa mifumo ya biti 32 na entropy ya mwisho iliyopunguzwa inawezesha kupitisha ASLR kwa kujaribu tena na tena hadi shambulio litakapokamilika kwa mafanikio.
Ikiwa una kutosha kwa kutosha kuhifadhi kifuniko kikubwa cha NOP kabla ya msimbo wa kifaa, unaweza tu kufanya nguvu anwani kwenye stack hadi mtiririko ukipita sehemu ya kifuniko cha NOP.
Chaguo lingine kwa hili ikiwa kifurushi sio kikubwa sana na shambulio linaweza kutekelezwa kwa ndani ni kuingiza kifuniko cha NOP na msimbo wa kifaa katika mazingira ya pembejeo.
Ikiwa shambulio ni la ndani, unaweza kujaribu kufanya nguvu kwa anwani ya msingi ya libc (yenye manufaa kwa mifumo ya biti 32):
Kama unashambulia seva ya mbali, unaweza kujaribu kufanya nguvu ya brute kwa anwani ya kazi ya libc
ya usleep
, ukitoa kama hoja 10 (kwa mfano). Ikiwa kwa wakati fulani seva inachukua sekunde 10 zaidi kujibu, umepata anwani ya kazi hii.
Katika mifumo ya 64bit entropy ni kubwa zaidi na hii haipaswi kuwa rahisi.
Inawezekana kuchukua sehemu kubwa ya stack na mazingira ya mazingira na kujaribu kutumia binary mamia/elfu ya mara za kienyeji kuitumia. Msimbo ufuatao unaonyesha jinsi inavyowezekana kuchagua tu anwani kwenye stack na kila utekelezaji wa mamia kadhaa anwani hiyo italeta maagizo ya NOP:
/proc/[pid]/stat
)Faili ya /proc/[pid]/stat
ya mchakato daima inaweza kusomwa na kila mtu na ina taarifa za kuvutia kama vile:
startcode & endcode: Anwani juu na chini ya TEXT ya binary
startstack: Anwani ya kuanza ya stack
start_data & end_data: Anwani juu na chini ambapo BSS iko
kstkesp & kstkeip: Anwani za sasa za ESP na EIP
arg_start & arg_end: Anwani juu na chini ambapo cli arguments ziko.
env_start & env_end: Anwani juu na chini ambapo env variables ziko.
Hivyo, ikiwa mshambuliaji yupo kwenye kompyuta ile ile kama binary inayotumiwa na binary hii haitegemei kujaa kutoka kwa hoja za msingi, bali kutoka kwa ingizo tofauti ambalo linaweza kuundwa baada ya kusoma faili hii. Ni rahisi kwa mshambuliaji kupata baadhi ya anwani kutoka kwenye faili hii na kujenga offsets kutoka kwao kwa ajili ya shambulio.
Kwa habari zaidi kuhusu faili hii angalia https://man7.org/linux/man-pages/man5/proc.5.html ukichunguza /proc/pid/stat
Changamoto ni kutoa uvujaji
Ikiwa umepewa uvujaji (changamoto rahisi za CTF), unaweza kuhesabu offsets kutoka kwake (ukidhani kwa mfano unajua toleo sahihi la libc linalotumiwa kwenye mfumo unaoexploit). Shambulio hili la mfano linachimbuka kutoka kwa mfano kutoka hapa (angalia ukurasa huo kwa maelezo zaidi):
ret2plt
Kwa kutumia kuzidi kwa buffer, ingewezekana kutumia ret2plt kuvuja anwani ya kazi kutoka kwa libc. Angalia:
Soma ya Aina ya Fomati ya Kusoma
Kama ilivyo kwa ret2plt, ikiwa una soma ya aina ya fomati kupitia udhaifu wa fomati za fomati, ni rahisi kuvuja anwani ya kazi ya libc kutoka kwa GOT. Mfano ufuatao ni kutoka hapa:
Unaweza kupata habari zaidi kuhusu Soma za Format Strings za kusoma kwa ujanja katika:
Jaribu kukiuka ASLR kwa kutumia anwani ndani ya stack:
Mfumo wa vsyscall
unatumika kuongeza utendaji kwa kuruhusu wito fulani wa mfumo kutekelezwa katika nafasi ya mtumiaji, ingawa kimsingi ni sehemu ya msingi. Faida kuu ya vsyscalls iko katika anwani zao za kudumu, ambazo hazitawaliwi na ASLR (Usanidi wa Nafasi ya Anwani kwa Bahati). Tabia hii ya kudumu inamaanisha kwamba wachomaji hawahitaji mwanya wa kuvuja kwa habari ili kujua anwani zao na kuzitumia katika shambulio.
Hata hivyo, hakuna vifaa vya kuvutia sana vitakavyopatikana hapa (ingawa kwa mfano inawezekana kupata ret;
sawa)
(Mfano na nambari ifuatayo ni kutoka kwa andiko hili)
Kwa mfano, mchomaji anaweza kutumia anwani 0xffffffffff600800
ndani ya shambulio. Wakati wa kujaribu kuruka moja kwa moja kwa maagizo ya ret
inaweza kusababisha kutokuwa imara au kuzimia baada ya kutekeleza vifaa vichache, kuruka mwanzo wa syscall
iliyotolewa na sehemu ya vsyscall inaweza kufanikiwa. Kwa kuweka kwa uangalifu kifaa cha ROP kinachoongoza utekelezaji kwa anwani hii ya vsyscall, mchomaji anaweza kufikia utekelezaji wa nambari bila kuhitaji kukiuka ASLR kwa sehemu hii ya shambulio.
Tafadhali elewa jinsi inavyowezekana kupita ASLR kwa kudhuru vdso ikiwa kernel imekusanywa na CONFIG_COMPAT_VDSO kwa sababu anwani ya vdso haitakuwa randomized. Kwa maelezo zaidi angalia: