ASLR
Taarifa Msingi
Urambazaji wa Mfumo wa Nafasi ya Anwani kwa Kuchanganywa (ASLR) ni mbinu ya usalama inayotumiwa katika mifumo ya uendeshaji kwa kuchanganya nafasi za anwani 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.
Kuangalia Hali ya ASLR
Ku kuchunguza 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 kuchanganywa. Kila kitu ni tuli.
1: Kuchanganywa kwa uangalifu. Maktaba zilizoshirikiwa, stack, mmap(), ukurasa wa VDSO zinachanganywa.
2: Kuchanganywa kikamilifu. Mbali na vitu vilivyochanganywa na kuchanganywa kwa uangalifu, kumbukumbu inayosimamiwa kupitia
brk()
inachanganywa.
Unaweza kuangalia hali ya ASLR kwa amri ifuatayo:
Kulemaza ASLR
Ili kulemaza ASLR, weka thamani ya /proc/sys/kernel/randomize_va_space
kuwa 0. Kulemaza ASLR kwa ujumla haipendekezwi isipokuwa katika mazingira ya majaribio au kutatua hitilafu. Hapa ndivyo unavyoweza kulemaza:
Unaweza pia kulemaza ASLR kwa utekelezaji na:
Kuwezesha ASLR
Ili kuwezesha ASLR, unaweza kuandika thamani ya 2 kwa faili ya /proc/sys/kernel/randomize_va_space
. Kawaida hii inahitaji ruhusa ya msingi. Kuwezesha ubadilishaji kamili unaweza kufanywa kwa amri ifuatayo:
Uthabiti Kupitia Kuzimwa Upya
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 kuzimwa na kuzimwa upya.
Kupitisha
Kufanya nguvu kwa biti 32
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 chadelta_exec
. Kifaa hiki kinaanzishwa kwa nasibu kila mchakato na kuongezwa kwa anwani za awali.Kumbukumbu iliyotengwa na
mmap()
na maktaba zilizoshirikiwa —> biti 16, inayoitwadelta_mmap
.Mtungo —> biti 24, inayoitwa
delta_stack
. Walakini, inatumia biti 11 kwa ufanisi (kutoka kwa byte ya 10 hadi ya 20 pamoja), imepangwa kwa byte 16 —> Hii inasababisha anwani halisi 524,288 za mtungo.
Data iliyotangulia ni kwa mifumo ya biti 32 na entropy ya mwisho iliyopunguzwa inawezesha kudukua ASLR kwa kujaribu tena na tena hadi shambulio litakapokamilika kwa mafanikio.
Mawazo ya kufanya nguvu:
Ikiwa una kutosha kwa kutosha kuhifadhi kifuniko kikubwa cha NOP kabla ya msimbo wa kabati, unaweza tu kufanya nguvu anwani kwenye mtungo hadi mchakato unapovuka sehemu ya kifuniko cha NOP.
Chaguo lingine kwa hili ikiwa kifurushi sio kikubwa sana na shambulio linaweza kutekelezwa kwa ndani ni kuzingatia kifuniko cha NOP na msimbo wa kabati katika mazingira ya pembejeo.
Ikiwa shambulio ni la ndani, unaweza kujaribu kufanya nguvu anwani ya msingi ya libc (yenye manufaa kwa mifumo ya biti 32):
Kama unashambulia seva ya mbali, unaweza kujaribu kuvunja nguvu anwani ya kazi ya
libc
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 biti 64 entropy ni kubwa zaidi na hili halipaswi kuwa rahisi.
Kuvunja nguvu ya steki ya biti 64
Inawezekana kujaza sehemu kubwa ya steki na mazingira ya mazingira na kisha jaribu kutumia mbinu ya binary mamia/elfu ya mara kwa kujaribu kuitumia. Msimbo ufuatao unaonyesha jinsi inavyowezekana kuchagua tu anwani kwenye steki na kila baada ya utekelezaji wa mamia, anwani hiyo italeta maagizo ya NOP:
Taarifa za Kitaaluma (/proc/[pid]/stat
)
/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 kuanzia 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 hii binary haitegemei kujaa kutoka kwa hoja za msingi, bali kutoka kwa ingizo lingine ambalo linaweza kutengenezwa 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
Kuwa na Uvuvi
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 limechimbuka kutoka kwenye mfano kutoka hapa (angalia ukurasa huo kwa maelezo zaidi):
ret2plt
Kwa kutumia kujaza kijazo cha buffer, ingewezekana kutumia ret2plt kuvuja anwani ya kazi kutoka kwa libc. Angalia:
pageRet2pltSoma Takataka za Aina ya Fomati
Kama ilivyo kwa ret2plt, ikiwa una soma takataka za aina ya fomati kupitia udhaifu wa fomati za aina niwezekanavyo kuvuja anwani ya kazi ya libc kutoka kwa GOT. Mfano ufuatao unapatikana hapa:
Unaweza kupata habari zaidi kuhusu Soma za Format Strings za kusoma kwa ujanja katika:
pageFormat StringsRet2ret & Ret2pop
Jaribu kukiuka ASLR kwa kutumia anwani ndani ya stack:
pageRet2ret & Reo2popvsyscall
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 sawa na ret;
)
(Mfano na msimbo ufuatao ni kutoka kwenye andiko hili)
Kwa mfano, mchomaji anaweza kutumia anwani 0xffffffffff600800
ndani ya shambulio. Wakati jaribio la kuruka moja kwa moja kwenye maagizo ya ret
linaweza kusababisha kutokuwa imara au kuharibika 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 kwenye anwani hii ya vsyscall, mchomaji anaweza kufikia utekelezaji wa nambari bila kuhitaji kukiuka ASLR kwa sehemu hii ya shambulio.
vDSO
Kumbuka hivyo inaweza kuwa iwezekanavyo kupita ASLR kwa kudhuru vdso ikiwa kernel imekusanywa na CONFIG_COMPAT_VDSO kwa sababu anwani ya vdso haitakuwa randomized. Kwa maelezo zaidi angalia:
pageRet2vDSOLast updated