mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
139 lines
8.3 KiB
Markdown
139 lines
8.3 KiB
Markdown
# 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 %}
|