WWW2Exec - atexit()
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Sasa ni ajabu sana kutumia hii!
atexit()
ni kazi ambayo kazi nyingine zinapewa kama vigezo. Hizi kazi zita tekelezwa wakati wa kutekeleza exit()
au kurudi kwa main.
Ikiwa unaweza kubadilisha anwani ya yoyote ya hizi kazi ili kuelekeza kwenye shellcode kwa mfano, utapata udhibiti wa mchakato, lakini hii kwa sasa ni ngumu zaidi.
Kwa sasa anwani za kazi zitakazotekelezwa zime fichwa nyuma ya muundo kadhaa na hatimaye anwani ambayo inaelekeza si anwani za kazi, bali zime sifishwa kwa XOR na uhamasishaji na funguo za nasibu. Hivyo kwa sasa hii njia ya shambulio si ya manufaa sana angalau kwenye x86 na x64_86.
Kazi ya usimbuaji ni PTR_MANGLE
. Mifumo mingine kama m68k, mips32, mips64, aarch64, arm, hppa... hazitekelezi kazi ya usimbuaji kwa sababu inarudisha kile kile ilichopokea kama pembejeo. Hivyo mifumo hii ingekuwa na uwezo wa kushambuliwa kupitia njia hii.
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 waondoa walioandikishwa.
Ikiwa programu inatoka kupitia _exit()
kazi, itaita exit
syscall na waondoa wa kutoka hawatafanywa. Hivyo, ili kuthibitisha __run_exit_handlers()
inatekelezwa unaweza kuweka breakpoint juu yake.
Kazi muhimu ni (chanzo):
Note how map -> l_addr + fini_array -> d_un.d_ptr
is used to kuhesabu the position of the array ya kazi za kuita.
There are a mchache wa chaguzi:
Overwrite the value of map->l_addr
to make it point to a bandia fini_array
with instructions to execute arbitrary code
Overwrite l_info[DT_FINI_ARRAY]
and l_info[DT_FINI_ARRAYSZ]
entries (which are more or less consecutive in memory), to make them point to a forged Elf64_Dyn
structure that will make again array
point to a memory zone the attacker controlled.
Hii andiko overwrites l_info[DT_FINI_ARRAY]
with the address of a controlled memory in .bss
containing a fake fini_array
. This fake array contains kwanza a one gadget address which will be executed and then the tofauti between in the address of this fake array and the thamani ya map->l_addr
so *array
will point to the fake array.
According to main post of this technique and hii andiko ld.so leave a pointer on the stack that points to the binary link_map
in ld.so. With an arbitrary write it's possible to overwrite it and make it point to a fake fini_array
controlled by the attacker with the address to a one gadget for example.
Following the previous code you can find another interesting section with the code:
Katika kesi hii, itakuwa inawezekana kubadilisha thamani ya map->l_info[DT_FINI]
ikielekeza kwenye muundo wa ElfW(Dyn)
uliofanywa. Pata maelezo zaidi hapa.
__run_exit_handlers
Kama ilivyoelezwa hapa, ikiwa programu inatoka kupitia return
au exit()
, itatekeleza __run_exit_handlers()
ambayo itaita kazi yoyote ya destructor iliyosajiliwa.
Code kutoka _run_exit_handlers()
:
Msimbo kutoka __call_tls_dtors()
:
Kwa kila kazi iliyosajiliwa katika tls_dtor_list
, itachambua kiashiria kutoka cur->func
na kuikalia na hoja cur->obj
.
Kwa kutumia kazi ya tls
kutoka kwa fork ya GEF, inawezekana kuona kwamba kwa kweli dtor_list
iko karibu sana na stack canary na PTR_MANGLE cookie. Hivyo, kwa kujaa kwenye hiyo, itakuwa inawezekana kuandika upya cookie na stack canary.
Kwa kuandika upya PTR_MANGLE cookie, itakuwa inawezekana kuzidi kazi ya PTR_DEMANLE
kwa kuipatia 0x00, itamaanisha kwamba xor
inayotumika kupata anwani halisi ni tu anwani iliyowekwa. Kisha, kwa kuandika kwenye dtor_list
inawezekana kuunganisha kazi kadhaa na anwani ya kazi hiyo na hoja yake.
Hatimaye, zingatia kwamba kiashiria kilichohifadhiwa hakitakuwa kiki xored tu na cookie bali pia kitageuzwa 17 bits:
Hivyo unahitaji kuzingatia hili kabla ya kuongeza anwani mpya.
Pata mfano katika post ya asili.
__run_exit_handlers
Tekniki hii imeelezewa hapa na inategemea tena programu kutoka kwa kuita return
au exit()
hivyo __run_exit_handlers()
inaitwa.
Hebu tuangalie zaidi msimbo wa kazi hii:
The variable f
inashikilia muundo wa initial
na kulingana na thamani ya f->flavor
kazi tofauti zitaanzishwa.
Kulingana na thamani, anwani ya kazi ya kuita itakuwa mahali tofauti, lakini itakuwa demangled kila wakati.
Zaidi ya hayo, katika chaguo ef_on
na ef_cxa
pia inawezekana kudhibiti argument.
Inawezekana kuangalia initial
structure katika kikao cha ufuatiliaji na GEF ikikimbia gef> p initial
.
Ili kutumia hii unahitaji ama leak au kufuta PTR_MANGLE
cookie na kisha kuandika tena kipengee cha cxa
katika initial na system('/bin/sh')
.
Unaweza kupata mfano wa hii katika blogu ya asili kuhusu mbinu.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)