mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
99 lines
9.4 KiB
Markdown
99 lines
9.4 KiB
Markdown
|
# House of Orange
|
|||
|
|
|||
|
<details>
|
|||
|
|
|||
|
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> ile sıfırdan kahraman olmaya kadar AWS hackleme öğrenin!</summary>
|
|||
|
|
|||
|
HackTricks'ı desteklemenin diğer yolları:
|
|||
|
|
|||
|
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na(https://github.com/sponsors/carlospolop) göz atın!
|
|||
|
* [**Resmi PEASS & HackTricks ürünleri**](https://peass.creator-spring.com)'ni edinin
|
|||
|
* [**PEASS Ailesi**]'ni(https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**]'i(https://opensea.io/collection/the-peass-family) içeren koleksiyonumuz
|
|||
|
* **Discord grubuna** 💬 [**katılın**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)'da **takip edin**.
|
|||
|
* **Hacking püf noktalarınızı paylaşarak** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR göndererek katkıda bulunun.
|
|||
|
|
|||
|
</details>
|
|||
|
|
|||
|
## Temel Bilgiler
|
|||
|
|
|||
|
### Kod
|
|||
|
|
|||
|
* Örnek bir örneği [burada bulabilirsiniz](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c)
|
|||
|
* Saldırı tekniği bu [yamada](https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=stdlib/abort.c;h=117a507ff88d862445551f2c07abb6e45a716b75;hp=19882f3e3dc1ab830431506329c94dcf1d7cc252;hb=91e7cf982d0104f0e71770f5ae8e3faf352dea9f;hpb=0c25125780083cbba22ed627756548efe282d1a0) düzeltildi (2.26'dan önce çalışıyordu)
|
|||
|
* Aynı örnek **daha fazla yorumla** [burada bulunabilir](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
|||
|
|
|||
|
### Amaç
|
|||
|
|
|||
|
* `malloc_printerr` fonksiyonunu kötüye kullanmak
|
|||
|
|
|||
|
### Gereksinimler
|
|||
|
|
|||
|
* Üst parça boyutunu üzerine yaz
|
|||
|
* Libc ve heap sızıntıları
|
|||
|
|
|||
|
### Arka Plan
|
|||
|
|
|||
|
Gerekli arka plan [**bu örneğin**](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html) yorumlarından alınmıştır:
|
|||
|
|
|||
|
Özünde, eski libc sürümlerinde, `malloc_printerr` fonksiyonu çağrıldığında, `_IO_list_all` içinde depolanan `_IO_FILE` yapılarının listesini **dolaşır** ve aslında bu yapıdaki bir komut işaretçisini **çalıştırırdı**.\
|
|||
|
Bu saldırı, **sahte bir `_IO_FILE` yapısı** oluşturacak ve bu yapının `_IO_list_all`'a yazılmasına neden olacak ve `malloc_printerr`'ın çalışmasına neden olacaktır.\
|
|||
|
Daha sonra, **`_IO_FILE`** yapılarının atlamalı tablosunda depolanan herhangi bir adresi **çalıştıracak** ve kod yürüteceğiz.
|
|||
|
|
|||
|
### Saldırı
|
|||
|
|
|||
|
Saldırı, **sıralanmamış parçada** **üst parçayı** elde etmekle başlar. Bu, `malloc`'u mevcut üst parça boyutundan daha büyük ancak **`mmp_.mmap_threshold`**'den (varsayılan olarak 128K) daha küçük bir boyutta çağırarak başarılır, aksi takdirde `mmap` tahsili tetiklenir. Üst parça boyutu değiştirildiğinde, **üst parça + boyutunun** sayfa hizalı olduğundan ve üst parçanın **prev\_inuse** bitinin her zaman ayarlı olduğundan emin olmak önemlidir.
|
|||
|
|
|||
|
Üst parçayı sıralanmamış parçada elde etmek için, üst parçayı oluşturmak için bir parça tahsis edin, üst parça boyutunu değiştirin (tahsis edilen parçada taşma ile) böylece **üst parça + boyutunun** sayfa hizalı ve **prev\_inuse** bitinin ayarlı olduğu bir duruma getirin. Daha sonra, yeni üst parça boyutundan daha büyük bir parça tahsis edin. Üst parçayı sıralanmamış parçaya almak için **asla** `free` çağrılmaz.
|
|||
|
|
|||
|
Eski üst parça şimdi sıralanmamış parçada. İçindeki verileri okuyabiliyorsak (muhtemelen taşmaya neden olan bir zayıflıktan dolayı), libc adreslerini sızdırmak ve **\_IO\_list\_all** adresini almak mümkündür.
|
|||
|
|
|||
|
Sıralanmamış parça saldırısı, taşmadan yararlanarak `topChunk->bk->fwd = _IO_list_all - 0x10` yazarak gerçekleştirilir. Yeni bir parça tahsis edildiğinde, eski üst parça bölünecek ve sıralanmamış parçaya bir işaretçi yazılacaktır. **`_IO_list_all`**'a.
|
|||
|
|
|||
|
Bir sonraki adım, eski üst parça boyutunu küçültmek ve küçük bir parça içine sığacak şekilde ayarlamaktır, özellikle boyutunu **0x61** olarak ayarlamaktır. Bu iki amaçla hizmet eder:
|
|||
|
|
|||
|
1. **Küçük Parça 4'e Ekleme**: `malloc`, sıralanmamış parçayı taradığında ve bu parçayı görürse, boyutu küçük olduğundan onu küçük parça 4'e eklemeye çalışacaktır. Bu, parçanın, **`_IO_list_all`**'ın FD işaretçisinin konumu olan küçük parça 4 listesinin başına gelmesine neden olur, çünkü sıralanmamış parça saldırısıyla **`_IO_list_all`**'a yakın bir adres yazdık.
|
|||
|
2. **Malloc Kontrolünü Tetikleme**: Bu parça boyutu manipülasyonu, `malloc`'un iç kontrolleri yapmasına neden olacaktır. Sahte ileri parçanın boyutunu kontrol ettiğinde, bu boyut sıfır olacağından bir hata tetikler ve `malloc_printerr`'ı çağırır.
|
|||
|
|
|||
|
Küçük parça manipülasyonu, parçanın ileri işaretçisini kontrol etmenizi sağlar. **\_IO\_list\_all** ile çakışma, sahte bir **\_IO\_FILE** yapısı oluşturmak için kullanılır. Yapı, libc'de iç kontrolleri geçen **\_IO_write_base** ve **\_IO_write_ptr** gibi ana alanları içerecek şekilde dikkatlice oluşturulur. Ayrıca, sahte yapı içinde bir atlamalı tablo oluşturulur, burada bir komut işaretçisi, keyfi kodun (örneğin, `system` fonksiyonu) yürütülebileceği adres olarak ayarlanır.
|
|||
|
|
|||
|
Tekniğin geri kalanını özetlemek gerekirse:
|
|||
|
|
|||
|
* **Eski Üst Parçayı Küçült**: Eski üst parçanın boyutunu **0x61** olarak ayarlayarak küçültün.
|
|||
|
* **Sahte `_IO_FILE` Yapısını Kur**: Eski üst parçayla çakışan sahte **\_IO_FILE** yapısını oluşturun ve akış kontrolünü ele geçirin.
|
|||
|
|
|||
|
Bir sonraki adım, şu anda sıralanmamış parçada bulunan eski üst parçayla çakışan sahte bir **\_IO_FILE** yapısı oluşturmaktır. Bu yapının ilk baytları dikkatlice oluşturulur ve yürütülecek bir komuta (örneğin, "/bin/sh") bir işaretçi içerir.
|
|||
|
|
|||
|
Sahte **\_IO_FILE** yapısındaki ana alanlar, `_IO_write_base` ve `_IO_write_ptr` gibi, libc'de iç kontrolleri geçen değerlere ayarlanır. Ayrıca, sahte yapı içinde bir atlamalı tablo oluşturulur, burada bir komut işaretçisi, keyfi kodun yürütülebileceği adres olarak ayarlanır. Genellikle, bu, `system` fonksiyonunun adresi veya kabuk komutlarını yürütebilecek başka bir fonksiyonun adresi olacaktır.
|
|||
|
|
|||
|
Saldırı, `malloc`'un çağrılmasıyla kodun **\_IO_FILE** yapısı üzerinden yürütülmesini tetiklediğinde doruğa ulaşır. Bu, genellikle bir kabukun başlatılmasına veya başka kötü amaçlı bir yükün yürütülmesine neden olabilecek keyfi kod yürütülmesine izin verir.
|
|||
|
|
|||
|
**Saldırının Özeti:**
|
|||
|
|
|||
|
1. **Üst parçayı ayarlayın**: Bir parça tahsis edin ve üst parça boyutunu değiştirin.
|
|||
|
2. **Üst parçayı sıralanmamış parçaya zorla**: Daha büyük bir parça tahsis edin.
|
|||
|
3. **Libc adreslerini sızdırın**: Sıralanmamış parçadan okumak için zayıflıktan yararlanın.
|
|||
|
4. **Sıralanmamış parça saldırısını gerçekleştirin**: Taşma kullanarak **\_IO_list_all**'a yazın.
|
|||
|
5. **Eski üst parçayı küçültün**: Küçük bir parçaya sığacak şekilde boyutunu ayarlayın.
|
|||
|
6. **Sahte \_IO\_FILE yapısını kurun**: Akış kontrolünü ele geçirmek için sahte bir dosya yapısı oluşturun.
|
|||
|
7. **Kod yürütmesini tetikleyin**: Saldırıyı yürütmek ve keyfi kod çalıştırmak için bir parça tahsis edin.
|
|||
|
|
|||
|
Bu yaklaşım, `free` doğrudan çağrılmadan kod yürütme sağlamak için heap yönetimi mekanizmalarını, libc bilgi sızıntılarını ve heap taşmalarını kullanır. Sahte **\_IO_FILE** yapısını dikkatlice oluşturarak ve doğru konuma yerleştirerek, saldırı standart bellek tahsisi işlemleri sırasında kontrol akışını ele geçirebilir. Bu, keyfi kod yürütme olanağı sağlar, genellikle bir kabuk veya diğer kötü amaçlı faaliyetlerin yürütülmesine neden olabilir.
|
|||
|
## Referanslar
|
|||
|
|
|||
|
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/)
|
|||
|
* [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
|||
|
|
|||
|
<details>
|
|||
|
|
|||
|
<summary><strong>AWS hacklemeyi sıfırdan kahraman olmaya öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|||
|
|
|||
|
HackTricks'ı desteklemenin diğer yolları:
|
|||
|
|
|||
|
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
|
|||
|
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
|||
|
* [**The PEASS Family'yi**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
|||
|
* **💬 [**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)**'da takip edin.**
|
|||
|
* **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
|||
|
|
|||
|
</details>
|