House of Roman

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Osnovne informacije

Ovo je bila veoma interesantna tehnika koja je dozvoljavala RCE bez leak-ova preko lažnih fastbin-ova, unsorted_bin napada i relativnih overwrite‑ova. Međutim, ona je patched.

Primenjivost u 2026

  • glibc window: Radi pouzdano na 2.23–2.27 (how2heap PoC je testirao 2.23–2.25). Počevši od 2.28, patch za “additional checks for unsorted bin integrity” čini unsorted‑bin write nepouzdanim, pa uspeh naglo opada. Od 2.34 nadalje __malloc_hook/__free_hook su uklonjeni, što čini originalni cilj nedostupnim. Koristite ga samo na starim libc verzijama (ili custom build‑ovima koji zadržavaju hook-ove) ili u CTF zadacima koji isporučuju staru libc.
  • Tcache era (≥2.26): Tcache će pojesti vaše 0x70 alokacije i zaustaviti fastbin/unsorted primitive. Onemogućite ga (setenv("GLIBC_TUNABLES","glibc.malloc.tcache_count=0",1);) pre bilo kakve alokacije ili popunite svaki 0x70 tcache bin sa 7 free-ova da ga ispraznite.
  • Safe-linking: Važi za tcache/fastbin u ≥2.32, ali House of Roman zahteva samo delimično prepisivanje pokazivača na adresu u libc-u koja je već prisutna u fd/bk, tako da safe-linking ovde ne pomaže odbrani (napadač nikada ne falsifikuje novi pokazivač). Pravi zaustavljač su uklanjanje hook-ova i provere unsorted-bina.

Kod

Cilj

  • RCE zloupotrebom relativnih pokazivača

Zahtevi

  • Izmena fastbin i unsorted bin pokazivača
  • 12 bitova nasumičnosti mora se brute‑force-ovati (0.02% šanse) da bi napad proradio

Koraci napada

Deo 1: Fastbin Chunk pokazuje na __malloc_hook

Napravite nekoliko chunk-ova:

  • fastbin_victim (0x60, offset 0): UAF chunk koji će kasnije biti izmenjen da heap pokazivač pokazuje na libc vrednost.
  • chunk2 (0x80, offset 0x70): Za dobru poravnanost
  • main_arena_use (0x80, offset 0x100)
  • relative_offset_heap (0x60, offset 0x190): relativni offset na chunk‑u ‘main_arena_use’

Zatim free(main_arena_use) koji će staviti ovaj chunk u unsorted list i postaviće pokazivač na main_arena + 0x68 u oba fd i bk pokazivača.

Sada se alocira novi chunk fake_libc_chunk(0x60) jer će sadržati pokazivače na main_arena + 0x68 u fd i bk.

Zatim se oslobađaju relative_offset_heap i fastbin_victim.

/*
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 ima fd koji pokazuje na relative_offset_heap
  • relative_offset_heap je offset udaljenosti od fake_libc_chunk, koji sadrži pokazivač na main_arena + 0x68
  • Promena poslednjeg bajta fastbin_victim.fd čini da fastbin_victim pokazuje na main_arena + 0x68.

Za prethodne radnje, napadač mora biti u mogućnosti da izmeni fd pokazivač fastbin_victim.

Zatim, main_arena + 0x68 nije toliko interesantan, pa ga modifikujemo tako da pokazivač pokazuje na __malloc_hook.

Imajte u vidu da __memalign_hook obično počinje sa 0x7f i nultim bajtovima pre njega, pa je moguće falsifikovati ga kao vrednost u 0x70 fast binu. Pošto su poslednja 4 bita adrese random, postoji 2^4=16 mogućnosti da se vrednost završi na mestu koje nas zanima. Zato se ovde izvodi BF attack tako da chunk izgleda ovako: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23).

(For more info about the rest of the bytes check the explanation in the how2heap example). If the brute force fails the program just crashes (restart until it works).

Zatim se izvrše 2 mallocs da uklone 2 početna fast bin chunks i treći se alocira da bi se dobio chunk u __malloc_hook.

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

Deo 2: Unsorted_bin attack

Za više informacija pogledajte:

Unsorted Bin Attack

Ali u suštini, to omogućava pisanje main_arena + 0x68 na bilo koju lokaciju koja je specificirana u chunk->bk. Za napad biramo __malloc_hook. Zatim, nakon njegovog prepisivanja, koristićemo relative overwrite da pokazuje na one_gadget.

Za ovo počinjemo da uzimamo chunk i stavljamo ga u unsorted 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);

Use an UAF in this chunk to point unsorted_bin_ptr->bk to the address of __malloc_hook (we brute forced this previously).

Caution

Imajte na umu da ovaj napad korumpira unsorted bin (a time i small i large). Zato sada možemo samo use allocations from the fast bin (kompleksniji program može obaviti druge alokacije i srušiti se), i da bismo ovo pokrenuli moramo alloc the same size or the program will crash.

So, to trigger the write of main_arena + 0x68 in __malloc_hook we perform after setting __malloc_hook in unsorted_bin_ptr->bk we just need to do: malloc(0x80)

Korak 3: Postavite __malloc_hook na system

U prvom koraku kontrolisali smo chunk koji sadrži __malloc_hook (u promenljivoj malloc_hook_chunk) i u drugom koraku smo uspeli da tamo upišemo main_arena + 0x68.

Sada zloupotrebimo partial overwrite u malloc_hook_chunk da iskoristimo libc adresu koju smo tamo upisali (main_arena + 0x68) da pokazuje na one_gadget adresu.

Ovde je potrebno bruteforce 12 bits of randomness (više informacija u how2heap example).

Na kraju, kada je ispravna adresa prepisana, pozovite malloc i aktivirajte one_gadget.

Modern tips & variants

  • Unsorted-bin hardening (2.28+): Extra integrity checks on unsorted chunks (size sanity + list linkage) čine klasični unsorted‑bin write krhkim. Da preživite _int_malloc, morate keep fd/bk links consistent i sizes plausible, što obično zahteva jače primitive nego jednostavan partial overwrite.
  • Hook removal (2.34+): Sa uklonjenim __malloc_hook, adapt the primitive da dospe na bilo koji writable GOT/global koji kasnije možete reuse (npr. overwrite exit@GOT u non-PIE binarima) ili pivot to a House of Pie style top‑chunk hijack da kontrolišete top umesto hook‑a.
  • Any‑address fastbin alloc (romanking98 writeup): Drugi deo pokazuje repairing the 0x71 freelist i korišćenje unsorted‑bin write da se land a fastbin allocation over __free_hook, potom placing system("/bin/sh") i triggering it via free() na libc‑2.24 (pre-hook removal).

References

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks