House of Roman
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die π¬ Discord groep of die telegram groep of volg ons op Twitter π¦ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Basiese Inligting
Dit was βn baie interessante tegniek wat RCE sonder leaks via vals fastbins, die unsorted_bin aanval en relatiewe oorskrywings moontlik gemaak het. Dit is egter gepatch.
Kode
- Jy kan βn voorbeeld vind in https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
Doel
- RCE deur relatiewe punte te misbruik
Vereistes
- Wysig fastbin en unsorted bin punte
- 12 bits van ewekansigheid moet gebruteforceer word (0.02% kans) om te werk
Aanvalstappe
Deel 1: Fastbin Chunk wys na __malloc_hook
Skep verskeie chunks:
fastbin_victim(0x60, offset 0): UAF chunk wat later die heap pointer sal wys na die LibC waarde.chunk2(0x80, offset 0x70): Vir goeie uitlijningmain_arena_use(0x80, offset 0x100)relative_offset_heap(0x60, offset 0x190): relatiewe offset op die βmain_arena_useβ chunk
Dan free(main_arena_use) wat hierdie chunk in die onsorted lys sal plaas en βn pointer na main_arena + 0x68 in beide die fd en bk punte sal kry.
Nou is dit βn nuwe chunk fake_libc_chunk(0x60) toegeken omdat dit die punte 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_victimhet βnfdwat narelative_offset_heapwysrelative_offset_heapis βn offset van afstand vanaffake_libc_chunk, wat βn pointer namain_arena + 0x68bevat- Deur net die laaste byte van
fastbin_victim.fdte verander, is dit moontlik omfastbin_victim pointsnamain_arena + 0x68te laat wys
Vir die vorige aksies moet die aanvaller in staat wees om die fd pointer van fastbin_victim te verander.
Dan is main_arena + 0x68 nie so interessant nie, so laat ons dit verander sodat die pointer na __malloc_hook wys.
Let daarop dat __memalign_hook gewoonlik begin met 0x7f en nulles voor dit, dan is dit moontlik om dit as βn waarde in die 0x70 fast bin te vervals. Omdat die laaste 4 bits van die adres ewekansig is, is daar 2^4=16 moontlikhede vir die waarde om te eindig waar ons belangstel. So βn BF-aanval word hier uitgevoer sodat die chunk eindig soos: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23).
(Vir meer inligting oor die res van die bytes, kyk die verduideliking in die how2heap voorbeeld). As die BF nie werk nie, val die program net in duie (so begin weer totdat dit werk).
Dan word 2 mallocs uitgevoer om die 2 aanvanklike fast bin chunks te verwyder en βn derde een word toegeken om βn chunk in die __malloc_hook: te kry.
malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);
Deel 2: Unsorted_bin aanval
Vir meer inligting kan jy kyk:
Maar basies laat dit jou toe om main_arena + 0x68 na enige plek te skryf soos gespesifiseer in chunk->bk. En vir die aanval kies ons __malloc_hook. Dan, nadat ons dit oorgeskryf het, sal ons βn relatiewe oorskrywing gebruik om na βn one_gadget te wys.
Vir hierdie begin ons om βn chunk te kry en dit in die unsorted bin te plaas:
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 na die adres van __malloc_hook te wys (ons het dit voorheen brute-forced).
Caution
Let daarop dat hierdie aanval die onsorted bin korrupteer (dus klein en groot ook). So ons kan slegs toewysings van die vinnige bin gebruik (n βn meer komplekse program mag ander toewysings doen en crash), en om dit te aktiveer moet ons die dieselfde grootte toewys of die program sal crash.
So, om die skrywe van main_arena + 0x68 in __malloc_hook te aktiveer, voer ons uit nadat ons __malloc_hook in unsorted_bin_ptr->bk gestel het, ons moet net doen: malloc(0x80)
Stap 3: Stel __malloc_hook na system
In die eerste stap het ons βn stuk beheer wat __malloc_hook bevat (in die veranderlike malloc_hook_chunk) en in die tweede stap het ons daarin geslaag om main_arena + 0x68 te skryf.
Nou, ons misbruik βn gedeeltelike oorskrywing in malloc_hook_chunk om die libc adres wat ons daar geskryf het (main_arena + 0x68) te gebruik om na βn one_gadget adres te wys.
Hier is waar dit nodig is om 12 bits van ewekansigheid te brute-force (meer inligting in die how2heap voorbeeld).
Laastens, sodra die korrekte adres oorgeskryf is, roep malloc aan en aktiveer die one_gadget.
Verwysings
- https://github.com/shellphish/how2heap
- https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die π¬ Discord groep of die telegram groep of volg ons op Twitter π¦ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


