Translated ['binary-exploitation/heap/unlink-attack.md', 'binary-exploit

This commit is contained in:
Translator 2024-06-11 23:19:48 +00:00
parent 5d07be5a23
commit 95a790ca7a
2 changed files with 42 additions and 29 deletions

View file

@ -93,41 +93,46 @@ return 0;
### Doel
* Wysig 'n aanwysing na 'n stuk in die stapel sodat dit na die stapel wys, sodat dit moontlik is om die inhoud van die stapel te verander deur in die stuk te skryf
Hierdie aanval maak dit moontlik om **'n aanwyser na 'n blok te verander om 3 adresse voor homself te wys**. As hierdie nuwe ligging (omgewing waar die aanwyser geleë was) interessante dinge bevat, soos ander beheerbare toekenning / stapel..., is dit moontlik om hulle te lees/oor te skryf om 'n groter skade te veroorsaak.
* As hierdie aanwyser in die stapel geleë was, omdat dit nou 3 adresse voor homself wys en die gebruiker dit moontlik kan lees en wysig, sal dit moontlik wees om sensitiewe inligting uit die stapel te lek of selfs die terugkeeradres (miskien) te wysig sonder om die kanarie aan te raak
* In CTF-voorbeelde is hierdie aanwyser geleë in 'n reeks aanwysers na ander toekenning, daarom, deur dit 3 adresse voor te maak en dit te kan lees en skryf, is dit moontlik om die ander aanwysers na ander adresse te laat wys.\
Aangesien die gebruiker moontlik ook die ander toekenning kan lees/skryf, kan hy inligting lek of nuwe adresse in willekeurige ligginge oorskryf (soos in die GOT).
### Vereistes
* Sekere beheer in 'n geheue (bv. stapel) om 'n paar stukke te skep wat waardes aan sommige van die eienskappe gee.
* Stapel lek om die aanwysers van die valse stuk te stel.
* Beheer oor 'n geheue (bv. stapel) om 'n paar blokke te skep wat waardes aan 'n paar van die eienskappe gee.
* Stapellek om die aanwysers van die vals blok in te stel.
### Aanval
* Daar is 'n paar stukke (stuk1 en stuk2)
* Die aanvaller beheer die inhoud van stuk1 en die koppe van stuk2.
* In stuk1 skep die aanvaller die struktuur van 'n valse stuk:
* Daar is 'n paar blokke (blok1 en blok2)
* Die aanvaller beheer die inhoud van blok1 en die koppe van blok2.
* In blok1 skep die aanvaller die struktuur van 'n vals blok:
* Om beskermings te omseil, maak hy seker dat die veld `grootte` korrek is om die fout te vermy: `corrupted size vs. prev_size while consolidating`
* en velde `fd` en `bk` van die valse stuk wys na waar stuk1 se aanwyser gestoor word met 'n verskuiwings van -3 en -2 onderskeidelik sodat `fake_chunk->fd->bk` en `fake_chunk->bk->fd` na 'n posisie in die geheue (stapel) wys waar die werklike stuk1-adres geleë is:
* en velde `fd` en `bk` van die vals blok wys na waar blok1 se aanwyser gestoor word met 'n afsetting van -3 en -2 onderskeidelik sodat `fake_chunk->fd->bk` en `fake_chunk->bk->fd` na 'n posisie in die geheue (stapel) wys waar die werklike blok1-adres geleë is:
<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>
* Die koppe van stuk2 word gewysig om aan te dui dat die vorige stuk nie gebruik word nie en dat die grootte die grootte van die valse stuk bevat.
* Wanneer die tweede stuk vrygelaat word, gebeur hierdie valse stuk word ontkoppel:
* Die koppe van blok2 word gewysig om aan te dui dat die vorige blok nie gebruik word nie en dat die grootte die grootte van die vals blok bevat.
* Wanneer die tweede blok vrygelaat word, gebeur hierdie vals blok wat ontkoppel:
* `fake_chunk->fd->bk` = `fake_chunk->bk`
* `fake_chunk->bk->fd` = `fake_chunk->fd`
* Voorheen is daar gemaak dat `fake_chunk->fd->bk` en `fake_chunk->fd->bk` na dieselfde plek wys (die plek in die stapel waar `stuk1` gestoor was, sodat dit 'n geldige gekoppelde lys was). Aangesien **beide na dieselfde plek wys** sal slegs die laaste een (`fake_chunk->bk->fd = fake_chunk->fd`) **effek** hê.
* Dit sal die aanwyser na stuk1 in die stapel **oorheers na die adres (of bytes) wat 3 adresse voor in die stapel gestoor is**.
* Daarom, as 'n aanvaller die inhoud van stuk1 weer kan beheer, sal hy in staat wees om **binne die stapel te skryf** en moontlik die terugkeeradres oorskryf deur die kanarie te vermy en die waardes en punte van plaaslike veranderlikes te wysig. Selfs deur weer die adres van stuk1 wat in die stapel gestoor is na 'n ander plek te wys waar as die aanvaller weer die inhoud van stuk1 kan beheer, sal hy oral kan skryf.
* Let daarop dat dit moontlik was omdat die **adresse in die stapel gestoor is**. Die risiko en uitbuiting kan afhang van **waar die adresse na die valse stuk gestoor word**.
* Voorheen is daar gemaak dat `fake_chunk->fd->bk` en `fake_chunk->fd->bk` na dieselfde plek wys (die ligging in die stapel waar `blok1` gestoor was, sodat dit 'n geldige gekoppelde lys was). Aangesien **beide na dieselfde ligging wys**, sal slegs die laaste een (`fake_chunk->bk->fd = fake_chunk->fd`) **effek** hê.
* Dit sal **die aanwyser na blok1 in die stapel oorskryf na die adres (of bytes) wat 3 adresse voor in die stapel gestoor is**.
* Daarom, as 'n aanvaller die inhoud van blok1 weer kan beheer, sal hy binne die stapel kan skryf en moontlik die terugkeeradres oorskryf deur die kanarie te vermy en die waardes en aanwysers van plaaslike veranderlikes te wysig. Selfs deur weer die adres van blok1 wat in die stapel gestoor is na 'n ander ligging te wys waar as die aanvaller weer die inhoud van blok1 kan beheer, sal hy oral kan skryf.
* Let daarop dat dit moontlik was omdat die **adresse in die stapel gestoor is**. Die risiko en uitbuiting kan afhang van **waar die adresse na die vals blok gestoor word**.
<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>
## Verwysings
* [https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit](https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit)
* Alhoewel dit vreemd sou wees om 'n unlink-aanval selfs in 'n CTF te vind, hier het jy 'n paar write-ups waar hierdie aanval gebruik is:
* Alhoewel dit vreemd sou wees om 'n ontkoppelingsaanval selfs in 'n CTF te vind, hier is 'n paar skrywes waar hierdie aanval gebruik is:
* CTF-voorbeeld: [https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html](https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html)
* In hierdie voorbeeld is daar in plaas van die stapel 'n reeks malloc'ed adresse. Die unlink-aanval word uitgevoer om 'n stuk hier toe te ken, sodat dit moontlik is om die aanwysers van die reeks malloc'ed adresse te beheer. Dan is daar 'n ander funksionaliteit wat dit moontlik maak om die inhoud van stukke in hierdie adresse te wysig, wat dit moontlik maak om adresse na die GOT te wys, funksie-adresse te wysig om lekke en RCE te kry.
*
* In hierdie voorbeeld is daar in plaas van die stapel 'n reeks malloc'ed adresse. Die ontkoppelingsaanval word uitgevoer om 'n blok hier te kan toeken, en dus die aanwysers van die reeks malloc'ed adresse te beheer. Dan is daar 'n ander funksionaliteit wat dit moontlik maak om die inhoud van blokke in hierdie adresse te wysig, wat dit moontlik maak om adresse na die GOT te wys, funksieadresse te wysig om lekke en RCE te kry.
* 'n Ander CTF-voorbeeld: [https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html](https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html)
* Net soos in die vorige voorbeeld is daar 'n reeks adresse van toekenning. Dit is moontlik om 'n ontkoppelingsaanval uit te voer om die adres na die eerste toekenning 'n paar posisies voor die begin van die reeks te maak en dan hierdie toekenning op die nuwe posisie te oorskryf. Daarom is dit moontlik om aanwysers van ander toekenning te oorskryf om na die GOT van atoi te wys, dit te druk om 'n libc-lek te kry, en dan atoi GOT met die adres na 'n een-gadget te oorskryf.
<details>
@ -135,9 +140,9 @@ return 0;
Ander maniere om HackTricks te ondersteun:
* As jy wil sien jou **maatskappy geadverteer in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.

View file

@ -6,9 +6,9 @@
Ander maniere om HackTricks te ondersteun:
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kontroleer die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling van eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
@ -16,18 +16,18 @@ Ander maniere om HackTricks te ondersteun:
## **Eerste Pas**
Wanneer jy geheue in 'n program vrymaak met behulp van glibc, word verskillende "bins" gebruik om die geheueblokke te bestuur. Hier is 'n vereenvoudigde verduideliking van twee algemene scenarios: ongesorteerde bins en vinnigebins.
Wanneer jy geheue in 'n program vrymaak met behulp van glibc, word verskillende "bins" gebruik om die geheueblokke te bestuur. Hier is 'n vereenvoudigde verduideliking van twee algemene scenario's: ongesorteerde bins en vinnigebins.
### Ongesorteerde Bins
Wanneer jy 'n geheueblok vrymaak wat nie 'n vinnige blok is nie, gaan dit na die ongesorteerde bin. Hierdie bin tree op soos 'n lys waar nuwe vrygemaakte blokke aan die voorkant (die "kop") bygevoeg word. Wanneer jy 'n nuwe blok geheue aanvra, kyk die toewysingsprogram na die ongesorteerde bin van agter (die "stert") om 'n blok te vind wat groot genoeg is. As 'n blok van die ongesorteerde bin groter is as wat jy nodig het, word dit verdeel, met die voorkant wat teruggegee word en die oorblywende deel wat in die bin bly.
Wanneer jy 'n geheueblok vrymaak wat nie 'n vinnige blok is nie, gaan dit na die ongesorteerde bin. Hierdie bin tree op soos 'n lys waar nuwe vrygemaakte blokke by die voorkant (die "kop") gevoeg word. Wanneer jy 'n nuwe blok geheue aanvra, kyk die toewysingsprogram na die ongesorteerde bin van agter (die "stert") om 'n blok te vind wat groot genoeg is. As 'n blok van die ongesorteerde bin groter is as wat jy nodig het, word dit verdeel, met die voorkant wat teruggegee word en die oorblywende deel wat in die bin bly.
Voorbeeld:
* Jy ken 300 byte toe (`a`), dan 250 byte (`b`), vrymaak dan `a` en vra weer 250 byte (`c`).
* Jy ken 300 byte toe (`a`), dan 250 byte (`b`), vrymaak `a` en vra weer 250 byte (`c`).
* Wanneer jy `a` vrymaak, gaan dit na die ongesorteerde bin.
* As jy dan weer 250 byte aanvra, vind die toewysingsprogram `a` aan die stert en verdeel dit, waar die deel wat aan jou versoek voldoen teruggegee word en die res in die bin bly.
* `c` sal na die vorige `a` wys en met die `a's` gevul wees.
* `c` sal na die vorige `a` wys en met die `a`'s gevul wees.
```c
char *a = malloc(300);
char *b = malloc(250);
@ -40,8 +40,8 @@ Fastbins word gebruik vir klein geheueblokke. In teenstelling met ongesorteerde
Voorbeeld:
* Jy ken vier blokkies van 20 byte elk toe (`a`, `b`, `c`, `d`).
* Wanneer jy hulle in enige volgorde vrymaak, word die vrygemaakte blokkies by die kop van die fastbin gevoeg.
* Jy ken vier blokke van 20 byte elk toe (`a`, `b`, `c`, `d`).
* Wanneer jy hulle in enige volgorde vrymaak, word die vrygemaakte blokke by die kop van die fastbin gevoeg.
* As jy dan 'n 20-byte blokkie aanvra, sal die toewysingsprogram die mees onlangs vrygemaakte blokkie van die kop van die fastbin teruggee.
```c
char *a = malloc(20);
@ -59,6 +59,14 @@ d = malloc(20); // a
```
## Ander Verwysings & Voorbeelde
* [https://heap-exploitation.dhavalkapil.com/attacks/first\_fit](https://heap-exploitation.dhavalkapil.com/attacks/first\_fit)
* [https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
* ARM64. Gebruik na vry: Skep 'n gebruiker-objek, vry dit, skep 'n objek wat die vrygemaakte blok kry en toelaat om daaraan te skryf, **deur die posisie van die gebruiker se wagwoord te oorskryf** van die vorige een. Hergebruik die gebruiker om die wagwoordkontrole te **verbygaan**
* [**https://heap-exploitation.dhavalkapil.com/attacks/first\_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first\_fit)
* [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
* ARM64. Gebruik na vrylating: Skep 'n gebruiker-objek, vry dit, skep 'n objek wat die vrygemaakte blok kry en toelaat om daaraan te skryf, **om die posisie van die gebruiker se wagwoord te oorskryf** van die vorige een. Hergebruik die gebruiker om die wagwoordkontrole te **verbygaan**
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use\_after\_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use\_after\_free/#example)
* Die program maak dit moontlik om notas te skep. 'n Nota sal die nota-inligting hê in 'n malloc(8) (met 'n verwysing na 'n funksie wat opgeroep kan word) en 'n verwysing na 'n ander malloc(\<grootte>) met die inhoud van die nota.
* Die aanval sou wees om 2 notas te skep (nota0 en nota1) met groter malloc-inhoud as die grootte van die nota-inligting en dan hulle vry te stel sodat hulle in die vinnige blok (of tcache) beland.
* Skep dan 'n ander nota (nota2) met 'n inhoudsgrootte van 8. Die inhoud gaan in nota1 wees aangesien die blok hergebruik gaan word, waar ons die funksie-aanwyser kan wysig om na die wen-funksie te wys en dan Gebruik-Na-Vrylating die nota1 om die nuwe funksie-aanwyser te roep.
* [**https://guyinatuxedo.github.io/26-heap\_grooming/pico\_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap\_grooming/pico\_areyouroot/index.html)
* Dit is moontlik om 'n bietjie geheue toe te ken, die gewenste waarde te skryf, dit vry te stel, dit weer toe te ken en aangesien die vorige data nog daar is, sal dit hanteer word volgens die nuwe verwagte struktuur in die blok wat dit moontlik maak om die waarde in te stel of die vlag te kry.
* [**https://guyinatuxedo.github.io/26-heap\_grooming/swamp19\_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap\_grooming/swamp19\_heapgolf/index.html)
* In hierdie geval is dit nodig om 4 binne 'n spesifieke blok te skryf wat die eerste een is wat toegewys word (selfs nadat almal van hulle gedwing vrygestel is). Op elke nuwe toegewysde blok word sy nommer in die reeksindeks gestoor. Dan, ken 4 blokke toe (+ die aanvanklik toegewysde), die laaste een sal 4 binne dit hê, stel hulle vry en dwing die herkenning van die eerste een, wat die laaste blok wat vrygestel is, sal gebruik wat die een met 4 binne dit is.