hacktricks/binary-exploitation/heap/unlink-attack.md

11 KiB
Raw Blame History

Unlink Saldırısı

AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

Bu saldırı keşfedildiğinde genellikle bir WWW (Write What Where) izin veriyordu, ancak bazı kontroller eklenmiş ve saldırının yeni versiyonu daha ilginç, daha karmaşık ve anlamsız hale getirilmiştir.

Kod Örneği:

Kod ```c #include #include #include #include

// Altered from d778318b6a/assets/files/unlink_exploit.c to make it work

struct chunk_structure { size_t prev_size; size_t size; struct chunk_structure *fd; struct chunk_structure *bk; char buf[10]; // padding };

int main() { unsigned long long *chunk1, *chunk2; struct chunk_structure *fake_chunk, *chunk2_hdr; char data[20];

// First grab two chunks (non fast) chunk1 = malloc(0x8000); chunk2 = malloc(0x8000); printf("Stack pointer to chunk1: %p\n", &chunk1); printf("Chunk1: %p\n", chunk1); printf("Chunk2: %p\n", chunk2);

// Assuming attacker has control over chunk1's contents // Overflow the heap, override chunk2's header

// First forge a fake chunk starting at chunk1 // Need to setup fd and bk pointers to pass the unlink security check fake_chunk = (struct chunk_structure *)chunk1; fake_chunk->size = 0x8000; fake_chunk->fd = (struct chunk_structure *)(&chunk1 - 3); // Ensures P->fd->bk == P fake_chunk->bk = (struct chunk_structure *)(&chunk1 - 2); // Ensures P->bk->fd == P

// Next modify the header of chunk2 to pass all security checks chunk2_hdr = (struct chunk_structure *)(chunk2 - 2); chunk2_hdr->prev_size = 0x8000; // chunk1's data region size chunk2_hdr->size &= ~1; // Unsetting prev_in_use bit

// Now, when chunk2 is freed, attacker's fake chunk is 'unlinked' // This results in chunk1 pointer pointing to chunk1 - 3 // i.e. chunk1[3] now contains chunk1 itself. // We then make chunk1 point to some victim's data free(chunk2); printf("Chunk1: %p\n", chunk1); printf("Chunk1[3]: %x\n", chunk1[3]);

chunk1[3] = (unsigned long long)data;

strcpy(data, "Victim's data");

// Overwrite victim's data using chunk1 chunk1[0] = 0x002164656b636168LL;

printf("%s\n", data);

return 0; }

</details>

* Saldırı, tcaches kullanıldığında çalışmaz (2.26'dan sonra)

### Amaç

Bu saldırı, **bir parçanın işaretçisini kendisinden 3 adres öncesine işaret edecek şekilde değiştirmeyi** sağlar. Eğer bu yeni konum (işaretçinin bulunduğu yerin çevresi) ilginç şeyler içeriyorsa, diğer kontrol edilebilir tahsisler / yığın gibi..., bunları okuyup/üzerine yazarak daha büyük zarara neden olmak mümkündür.

* Eğer bu işaretçi yığında bulunuyorsa, çünkü şimdi kendisinden 3 adres önceye işaret ediyor ve kullanıcı potansiyel olarak bunu okuyup değiştirebiliyorsa, yığından hassas bilgiler sızdırmak veya hatta geri dönüş adresini (belki) canary'ye dokunmadan değiştirmek mümkün olacaktır
* CTF örneklerinde, bu işaretçi diğer tahsislere işaret eden bir işaretçi dizisinde bulunmaktadır, bu nedenle 3 adres öncesine işaret etmesi ve okuyup yazabilmesi sayesinde diğer işaretçilerin başka adreslere işaret etmesi mümkün olacaktır.\
Potansiyel olarak kullanıcı diğer tahsisleri de okuyup/yazabildiği için bilgi sızdırabilir veya rastgele konumlara yeni adresler üzerine yazabilir (örneğin GOT'ta).

### Gereksinimler

* Bir bellekte (örneğin yığın) bazı kontrol sahibi olmak için bazı özelliklere değerler vererek bir çift parça oluşturmak.
* Sahte parçanın işaretçilerini ayarlamak için yığın sızıntısı.

### Saldırı

* Bir çift parça bulunmaktadır (parça1 ve parça2)
* Saldırgan parça1'in içeriğini ve parça2'nin başlıklarını kontrol eder.
* Parça1'de saldırgan sahte bir parça yapısını oluşturur:
* Korumaları atlatmak için `boyut` alanının doğru olduğundan emin olur, böylece `corrupted size vs. prev_size while consolidating` hatası alınmaz
* ve sahte parçanın `fd` ve `bk` alanları, sahte parçanın depolandığı yer olan parça1 işaretçisinin -3 ve -2 ofsetlerinde bulunan yere işaret eder, böylece `sahte_parça->fd->bk` ve `sahte_parça->bk->fd` gerçek parça1 adresinin bulunduğu bellek (yığın) konumuna işaret eder:

<figure><img src="../../.gitbook/assets/image (1245).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>

* Parça2'nin başlıkları değiştirilir ve önceki parçanın kullanılmadığını ve sahte parçanın içerdiği boyutun boyutunu gösterir.
* İkinci parça serbest bırakıldığında, bu sahte parça bağlantısı kesilir:
* `sahte_parça->fd->bk` = `sahte_parça->bk`
* `sahte_parça->bk->fd` = `sahte_parça->fd`
* Daha önce `sahte_parça->fd->bk` ve `sahte_parça->fd->bk`'nin aynı yere işaret ettiği sağlandı (parça1'in depolandığı yığın konumu, bu nedenle geçerli bir bağlı liste idi). **Her ikisi de aynı yere işaret ettiği için** sadece sonuncu (`sahte_parça->bk->fd = sahte_parça->fd`) **etkili** olacaktır.
* Bu, yığında parça1 işaretçisini yığında kendisinden 3 adres önce depolanan adrese (veya baytlara) **üzerine yazacaktır**.
* Dolayısıyla, bir saldırgan parça1'in içeriğini tekrar kontrol edebilirse, yığının içine **yazabilecektir**, potansiyel olarak canary'yi atlayarak geri dönüş adresini değiştirebilir ve yerel değişkenlerin değerlerini ve işaretçilerini değiştirebilir. Hatta yine parça1'in yığında depolanan adresini saldırgan tekrar kontrol edebilirse, herhangi bir yere yazabilir.
* Bu, **adreslerin yığında depolandığı için** mümkün oldu. Risk ve sömürü, sahte parçanın adreslerinin **nerede depolandığına bağlı olabilir**.

<figure><img src="../../.gitbook/assets/image (1246).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>

## Referanslar

* [https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit](https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit)
* CTF'de bile bir unlink saldırısı bulmak garip olabilir ancak bu saldırının kullanıldığı bazı yazılımlar burada bulunmaktadır:
* CTF örneği: [https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html](https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html)
* Bu örnekte, yığın yerine malloc edilmiş adreslerin bir dizisi bulunmaktadır. Unlink saldırısı, bir parça buraya tahsis edilebilmek için gerçekleştirilir, bu nedenle malloc edilmiş adreslerin dizisinin işaretçilerini kontrol etmek mümkün olur. Ardından, bu adreslerdeki parçaların içeriğini değiştirmeyi sağlayan başka bir işlevsellik vardır, bu da adresleri GOT'a işaret etmeye, işlev adreslerini değiştirmeye ve sızıntılar ve RCE elde etmeye olanak tanır.
* Başka bir CTF örneği: [https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html](https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html)
* Önceki örnekte olduğu gibi, tahsis edilen adreslerin bir dizisi bulunmaktadır. Bir unlink saldırısı gerçekleştirerek, ilk tahsis edilen adresin dizinin başlangıcından birkaç konum öncesine işaret etmesi sağlanabilir ve ardından bu tahsis edilen adres yeni konumda üzerine yazılabilir. Bu nedenle, diğer tahsislerin işaretçileri GOT'a işaret etmek üzere üzerine yazılabilir, libc sızıntısı almak için yazdırılabilir ve ardından atoi GOT'u bir tek seferlik işlev adresiyle değiştirilebilir.
* Unlink saldırısına oldukça benzer bir zayıflığı istismar eden özel malloc ve free işlevleriyle CTF örneği: [https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html)
* Özel malloc'un FD ve BK işaretçilerini kontrol etmeyi sağlayan bir taşma vardır ve bu (özel) serbest bırakılacak. Dahası, yığında exec biti bulunmaktadır, bu nedenle bir yığın adresi sızdırmak ve GOT'tan bir işlevi bir yığın parçasına bir kabuk koduyla işaret etmek mümkündür.

<details>

<summary><strong>Sıfırdan kahraman olmak için AWS hacklemeyi öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

HackTricks'i desteklemenin diğer yolları:

* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family)
* 💬 [**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** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR göndererek paylaşın.

</details>