House of Roman

Reading time: 5 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

Hii ilikuwa mbinu ya kuvutia sana ambayo iliruhusu RCE bila leaks kupitia fake fastbins, shambulio la unsorted_bin na overwrites za relative. Hata hivyo imekuwa patched.

Code

Goal

  • RCE kwa kutumia pointers za relative

Requirements

  • Hariri fastbin na pointers za unsorted bin
  • Bits 12 za randomness lazima zishindwe (0.02% nafasi) kufanya kazi

Attack Steps

Part 1: Fastbin Chunk points to __malloc_hook

Unda chunks kadhaa:

  • fastbin_victim (0x60, offset 0): UAF chunk baadaye kuhariri pointer ya heap ili kuelekeza kwenye thamani ya LibC.
  • chunk2 (0x80, offset 0x70): Kwa usawa mzuri
  • main_arena_use (0x80, offset 0x100)
  • relative_offset_heap (0x60, offset 0x190): offset ya relative kwenye chunk ya 'main_arena_use'

Kisha free(main_arena_use) ambayo itaweka chunk hii kwenye orodha isiyo na mpangilio na itapata pointer kwa main_arena + 0x68 katika pointers za fd na bk.

Sasa imepewa chunk mpya fake_libc_chunk(0x60) kwa sababu itakuwa na pointers kwa main_arena + 0x68 katika fd na bk.

Kisha relative_offset_heap na fastbin_victim zinachukuliwa.

c
/*
Current heap layout:
0x0:   fastbin_victim       - size 0x70
0x70:  alignment_filler     - size 0x90
0x100: fake_libc_chunk      - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main        - size 0x20
0x190: relative_offset_heap - size 0x70

bin layout:
fastbin:  fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
  • fastbin_victim ina fd inayoelekeza kwenye relative_offset_heap
  • relative_offset_heap ni offset ya umbali kutoka fake_libc_chunk, ambayo ina pointer kwa main_arena + 0x68
  • Kubadilisha byte ya mwisho ya fastbin_victim.fd inawezekana kufanya fastbin_victim points kwa main_arena + 0x68

Kwa hatua za awali, mshambuliaji anahitaji kuwa na uwezo wa kubadilisha pointer ya fd ya fastbin_victim.

Kisha, main_arena + 0x68 si ya kuvutia sana, hivyo hebu tuibadilishe ili pointer iwe inelekeza kwenye __malloc_hook.

Kumbuka kwamba __memalign_hook kwa kawaida huanza na 0x7f na sifuri kabla yake, kisha inawezekana kuificha kama thamani katika fast bin ya 0x70. Kwa sababu bits 4 za mwisho za anwani ni random kuna 2^4=16 uwezekano wa thamani kumalizia kuonyesha kile tunachovutiwa nacho. Hivyo shambulio la BF linafanywa hapa ili chunk iwe kama: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23).

(Kwa maelezo zaidi kuhusu byte zingine angalia maelezo katika how2heap mfano). Ikiwa BF haitafanya kazi programu inanguka tu (hivyo anza tena hadi ifanye kazi).

Kisha, mallocs 2 zinafanywa kuondoa chunks 2 za awali za fast bin na ya tatu inapatikana ili kupata chunk katika __malloc_hook:

c
malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);

Sehemu ya 2: Unsorted_bin shambulio

Kwa maelezo zaidi unaweza kuangalia:

{{#ref}} unsorted-bin-attack.md {{#endref}}

Lakini kimsingi inaruhusu kuandika main_arena + 0x68 kwenye eneo lolote lililoainishwa katika chunk->bk. Na kwa shambulio tunachagua __malloc_hook. Kisha, baada ya kuandika tena, tutatumia kuandika tena kwa uwiano) kuashiria one_gadget.

Kwa hili tunaanza kupata chunk na kuuweka kwenye unsorted bin:

c
uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate

puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);

Tumia UAF katika kipande hiki kuonyesha unsorted_bin_ptr->bk kwa anwani ya __malloc_hook (tulifanya brute force hii hapo awali).

caution

Kumbuka kwamba shambulio hili linaharibu unsorted bin (hivyo ndogo na kubwa pia). Hivyo tunaweza tu kutumia allocations kutoka kwa fast bin sasa (programu ngumu zaidi inaweza kufanya allocations nyingine na kuanguka), na ili kuamsha hii lazima tufanye alloc saizi sawa au programu itanguka.

Hivyo, ili kuamsha kuandika main_arena + 0x68 katika __malloc_hook tunafanya baada ya kuweka __malloc_hook katika unsorted_bin_ptr->bk tunahitaji tu kufanya: malloc(0x80)

Hatua ya 3: Weka __malloc_hook kwa mfumo

Katika hatua ya kwanza tulimaliza kudhibiti kipande kinachoshikilia __malloc_hook (katika variable malloc_hook_chunk) na katika hatua ya pili tulifanikiwa kuandika main_arena + 0x68 hapa.

Sasa, tunatumia kuandika sehemu katika malloc_hook_chunk kutumia anwani ya libc tuliyoandika hapo (main_arena + 0x68) ili kuonyesha anwani ya one_gadget.

Hapa ndipo inahitajika bruteforce bits 12 za randomness (maelezo zaidi katika how2heap mfano).

Hatimaye, moja anwani sahihi ikishandikwa, ita malloc na kuamsha one_gadget.

Marejeo

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