House of Roman

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Temel Bilgiler

Bu, fake fastbins, unsorted_bin attack ve relative overwrites yoluyla leak olmadan RCE sağlayan çok ilginç bir teknikti. Ancak patched.

2026’de Uygulanabilirlik

  • glibc window: 2.23–2.27 arasında güvenilir şekilde çalışır (how2heap PoC 2.23–2.25’i test etti). 2.28’den itibaren, “additional checks for unsorted bin integrity” yaması unsorted‑bin yazısını güvenilmez hale getirir, bu yüzden başarı oranı keskin şekilde düşer. 2.34 ve sonrasında __malloc_hook/__free_hook kaldırıldı, bu da orijinal hedefi kullanılamaz hale getirir. Sadece eski libc’lerde (veya hook’ları tutan özel derlemelerde) veya eski bir libc ile gelen CTF challenge’ları için kullanın.
  • Tcache era (≥2.26): Tcache 0x70 tahsislerinizi tüketecek ve fastbin/unsorted primitive’lerini durduracaktır. Bunu herhangi bir tahsisten önce devre dışı bırakın (setenv("GLIBC_TUNABLES","glibc.malloc.tcache_count=0",1);) veya her 0x70 tcache bin’ini boşaltmak için 7 free ile doldurun.
  • Safe-linking: ≥2.32’de tcache/fastbin’e uygulanır, ancak House of Roman yalnızca fd/bk içinde zaten bulunan bir libc adresinin partial pointer overwrite of a libc address already present in fd/bk’sine ihtiyaç duyar, bu yüzden safe-linking savunmacıya burada yardımcı olmaz (saldırgan asla yeni bir pointer sahtelemiyor). Gerçek engel hook kaldırılması ve unsorted-bin kontrolleridir.

Kod

Amaç

  • relative pointers’ı kötüye kullanarak RCE

Gereksinimler

  • fastbin ve unsorted bin pointer’larını düzenleyebilme
  • 12 bitlik rastgelelik kaba kuvvetle çözülmeli (çalışma ihtimali %0.02)

Saldırı Adımları

Bölüm 1: Fastbin Chunk points to __malloc_hook

Birkaç chunk oluşturun:

  • fastbin_victim (0x60, offset 0): Daha sonra heap pointer’ını LibC değerine işaret edecek şekilde düzenlemek için UAF chunk.
  • chunk2 (0x80, offset 0x70): İyi hizalama için
  • main_arena_use (0x80, offset 0x100)
  • relative_offset_heap (0x60, offset 0x190): ‘main_arena_use’ chunk üzerinde relative offset

Sonra free(main_arena_use) — bu işlem bu chunk’ı unsorted listesine yerleştirir ve fd ile bk pointer’larının her ikisine de main_arena + 0x68 adresini koyar.

Şimdi fake_libc_chunk(0x60) adlı yeni bir chunk tahsis edilir çünkü bu chunk fd ve bk içinde main_arena + 0x68 pointer’larını içerecektir.

Sonra relative_offset_heap ve fastbin_victim free edilir.

/*
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’in fd’si relative_offset_heap’i işaret eder
  • relative_offset_heap, fake_libc_chunk’ten olan bir offset’tir; bu chunk içinde main_arena + 0x68’e işaret eden bir pointer bulunur
  • fastbin_victim.fd’nin son baytını değiştirmek fastbin_victim’in main_arena + 0x68’e işaret etmesini sağlar.

Önceki işlemler için, saldırganın fastbin_victim’in fd pointer’ını değiştirebiliyor olması gerekir.

Sonra, main_arena + 0x68 çok ilginç olmadığı için, pointer’ı __malloc_hook’a işaret edecek şekilde değiştiriyoruz.

Not: __memalign_hook genellikle 0x7f ile başlar ve öncesinde sıfırlar bulunur; bu yüzden onu 0x70 fast bin içindeki bir değer olarak sahtelemek mümkündür. Adresin son 4 biti random olduğundan, değerin ilgilendiğimiz yere işaret etmesi için 2^4=16 olasılık vardır. Bu yüzden burada bir BF attack gerçekleştirilir; chunk şöyle biter: 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). Brute force başarısız olursa program çöküyor (çalışana kadar yeniden başlatın).

Sonra, ilk 2 fast bin chunk’ını temizlemek için 2 tane malloc yapılır ve üçüncü bir malloc ile __malloc_hook içinde bir chunk elde edilir.

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

Bölüm 2: Unsorted_bin attack

Daha fazla bilgi için şuna bakabilirsiniz:

Unsorted Bin Attack

Ama temelde bu, chunk->bk tarafından belirtilen herhangi bir konuma main_arena + 0x68 yazılmasına izin verir. Saldırı için __malloc_hook’u seçiyoruz. Onu overwrite ettikten sonra, bir one_gadget’e işaret edecek şekilde relative overwrite kullanacağız.

Bunun için önce bir chunk alıp bunu unsorted bin’e koyuyoruz:

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

Note that this attack corrupts the unsorted bin (hence small and large too). So we can only use allocations from the fast bin now (a more complex program might do other allocations and crash), and to trigger this we must 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)

Step 3: Set __malloc_hook to system

Adım 1’de __malloc_hook içeren bir chunk’ı kontrol ediyorduk (değişken malloc_hook_chunk) ve ikinci adımda oraya main_arena + 0x68 yazdırmayı başardık.

Şimdi, malloc_hook_chunk üzerindeki bir partial overwrite’ı kötüye kullanarak oraya yazdığımız libc adresini (main_arena + 0x68) bir one_gadget adresine işaret ettirmek için kullanıyoruz.

Burada 12 bit rastgeleliği bruteforce etmemiz gerekiyor (daha fazla bilgi için how2heap örneğine bakın).

Son olarak, doğru adres overwrite edildikten sonra malloc çağırın ve one_gadget’i tetikleyin.

Modern tips & variants

  • Unsorted-bin hardening (2.28+): Unsorted chunk’lar üzerindeki ekstra bütünlük kontrolleri (boyut denetimi + liste bağlantısı) klasik unsorted‑bin write’ını kırılgan hâle getirir. _int_malloc’ı atlatabilmek için fd/bk bağlantılarını tutarlı ve boyutları makul tutmanız gerekir; bu genellikle basit bir partial overwrite’dan daha güçlü primitive’ler gerektirir.
  • Hook removal (2.34+): __malloc_hook kaldırıldığında, primitive’i daha sonra tekrar kullanabileceğiniz herhangi bir yazılabilir GOT/global üzerine konumlanacak şekilde uyarlayın (ör. non-PIE ikili dosyalarda exit@GOT’u overwrite etmek) veya bir House of Pie tarzı top‑chunk kaçırmasına pivot yaparak hook yerine top’u kontrol edin.
  • Any‑address fastbin alloc (romanking98 writeup): İkinci kısım 0x71 freelist’ini onarmayı ve unsorted‑bin write’ını kullanarak bir fastbin allocation’ını __free_hook üzerine getirmeyi, ardından system("/bin/sh") koyup bunu libc‑2.24 (hook kaldırılmadan önce) üzerinde free() ile tetiklemeyi gösterir.

References

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin