House of Roman

Ondersteun HackTricks

Basiese Inligting

Dit was 'n baie interessante tegniek wat RCE moontlik gemaak het sonder lekke via valse fastbins, die unsorted_bin-aanval en relatiewe oorskrywings. Dit is egter gepatch.

Kode

Doel

  • RCE deur relatiewe aanwysers te misbruik

Vereistes

  • Redigeer fastbin- en unsorted bin-aanwysers

  • 12 bits van willekeur moet afgedwing word (0.02% kans) om te werk

Aanvalstappe

Deel 1: Fastbin-stuk wys na __malloc_hook

Skep verskeie stukke:

  • fastbin_victim (0x60, offset 0): UAF-stuk later om die heap-aanwyser later te redigeer om na die LibC-waarde te wys.

  • chunk2 (0x80, offset 0x70): Vir goeie belynig

  • main_arena_use (0x80, offset 0x100)

  • relative_offset_heap (0x60, offset 0x190): relatiewe offset op die 'main_arena_use'-stuk

Vry dan free(main_arena_use) wat hierdie stuk in die ongesorteerde lys plaas en 'n aanwyser na main_arena + 0x68 sal kry in beide die fd en bk aanwysers.

Nou word 'n nuwe stuk toegewys fake_libc_chunk(0x60) omdat dit die aanwysers na main_arena + 0x68 in fd en bk sal bevat.

Dan word relative_offset_heap en fastbin_victim vrygestel.

/*
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 het 'n fd wat na relative_offset_heap wys

  • relative_offset_heap is 'n offset van afstand vanaf fake_libc_chunk, wat 'n aanwyser na main_arena + 0x68 bevat

  • Deur net die laaste byte van fastbin_victim.fd te verander, is dit moontlik om te maak dat fastbin_victim na main_arena + 0x68 wys

Vir die vorige aksies moet die aanvaller in staat wees om die fd-aanwyser van fastbin_victim te wysig.

Dan is main_arena + 0x68 nie so interessant nie, so laat ons dit wysig sodat die aanwyser na __malloc_hook wys.

Let daarop dat __memalign_hook gewoonlik met 0x7f begin en nulle voor dit, dan is dit moontlik om dit te vervals as 'n waarde in die 0x70 vinnige bin. Omdat die laaste 4 bits van die adres willekeurig is, is daar 2^4=16 moontlikhede vir die waarde om te eindig waarin ons belangstel. Dus word 'n BF-aanval hier uitgevoer sodat die blok eindig soos: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23).

(Vir meer inligting oor die res van die bytes, kyk na die verduideliking in die how2heap voorbeeld). As die BF nie werk nie, sal die program net afsluit (begin dus weer totdat dit werk).

Dan word 2 mallocs uitgevoer om die 2 aanvanklike vinnige bin-blokke te verwyder en dan word 'n derde toegewys om 'n blok in die __malloc_hook: te kry.

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

Deel 2: Ongeordende_bin aanval

Vir meer inligting kan jy kyk:

Unsorted Bin Attack

Maar basies maak dit dit moontlik om main_arena + 0x68 na enige plek te skryf deur dit te spesifiseer in chunk->bk. En vir die aanval kies ons __malloc_hook. Dan, nadat ons dit oorskryf het, sal ons 'n relatiewe oorskrywing gebruik om na 'n one_gadget te verwys.

Hiervoor begin ons 'n stuk kry en sit dit in die ongeordende bin:

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);

Gebruik 'n UAF in hierdie stuk om unsorted_bin_ptr->bk te wys na die adres van __malloc_hook (ons het dit vantevore brute force).

Let daarop dat hierdie aanval die ongesorteerde bin beskadig (dus ook klein en groot). Ons kan dus slegs toewysings van die vinnige bin gebruik (‘n meer komplekse program mag ander toewysings doen en laat val), en om dit te trigger moet ons dieselfde grootte toewys anders sal die program val.

Dus, om die skryf van main_arena + 0x68 na __malloc_hook te trigger, voer ons na die instelling van __malloc_hook in unsorted_bin_ptr->bk net die volgende uit: malloc(0x80)

Stap 3: Stel __malloc_hook na system

In stap een het ons beheer oor 'n brokkie wat __malloc_hook bevat (in die veranderlike malloc_hook_chunk) en in die tweede stap het ons daarin geslaag om main_arena + 0x68 hierin te skryf.

Nou misbruik ons 'n gedeeltelike oorskrywing in malloc_hook_chunk om die libc-adres wat ons daar geskryf het (main_arena + 0x68) te gebruik om 'n one_gadget-adres te wys.

Hier is waar dit nodig is om 12 bits van willekeurigheid te brute force (meer inligting in die how2heap voorbeeld).

Laastens, sodra die korrekte adres oorgeskryf is, roep malloc aan en trigger die one_gadget.

Verwysings

Ondersteun HackTricks

Last updated