hacktricks/binary-exploitation/libc-heap/house-of-roman.md

139 lines
8.3 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# House of Roman
{% hint style="success" %}
AWS Hacking'ı öğrenin ve uygulayın:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCP Hacking'ini öğrenin ve uygulayın: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricks'i Destekleyin</summary>
* [**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.**
</details>
{% 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:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitimi AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCP Hacking'i öğrenin ve uygulayın: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitimi GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricks'i Destekleyin</summary>
* [**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.**
</details>
{% endhint %}