hacktricks/binary-exploitation/libc-heap/unsorted-bin-attack.md

89 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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.

# Sıralanmamış Bin Saldırısı
<details>
<summary><strong>AWS hacklemeyi sıfırdan kahraman olmaya öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile!</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 alın**](https://peass.creator-spring.com)
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) 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>
## Temel Bilgiler
Sıralanmamış bir liste, bir parçanın `bk` adresindeki `sıralanmamış_parçalar (av)` adresini yazabilmektedir. Bu nedenle, bir saldırgan bir parçadaki `bk` işaretçisinin adresini değiştirebilirse, bu adresi rastgele bir adrese yazabilir ve bu, bir libc adresini sızdırmak veya bazı savunmaları atlamak için yardımcı olabilir.
Yani, temelde bu saldırı, **bazı rastgele adresleri büyük bir sayıyla üzerine yazmaya izin verdi** (bir heap adresi veya bir libc adresi olabilecek bir adres) ve sızdırılabilecek bir yığın adresi veya global değişken gibi bazı kısıtlamaları (örneğin **`global_max_fast`**) geçmek için hızlı binlerle daha büyük boyutlarda hızlı binler oluşturmaya izin vermek için bir sıralanmamış bin saldırısından hızlı bir bin saldırısına geçmeye olanak tanır.
{% hint style="success" %}
[https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle) adresinde sağlanan örneğe bakarak ve 0x400 ve 0x500 yerine 0x4000 ve 0x5000 kullanarak (tcaches'i önlemek için) günümüzde **`malloc(): sıralanmamış çift bağlantılı liste bozuldu`** hatasının tetiklendiğini görebilirsiniz.
Bu nedenle, bu sıralanmamış bin saldırısı artık (diğer kontroller arasında) çift bağlantılı listeyi düzeltme yeteneğine de sahip olmalıdır, böylece bu, `victim->bck->fd == victim` veya `victim->fd == av (arena)` olmalıdır. Bu, yazmak istediğimiz adresin, sahte parçanın `fd` konumunda sahte parçanın adresini ve sahte parçanın `fd`'sinin arenaya işaret etmesi gerektiği anlamına gelir.
{% endhint %}
{% hint style="danger" %}
Bu saldırının sıralanmamış binleri (küçük ve büyük olanları da) bozduğunu unutmayın. Bu nedenle şimdi sadece **hızlı binlerden tahsisleri kullanabiliriz** (daha karmaşık bir program başka tahsisler yapabilir ve çökebilir) ve bunu tetiklemek için **aynı boyutta tahsis yapmalıyız veya program çökecektir.**
Bu durumda **`global_max_fast`** yapmak, hızlı binin tüm diğer tahsislerle ilgileneceğine güvenmek bu durumda yardımcı olabilir ve saldırı tamamlandığında hızlı bir bin saldırısına geçmek mümkün olacaktır.
{% endhint %}
[**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) tarafından sağlanan kod bunu çok iyi açıklıyor, ancak malloc'ları tcache'e sona ermemesi için yeterince büyük bellek ayırmak için değiştirirseniz, önce bahsedilen hata ortaya çıkar ve bu tekniği engeller: **`malloc(): sıralanmamış çift bağlantılı liste bozuldu`**
## Sıralanmamış Bin Bilgi Sızdırma Saldırısı
Bu aslında çok temel bir kavramdır. Sıralanmamış bindeki parçalar, bin oluşturmak için çift işaretçilere sahip olacaklardır. Sıralanmamış bindeki ilk parça aslında **FD** ve **BK** bağlantılarını **ana arenanın (libc)** bir kısmına işaret edecek şekilde olacaktır.\
Bu nedenle, bir parçayı sıralanmamış bir bine yerleştirebilir ve onu okuyabilirsiniz (kullanımdan sonra serbest bırakma) veya en azından 1 işaretçiyi üzerine yazmadan tekrar tahsis edebilir ve ardından onu okuyabilirseniz, bir **libc bilgi sızıntısı** elde edebilirsiniz.
Bu yazıda kullanılan benzer bir [**saldırı**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html), 4 parçalı bir yapıyı (A, B, C ve D - D yalnızca üst parçayla birleşmeyi önlemek için) kötüye kullanmaktı, böylece B'de bir null bayt taşması kullanılarak C'nin B'nin kullanılmadığını göstermesi sağlandı. Ayrıca, B'de `prev_size` verisi değiştirildi, böylece boyut B'nin boyutu değil, A+B oldu.\
Ardından C serbest bırakıldı ve A+B ile birleştirildi (ancak B hala kullanımda idi). A boyutunda yeni bir parça tahsis edildi ve ardından sızdırılan libc adresleri B'ye yazıldı ve oradan sızdırıldı.
## Referanslar ve Diğer Örnekler
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap)
* Amacı, bir global değişkeni 4869'dan büyük bir değerle üzerine yazmak ve bayrağı almak ve PIE etkin değil.
* Keyfi boyutlarda parçalar oluşturulabilir ve istenen boyutta bir yığın taşması vardır.
* Saldırı, 3 parça oluşturarak başlar: taşmayı kötüye kullanmak için chunk0, taşmayla karşılaşacak chunk1 ve önceki parçaların birleşmesini önlemek için chunk2.
* Ardından, chunk1 serbest bırakılır ve chunk0 taşarılır, böylece chunk1'in `bk` işaretçisi şuna işaret eder: `bk = magic - 0x10`
* Ardından, chunk1 ile aynı boyutta chunk3 tahsis edilir, bu da sıralanmamış bin saldırısını tetikleyecek ve global değişkenin değerini değiştirecek ve bayrağı almayı mümkün kılacaktır.
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html)
* Birleştirme işlevi, geçilen her iki dizin de aynı olduğunda onu yeniden boyutlandıracağı ve ardından serbest bırakacağı ancak o serbest bırakılan bölgeye bir işaretçi döndüreceği için savunmasızdır.
* Bu nedenle, **2 parça oluşturulur**: **chunk0** kendisiyle birleştirilecek ve üst parçayla birleşmesini önlemek için chunk1. Ardından, **birleştirme işlevi chunk0 ile iki kez çağrılır**, bu da kullanımdan sonra serbest bırakma hatasına neden olur.
* Ardından, **`view`** işlevi kullanımdan sonra serbest bırakılan parçanın dizini olan 2 ile çağrılır, bu da bir libc adresi sızdırır.
* Binanın sadece **`global_max_fast`**'tan büyük boyutlarda malloc yapmasına izin veren korumaları olduğundan, hızlı bin kullanılmaz, bu nedenle sıralanmamış bin saldırısı, global değişken `global_max_fast`'ın üzerine yazılmasında kullanılacaktır.
* Ardından, kullanımdan sonra serbest bırakılan işaretçi olan dizin 2 ile edit işlevi çağrılabilir ve `bk` işaretçisinin `p64(global_max_fast-0x10)`'a işaret etmesi sağlanabilir. Ardından, yeni bir parça oluşturulduğunda önceki tehlikeye atıfta bulunan serbest bırakma adresi (0x20) kullanılacak ve **sıralanmamış bin saldırısı tetiklenecek** ve `global_max_fast`'ı çok büyük bir değerle üzerine yazarak artık hızlı binlerde parçalar oluşturulabilecektir.
* Şimdi bir **hızlı bin saldırısı** gerçekleştirilir:
* İlk olarak, **200 boyutunda hızlı parçalarla çalışılabileceği** ve **`__free_hook`** konumunda olduğu keşfedilir:
* <pre class="language-c"><code class="lang-c">gef➤ p &#x26;__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 &#x3C;__free_hook>
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
</strong>0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6076f &#x3C;list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f &#x3C;_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
</code></pre>
* Bu konumda 0x200 boyutunda hızlı bir parça elde edebilirsek, yürütülecek bir işaretçiyi üzerine yazmak mümkün olacaktır
* Bunun için, boyutu `0xfc` olan yeni bir parça oluşturulur ve birleştirilmiş işlev bu işaretçiyle iki kez çağrılır, bu şekilde hızlı bir parçada boyutu `0xfc*2 = 0x1f8` olan bir serbest bırakılmış parçanın işaretçisine ulaşılır.
* Ardından, bu parçada **`fd`** adresini önceki **`__free_hook`** işlevine işaret etmek için düzenleme işlevi çağrılır.
* Daha sonra, hızlı parçadan önceki gereksiz parçayı almak için boyutu `0x1f8` olan bir parça oluşturulur, böylece **`__free_hook`** içinde **`system`** işlevinin adresiyle üzerine yazılmış bir hızlı parça parçası alınır.
* Ve son olarak, `/bin/sh\x00` dizesini içeren bir parça serbest bırakılarak silme işlevi çağrılır, **`__free_hook`** işlevini tetikleyerek `/bin/sh\x00` parametresiyle sistem işlevine işaret eder.
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
* Unsorted binde bir 1B taşma kullanarak parçaları birleştirme ve bir libc bilgi sızıntısı alarak ardından malloc kancasını bir tek araç adresiyle üzerine yazmak için hızlı parça saldırısı gerçekleştirmenin başka bir örneği
<details>
<summary><strong>AWS hacklemeyi sıfırdan kahraman seviyesine öğ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**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family)
* 💬 **Discord grubuna** katılın [**Discord group**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) 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 paylaşın.
</details>