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)
Address Space Layout Randomization (ASLR) ni mbinu ya usalama inayotumika katika mifumo ya uendeshaji ili kubadilisha anwani za kumbukumbu zinazotumiwa na michakato ya mfumo na programu. Kwa kufanya hivyo, inafanya kuwa vigumu sana kwa mshambuliaji kutabiri eneo la michakato na data maalum, kama vile stack, heap, na maktaba, hivyo kupunguza aina fulani za mashambulizi, hasa buffer overflows.
Ili kuangalia hali ya ASLR kwenye mfumo wa Linux, unaweza kusoma thamani kutoka kwenye /proc/sys/kernel/randomize_va_space
faili. Thamani iliyohifadhiwa katika faili hii inaamua aina ya ASLR inayotumika:
0: Hakuna kubadilisha. Kila kitu ni cha kudumu.
1: Kubadilisha kwa njia ya kihafidhina. Maktaba zinazoshirikiwa, stack, mmap(), ukurasa wa VDSO zimebadilishwa.
2: Kubadilisha kamili. Mbali na vipengele vilivyobadilishwa kwa njia ya kihafidhina, kumbukumbu inayosimamiwa kupitia brk()
imebadilishwa.
Unaweza kuangalia hali ya ASLR kwa amri ifuatayo:
Ili kuzima ASLR, unapaswa kuweka thamani ya /proc/sys/kernel/randomize_va_space
kuwa 0. Kuzima ASLR kwa ujumla hakupendekezwi nje ya hali za majaribio au urekebishaji. Hapa kuna jinsi unavyoweza kuzikatiza:
Unaweza pia kuzima ASLR kwa utekelezaji na:
Ili kuezesha ASLR, unaweza kuandika thamani ya 2 kwenye faili ya /proc/sys/kernel/randomize_va_space
. Hii kwa kawaida inahitaji ruhusa za mzizi. Kuwezesha randomization kamili kunaweza kufanywa kwa amri ifuatayo:
Mabadiliko yaliyofanywa na amri za echo
ni ya muda na yatarejelewa wakati wa upya. Ili kufanya mabadiliko kuwa ya kudumu, unahitaji kuhariri faili ya /etc/sysctl.conf
na kuongeza au kubadilisha mstari ufuatao:
Baada ya kuhariri /etc/sysctl.conf
, tumia mabadiliko kwa:
This will ensure that your ASLR settings remain across reboots.
PaX inagawanya nafasi ya anwani ya mchakato katika makundi 3:
Msimbo na data (iliyowekwa na isiyowekwa): .text
, .data
, na .bss
—> 16 bits za entropy katika mabadiliko ya delta_exec
. Mabadiliko haya yanaanzishwa kwa bahati nasibu na kila mchakato na kuongezwa kwa anwani za awali.
Kumbukumbu iliyotolewa na mmap()
na maktaba zinazoshirikiwa —> 16 bits, inayoitwa delta_mmap
.
Stack —> 24 bits, inayoitwa delta_stack
. Hata hivyo, inatumia kwa ufanisi 11 bits (kutoka byte ya 10 hadi ya 20 ikiwa ni pamoja), iliyopangwa kwa 16 bytes —> Hii inasababisha 524,288 anwani halisi za stack zinazowezekana.
Data ya awali ni kwa mifumo ya 32-bit na entropy ya mwisho iliyopunguzwa inafanya iwezekane kupita ASLR kwa kujaribu kutekeleza mara kwa mara hadi exploit ikamilike kwa mafanikio.
Ikiwa una overflow kubwa ya kutosha kuhost sled kubwa ya NOP kabla ya shellcode, unaweza tu kujaribu anwani katika stack hadi mtiririko uondoke juu ya sehemu fulani ya sled ya NOP.
Chaguo lingine kwa hili ikiwa overflow si kubwa sana na exploit inaweza kuendeshwa kwa ndani ni kuweza kuongeza sled ya NOP na shellcode katika variable ya mazingira.
Ikiwa exploit ni ya ndani, unaweza kujaribu kujaribu anwani ya msingi ya libc (inayofaa kwa mifumo ya 32bit):
Ikiwa unashambulia seva ya mbali, unaweza kujaribu kuvunjavunja anwani ya kazi ya libc
usleep
, ukipitia kama hoja 10 (kwa mfano). Ikiwa katika 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 inawezekana.
Inawezekana kuchukua sehemu kubwa ya stack na mabadiliko ya mazingira na kisha kujaribu kutumia binary mara mia/elfu kwa ndani ili kuifanyia shambulio. Msimbo ufuatao unaonyesha jinsi inavyowezekana kuchagua tu anwani katika stack na kila mara chache mia za utekelezaji anwani hiyo itakuwa na amri ya NOP:
/proc/[pid]/stat
)Faili /proc/[pid]/stat
la mchakato daima linaweza kusomwa na kila mtu na lina maelezo ya kuvutia kama vile:
startcode & endcode: Anwani juu na chini na TEXT ya binary
startstack: Anwani ya mwanzo wa 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 yuko kwenye kompyuta ile ile na binary inayotumiwa, na binary hii haitarajii overflow kutoka kwa hoja za moja kwa moja, bali kutoka kwa input tofauti ambayo inaweza kuundwa baada ya kusoma faili hii. Inawezekana kwa mshambuliaji kupata anwani kadhaa kutoka kwa faili hii na kujenga offsets kutoka kwao kwa ajili ya exploit.
Kwa maelezo zaidi kuhusu faili hii angalia https://man7.org/linux/man-pages/man5/proc.5.html ukitafuta /proc/pid/stat
Changamoto ni kutoa leak
Ikiwa umepatiwa leak (changamoto rahisi za CTF), unaweza kuhesabu offsets kutoka kwake (ukidhania kwa mfano unajua toleo halisi la libc linalotumika kwenye mfumo unaoshambulia). Mfano huu wa exploit umetolewa kutoka mfano kutoka hapa (angalia ukurasa huo kwa maelezo zaidi):
ret2plt
Kwa kutumia overflow ya buffer, itakuwa inawezekana kutumia ret2plt kuhamasisha anwani ya kazi kutoka libc. Angalia:
Ret2pltFormat Strings Arbitrary Read
Kama ilivyo katika ret2plt, ikiwa una kusoma bila mpangilio kupitia udhaifu wa format strings, inawezekana kuhamasisha anwani ya kazi ya libc kutoka GOT. Mfano ufuatao unatoka hapa:
You can find more info about Format Strings arbitrary read in:
Format StringsJaribu kupita ASLR kwa kutumia anwani ndani ya stack:
Ret2ret & Reo2popMfumo wa vsyscall
unatumika kuboresha utendaji kwa kuruhusu wito fulani wa mfumo kutekelezwa katika nafasi ya mtumiaji, ingawa kimsingi ni sehemu ya kernel. Faida muhimu ya vsyscalls iko katika anwani zao za kudumu, ambazo haziko chini ya ASLR (Randomization ya Mpangilio wa Nafasi ya Anwani). Tabia hii ya kudumu inamaanisha kwamba washambuliaji hawahitaji udhaifu wa kuvuja taarifa ili kubaini anwani zao na kuzitumia katika exploit.
Hata hivyo, hakuna vifaa vya kuvutia sana vitakavyopatikana hapa (ingawa kwa mfano inawezekana kupata sawa na ret;
)
(Mfano ufuatao na msimbo ni kutoka kwa andiko hili)
Kwa mfano, mshambuliaji anaweza kutumia anwani 0xffffffffff600800
ndani ya exploit. Wakati wa kujaribu kuruka moja kwa moja kwenye amri ya ret
kunaweza kusababisha kutokuwa na utulivu au kuanguka baada ya kutekeleza vifaa kadhaa, kuruka kwenye mwanzo wa syscall
inayotolewa na sehemu ya vsyscall inaweza kuwa na mafanikio. Kwa kuweka kwa makini ROP gadget inayofanya utekelezaji kuelekea anwani hii ya vsyscall, mshambuliaji anaweza kufikia utekelezaji wa msimbo bila kuhitaji kupita ASLR kwa sehemu hii ya exploit.
Kumbuka hivyo inaweza kuwa inawezekana kuzidi ASLR kwa kutumia vdso ikiwa kernel imeandikwa na CONFIG_COMPAT_VDSO kwani anwani ya vdso haitakuwa na mabadiliko. Kwa maelezo zaidi angalia:
Ret2vDSOLearn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)