# House of Roman {% hint style="success" %} AWS Hacking'ı öğrenin ve uygulayın:[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ GCP Hacking'ini öğrenin ve uygulayın: [**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**](https://training.hacktricks.xyz/courses/grte)
HackTricks'i Destekleyin * [**Abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin! * 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) katılın veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.** * **Hacking püf noktalarını paylaşarak PR'ler göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.**
{% endhint %} ## Temel Bilgiler Bu, sızıntısız RCE'ye olanak tanıyan, sahte fastbins, sıralanmamış\_bin saldırısı ve göreceli üzerine yazma ile RCE sağlayan çok ilginç bir teknikti. Ancak [**yamalandı**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c). ### Kod * Örneği [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c) adresinde bulabilirsiniz. ### Amaç * Göreceli işaretçileri kötüye kullanarak RCE ### Gereksinimler * Fastbin ve sıralanmamış bin işaretçilerini düzenleme * 12 bitlik rastgelelik zorunlu olarak kaba kuvvet uygulanmalıdır (%0.02 şansı çalışma) ## Saldırı Adımları ### Adım 1: Fastbin Chunk, \_\_malloc\_hook'a işaret eder Birkaç parça oluşturun: * `fastbin_victim` (0x60, ofset 0): Daha sonra yığın işaretçisini LibC değerine işaret etmek üzere düzenlenecek UAF parçası. * `chunk2` (0x80, ofset 0x70): İyi hizalamak için * `main_arena_use` (0x80, ofset 0x100) * `relative_offset_heap` (0x60, ofset 0x190): 'main\_arena\_use' parçasındaki göreceli ofset Ardından `main_arena_use` serbest bırakılır, bu parçayı sıralanmamış listeye yerleştirir ve hem `fd` hem de `bk` işaretçilerinde `main_arena + 0x68`'e bir işaretçi alır. Şimdi `fd` ve `bk` işaretçilerinde `main_arena + 0x68`'e işaretçiler içereceği için yeni bir parça olan `fake_libc_chunk(0x60)` ayrılmıştır. Ardından `relative_offset_heap` ve `fastbin_victim` serbest bırakılır. ```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` adlı bir `fd`, `relative_offset_heap`'e işaret ediyor * `relative_offset_heap`, `fake_libc_chunk`'tan uzaklık olarak bir ofsete sahiptir ve bu da `main_arena + 0x68`'i işaret eden bir işaretçi içerir * `fastbin_victim.fd`'nin son baytını değiştirerek `fastbin_victim`'ı `main_arena + 0x68`'i işaret edecek şekilde yapmak mümkündür Önceki eylemler için saldırganın, `fastbin_victim`'ın `fd` işaretçisini değiştirebilme yeteneğine sahip olması gerekir. Ardından, `main_arena + 0x68` çok ilginç değildir, bu yüzden işaretçinin **`__malloc_hook`**'u işaret etmesini sağlayacak şekilde değiştirelim. `__memalign_hook` genellikle `0x7f` ile başlar ve ondan önce sıfırlar bulunur, bu nedenle `0x70` hızlı binde bir değer olarak sahteleyebilir. Çünkü adresin son 4 biti **rastgele** olduğundan, adresin istediğimiz yere işaret etmesi için `2^4=16` olasılık vardır. Bu nedenle, bir BF saldırısı burada gerçekleştirilir, böylece parça şu şekilde sonlanır: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.** (Geri kalan baytlar hakkında daha fazla bilgi için [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c) örneğindeki açıklamaya bakın). BF çalışmazsa program çöker (bu yüzden çalışana kadar tekrar başlayın). Ardından, 2 malloc işlemi gerçekleştirilir ve 2 başlangıç ​​hızlı bin parçası kaldırılır ve üçüncüsü, bir parçayı **`__malloc_hook:`**'ta almak için ayrılır. ```c malloc(0x60); malloc(0x60); uint8_t* malloc_hook_chunk = malloc(0x60); ``` ### Bölüm 2: Sıralanmamış\_bin saldırısı Daha fazla bilgi için şu adrese bakabilirsiniz: {% content-ref url="unsorted-bin-attack.md" %} [unsorted-bin-attack.md](unsorted-bin-attack.md) {% endcontent-ref %} Ancak temelde, `chunk->bk` içinde belirtilen konuma `main_arena + 0x68` yazmamızı sağlar. Saldırı için `__malloc_hook`'u seçiyoruz. Sonra, üzerine yazdıktan sonra bir `one_gadget`'a işaret etmek için bir göreceli yazma işlemi kullanacağız. Bunun için bir parça alıp onu **sıralanmamış bin**'e koyarak başlarız: ```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); ``` Bu parçada bir UAF kullanarak `unsorted_bin_ptr->bk`'yi `__malloc_hook` adresine işaret etmek için kullanıyoruz (bu daha önce brute force ile yapıldı). {% hint style="danger" %} Bu saldırı, unsorted bin'i bozar (bu nedenle küçük ve büyük de). Bu nedenle şimdi sadece **hızlı binlerden tahsisleri kullanabiliriz** (daha karmaşık bir program başka tahsisler yapabilir ve çökebilir), bunu tetiklemek için **aynı boyutta tahsis yapmalıyız ya da program çöker.** {% endhint %} Bu nedenle, `__malloc_hook`'u `unsorted_bin_ptr->bk`'ye ayarladıktan sonra `main_arena + 0x68`'e yazmayı tetiklemek için sadece **`malloc(0x80)`** yapmamız gerekiyor. ### Adım 3: \_\_malloc\_hook'u system'e ayarlayın Adım birde `__malloc_hook` içeren bir parçayı kontrol etmeyi bitirdik (değişken `malloc_hook_chunk` içinde) ve ikinci adımda buraya `main_arena + 0x68` yazmayı başardık. Şimdi, `malloc_hook_chunk` içindeki kısmi bir yazmayı kötüye kullanarak oraya yazdığımız libc adresini (`main_arena + 0x68`) kullanarak bir `one_gadget` adresine işaret etmek için. İşte burada **12 bitlik rastgeleliği brute force etmek gerekiyor** (daha fazla bilgi için [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c) [örneğine](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c) bakın). Son olarak, doğru adres üzerine yazıldığında, **`malloc`'ı çağırın ve `one_gadget`'ı tetikleyin**. ## Referanslar * [https://github.com/shellphish/how2heap](https://github.com/shellphish/how2heap) * [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](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/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_roman/) {% hint style="success" %} AWS Hacking'i öğrenin ve uygulayın:[**HackTricks Eğitimi AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ GCP Hacking'i öğrenin ve uygulayın: [**HackTricks Eğitimi GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
HackTricks'i Destekleyin * [**Abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin! * **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) veya [telegram grubuna](https://t.me/peass) katılın veya** bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.** * **Hacking püf noktalarını paylaşarak HackTricks ve HackTricks Cloud github depolarına PR gönderin.**
{% endhint %}