WWW2Exec - atexit()
Last updated
Last updated
Jifunze & zoezi AWS Hacking:Mafunzo ya HackTricks AWS Red Team Expert (ARTE) Jifunze & zoezi GCP Hacking: Mafunzo ya HackTricks GCP Red Team Expert (GRTE)
Leo ni raha sana kuitumia!
atexit()
ni kazi ambayo kazi zingine hupitishwa kama paramita. Hizi kazi zitatekelezwa wakati wa kutekeleza exit()
au kurudi kwa msingi.
Ikiwa unaweza kurekebisha anwani ya mojawapo ya hizi kazi ili ielekee kwenye shellcode kwa mfano, utapata udhibiti wa mchakato, lakini hii ni ngumu zaidi kwa sasa.
Kwa sasa anwani za kazi zitakazotekelezwa zimefichwa nyuma ya miundo kadhaa na mwishowe anwani ambayo inaelekezwa sio anwani za kazi, bali zime fichwa kwa XOR na viondoleo na ufunguo wa nasibu. Kwa hivyo kwa sasa vector huu wa shambulio si muhimu sana angalau kwenye x86 na x64_86.
Kazi ya ufichaji ni PTR_MANGLE
. Miundo mingine kama m68k, mips32, mips64, aarch64, arm, hppa... hawatekelezi kazi ya ufichaji kwa sababu inarejesha sawa na ilivyopokea kama kuingia. Kwa hivyo miundo hii ingeweza kushambuliwa kupitia vector huu.
Unaweza kupata maelezo ya kina juu ya jinsi hii inavyofanya kazi katika https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html
Kama ilivyoelezwa katika chapisho hili, Ikiwa programu inatoka kwa kutumia return
au exit()
itatekeleza __run_exit_handlers()
ambayo itaita wabomoleaji waliosajiliwa.
Ikiwa programu inatoka kupitia kazi ya _exit()
, itaita wito wa mfumo wa exit
na wabomoleaji wa kutoka hawatatekelezwa. Kwa hivyo, kuthibitisha kuwa __run_exit_handlers()
inatekelezwa unaweza kuweka kizuizi cha muda ndani yake.
Msimbo muhimu ni (chanzo):
Tafadhali angalia jinsi map -> l_addr + fini_array -> d_un.d_ptr
inavyotumiwa kukadiria nafasi ya array ya kazi za kuita.
Kuna chaguo kadhaa:
Badilisha thamani ya map->l_addr
ili iweze kuelekeza kwenye fini_array
bandia yenye maagizo ya kutekeleza msimbo wa kupendelea
Badilisha kuingia za l_info[DT_FINI_ARRAY]
na l_info[DT_FINI_ARRAYSZ]
(ambazo ziko karibu kwenye kumbukumbu), ili ziweze kuelekeza kwenye muundo wa Elf64_Dyn
ulioundwa ambao utafanya tena array
ielekee eneo la kumbukumbu linalodhibitiwa na mshambuliaji.
Hii andishi inabadilisha l_info[DT_FINI_ARRAY]
na anwani ya kumbukumbu inayodhibitiwa katika .bss
inayoendelea na fini_array
bandia. Array hii bandia ina kwanza anwani ya gadget moja ambayo itatekelezwa na kisha tofauti kati ya anwani ya array bandia na thamani ya map->l_addr
ili *array
iweze kuelekeza kwenye array bandia.
Kulingana na chapisho kuu la mbinu hii na hii andishi ld.so huacha kidude kwenye stakishi ambacho kinaelekeza kwenye link_map
ya binary katika ld.so. Kwa kuandika kwa hiari inawezekana kuibadilisha na kuifanya ielekee kwenye fini_array
bandia inayodhibitiwa na mshambuliaji na anwani ya gadget moja kwa mfano.
Ukiendelea na msimbo uliopita unaweza kupata sehemu nyingine yenye msimbo wa kuvutia:
Katika kesi hii ingewezekana kubadilisha thamani ya map->l_info[DT_FINI]
ikielekeza kwa muundo wa ElfW(Dyn)
ulioundwa. Pata masharti zaidi hapa.
__run_exit_handlers
Kama ilivyoelezwa hapa, ikiwa programu inaishia kupitia return
au exit()
, itaendesha __run_exit_handlers()
ambayo itaita kazi yoyote ya kuharibu iliyosajiliwa.
Msimbo kutoka _run_exit_handlers()
:
Msimbo kutoka __call_tls_dtors()
:
Kwa kila kazi iliyosajiliwa katika tls_dtor_list
, itatenganisha pointer kutoka kwa cur->func
na kuita na hoja cur->obj
.
Kwa kutumia kazi ya tls
kutoka kwa fork ya GEF hii, ni rahisi kuona kwamba dtor_list
iko karibu sana na stack canary na PTR_MANGLE cookie. Kwa hivyo, kwa kujaza kwa wingi, ingewezekana kubadilisha cookie na stack canary.
Kwa kubadilisha PTR_MANGLE cookie, ingewezekana kupita kwenye kazi ya PTR_DEMANLE
kwa kuweka kwa 0x00, itamaanisha kwamba xor
iliyotumika kupata anwani halisi ni tu anwani iliyoconfigure. Kisha, kwa kuandika kwenye dtor_list
inawezekana kuunganisha kazi kadhaa na kazi ya anwani na hoja yake.
Hatimaye kumbuka kwamba pointer iliyohifadhiwa haitakuwa tu ikifanyiwa xor na cookie lakini pia itazungushwa biti 17:
Kwa hivyo unahitaji kuzingatia hili kabla ya kuongeza anwani mpya.
Pata mfano katika chapisho la asili.
__run_exit_handlers
Mbinu hii imeelezewa hapa na inategemea tena programu kutoka kwa wito wa return
au exit()
hivyo __run_exit_handlers()
inaitwa.
Hebu angalia msimbo zaidi wa kazi hii:
Mbadala f
inaelekeza kwa muundo wa initial
na kulingana na thamani ya f->flavor
kazi tofauti zitaitwa.
Kulingana na thamani, anwani ya kazi ya kuita itakuwa mahali tofauti, lakini itakuwa imefanywa wazi daima.
Zaidi, katika chaguo ef_on
na ef_cxa
pia ni sawa kudhibiti hoja.
Inawezekana kuangalia muundo wa initial
katika kikao cha kutatua matatizo na GEF ikikimbia gef> p initial
.
Kutumia hii unahitaji au kufichua PTR_MANGLE
cookie na kisha kubadilisha kuingia kwa cxa
katika mwanzo na system('/bin/sh')
.
Unaweza kupata mfano wa hii katika chapisho la blogi asilia kuhusu mbinu.