Unsorted Bin Attack

Reading time: 7 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Basic Information

Kwa maelezo zaidi kuhusu nini kilichofanywa na unsorted bin angalia ukurasa huu:

{{#ref}} bins-and-memory-allocations.md {{#endref}}

Orodha zisizo na mpangilio zinaweza kuandika anwani kwa unsorted_chunks (av) katika anwani ya bk ya kipande. Hivyo, ikiwa mshambuliaji anaweza kubadilisha anwani ya bk pointer katika kipande ndani ya unsorted bin, anaweza kuandika anwani hiyo katika anwani yoyote ambayo inaweza kusaidia kuvuja anwani za Glibc au kupita baadhi ya ulinzi.

Kwa hivyo, kimsingi, shambulio hili linaruhusu kweka nambari kubwa katika anwani yoyote. Nambari hii kubwa ni anwani, ambayo inaweza kuwa anwani ya heap au anwani ya Glibc. Lengo la kawaida ni global_max_fast ili kuruhusu kuunda fast bin bins zenye ukubwa mkubwa (na kupita kutoka shambulio la unsorted bin hadi shambulio la fast bin).

tip

Kuangalia mfano uliopewa katika https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle na kutumia 0x4000 na 0x5000 badala ya 0x400 na 0x500 kama ukubwa wa vipande (ili kuepuka Tcache) inawezekana kuona kwamba sasa kosa malloc(): unsorted double linked list corrupted linatokea.

Hivyo, shambulio hili la unsorted bin sasa (pamoja na ukaguzi mwingine) pia linahitaji kuwa na uwezo wa kurekebisha orodha ya viungo viwili ili hii ipitishwe victim->bk->fd == victim au si victim->fd == av (arena), ambayo inamaanisha kwamba anwani ambapo tunataka kuandika lazima iwe na anwani ya kipande bandia katika nafasi yake ya fd na kwamba kipande bandia fd kinaelekeza kwenye arena.

caution

Kumbuka kwamba shambulio hili linaharibu unsorted bin (hivyo ndogo na kubwa pia). Hivyo tunaweza tu kutumia allocations kutoka fast bin sasa (programu ngumu zaidi inaweza kufanya allocations nyingine na kuanguka), na ili kuanzisha hili lazima tuweze kuallocate ukubwa sawa au programu itanguka.

Kumbuka kwamba kuandika global_max_fast kunaweza kusaidia katika kesi hii tukiamini kwamba fast bin itakuwa na uwezo wa kushughulikia allocations nyingine zote hadi exploit ikamilike.

Msimbo kutoka guyinatuxedo unaelezea vizuri sana, ingawa ikiwa unabadilisha mallocs ili kuallocate kumbukumbu kubwa ya kutosha ili usiishie katika Tcache unaweza kuona kwamba kosa lililotajwa hapo awali linaonekana likizuia mbinu hii: malloc(): unsorted double linked list corrupted

Unsorted Bin Infoleak Attack

Hii kwa kweli ni dhana ya msingi sana. Vipande katika unsorted bin vitakuwa na viashiria. Kipande cha kwanza katika unsorted bin kwa kweli kitakuwa na fd na bk viungo vinavyoelekeza sehemu ya arena kuu (Glibc).
Hivyo, ikiwa unaweza kweka kipande ndani ya unsorted bin na kukisoma (tumia baada ya bure) au kuallocate tena bila kuandika angalau 1 ya viashiria ili kisha kusoma hiyo, unaweza kuwa na Glibc info leak.

Shambulio linalofanana lililotumika katika andiko hili, lilikuwa kutumia muundo wa vipande 4 (A, B, C na D - D ni tu kuzuia kuunganishwa na kipande cha juu) hivyo overflow ya byte ya null katika B ilitumika kufanya C ionyeshe kwamba B haijatumika. Pia, katika B data ya prev_size ilibadilishwa hivyo ukubwa badala ya kuwa ukubwa wa B ilikuwa A+B.
Kisha C ilifutwa, na kuunganishwa na A+B (lakini B bado ilikuwa inatumika). Kipande kipya cha ukubwa A kiliallocatishwa na kisha anwani za libc zilivuja zikaandikwa ndani ya B kutoka ambapo zilivuja.

References & Other examples

  • https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap
  • Lengo ni kuandika thamani ya kimataifa iliyo na thamani kubwa kuliko 4869 ili iwezekane kupata bendera na PIE haijawashwa.
  • Inawezekana kuunda vipande vya ukubwa wowote na kuna overflow ya heap yenye ukubwa unaotakiwa.
  • Shambulio linaanza kwa kuunda vipande 3: kipande0 ili kutumia overflow, kipande1 ili kuunguzwa na kipande2 ili kipande cha juu kisijumuishwe na vipande vya awali.
  • Kisha, kipande1 kinafutwa na kipande0 kinavunjwa ili bk pointer ya kipande1 ielekeze: bk = magic - 0x10
  • Kisha, kipande3 kinaundwa kwa ukubwa sawa na kipande1, ambacho kitachochea shambulio la unsorted bin na kubadilisha thamani ya kimataifa, na kufanya iwezekane kupata bendera.
  • https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html
  • Kazi ya kuunganishwa ina udhaifu kwa sababu ikiwa viashiria vyote viwili vilivyopitishwa ni sawa itafanya realloc juu yake na kisha ifute lakini ikirudisha kiashiria kwa eneo hilo lililofutwa ambalo linaweza kutumika.
  • Hivyo, vipande 2 vinaundwa: kipande0 ambacho kitaundwa na mwenyewe na kipande1 ili kuzuia kuunganishwa na kipande cha juu. Kisha, kazi ya kuunganishwa inaitwa na kipande0 mara mbili ambayo itasababisha matumizi baada ya bure.
  • Kisha, kazi ya view inaitwa na index 2 (ambayo ni index ya kipande kilichotumika baada ya bure), ambayo itasababisha kuvuja anwani ya libc.
  • Kadri binary ina kinga za tu malloc ukubwa mkubwa kuliko global_max_fast hivyo hakuna fastbin inatumika, shambulio la unsorted bin litatumika kuandika thamani ya kimataifa global_max_fast.
  • Kisha, inawezekana kuita kazi ya edit na index 2 (kiashiria cha matumizi baada ya bure) na kuandika bk pointer ili ielekeze kwenye p64(global_max_fast-0x10). Kisha, kuunda kipande kipya kutatumia anwani ya bure iliyovunjwa (0x20) itasababisha shambulio la unsorted bin kuandika global_max_fast ambayo ni thamani kubwa sana, kuruhusu sasa kuunda vipande katika fast bins.
  • Sasa shambulio la fast bin linafanywa:
  • Kwanza kabisa inagundulika kwamba inawezekana kufanya kazi na fast vipande vya ukubwa 200 katika eneo la __free_hook:
  • gef➤  p &__free_hook
    

$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000

  • Ikiwa tutafanikiwa kupata kipande cha haraka cha ukubwa 0x200 katika eneo hili, itakuwa inawezekana kuandika kiashiria cha kazi ambacho kitatekelezwa
  • Kwa hili, kipande kipya cha ukubwa 0xfc kinaundwa na kazi ya kuunganishwa inaitwa na kiashiria hicho mara mbili, kwa njia hii tunapata kiashiria kwa kipande kilichofutwa cha ukubwa 0xfc*2 = 0x1f8 katika fast bin.
  • Kisha, kazi ya edit inaitwa katika kipande hiki kubadilisha anwani ya fd ya fast bin hii ili ielekeze kwenye kazi ya awali ya __free_hook.
  • Kisha, kipande chenye ukubwa 0x1f8 kinaundwa ili kupata kutoka fast bin kipande kisichokuwa na matumizi ili kipande kingine cha ukubwa 0x1f8 kiundwe ili kupata kipande cha haraka katika __free_hook ambacho kimeandikwa na anwani ya kazi ya system.
  • Na hatimaye kipande kinachoshikilia mfuatano wa /bin/sh\x00 kinafutwa kwa kuita kazi ya kufuta, ikichochea kazi ya __free_hook ambayo inaelekeza kwenye system na /bin/sh\x00 kama parameter.
  • CTF https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html
  • Mfano mwingine wa kutumia overflow ya 1B kuunganishwa kwa vipande katika unsorted bin na kupata Glibc infoleak na kisha kufanya shambulio la fast bin ili kuandika malloc hook na anwani ya gadget moja
  • Robot Factory. BlackHat MEA CTF 2022
  • Tunaweza tu kuallocate vipande vya ukubwa mkubwa kuliko 0x100.
  • Andika upya global_max_fast kwa kutumia shambulio la Unsorted Bin (inafanya kazi 1/16 kwa sababu ya ASLR, kwa sababu tunahitaji kubadilisha bits 12, lakini lazima tubadilisha bits 16).
  • Shambulio la Fast Bin kubadilisha array ya kimataifa ya vipande. Hii inatoa primitive ya kusoma/kandika isiyo na mipaka, ambayo inaruhusu kubadilisha GOT na kuweka kazi fulani kuelekeza kwenye system.

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks