hacktricks/binary-exploitation/heap/tcache-bin-attack.md

67 lines
7.5 KiB
Markdown
Raw Permalink Normal View History

# Tcache Bin Napad
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>
## Osnovne Informacije
Za više informacija o tome šta je tcache bin, pogledajte ovu stranicu:
{% content-ref url="bins-and-memory-allocations.md" %}
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
{% endcontent-ref %}
Prvo, napomenimo da je Tcache uveden u glibc verziji 2.26.
**Tcache** napad predložen na [**guyinatuxido stranici**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) veoma je sličan napadu na fast bin gde je cilj prepisati pokazivač na sledeći blok u binu unutar oslobođenog bloka na proizvoljnu adresu kako bi kasnije bilo moguće **dodeliti tu specifičnu adresu i potencijalno prepisati pokazivače**.
Međutim, danas, ako pokrenete pomenuti kod, dobićete grešku: **`malloc(): unaligned tcache chunk detected`**. Dakle, potrebno je upisati kao adresu u novi pokazivač poravnanu adresu (ili dovoljno puta izvršiti binarni fajl kako bi upisana adresa zapravo bila poravnata).
### Napad na tcache indekse
Obično je moguće naći na početku hipa blok koji sadrži **broj blokova po indeksu** unutar tcache-a i adresu **glavnog bloka svakog indeksa tcache-a**. Ako iz nekog razloga bude moguće izmeniti ove informacije, bilo bi moguće **naterati glavni blok nekog indeksa da pokazuje na željenu adresu** (kao što je malloc hook) kako bi se zatim dodelio blok veličine indeksa i prepisali sadržaji malloc hook-a u ovom slučaju.
## Primeri
* CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html)
* **Libc info leak**: Moguće je popuniti tcache-ove, dodati blok u nesortiranu listu, isprazniti tcache i **ponovo dodeliti blok iz nesortirane liste** samo prepisujući prvih 8B, ostavljajući **drugu adresu libc-a iz bloka netaknutom tako da je možemo pročitati**.
* **Tcache napad**: Binarni fajl je ranjiv na 1B prelivanje hipa. Ovo će biti iskorišćeno da se promeni **veličina zaglavlja** dodeljenog bloka čineći ga većim. Zatim, ovaj blok će biti **oslobođen**, dodajući ga u tcache blokove lažne veličine. Zatim, dodelićemo blok sa lažnom veličinom, a prethodni blok će biti **vraćen znajući da je ovaj blok zapravo bio manji** i to pruža mogućnost da se **prepise sledeći blok u memoriji**.\
Iskoristićemo ovo da **prepisujemo pokazivač FD sledećeg bloka** da pokazuje na **`malloc_hook`**, tako da je moguće alocirati 2 pokazivača: prvo legitimni pokazivač koji smo upravo izmenili, a zatim će druga alokacija vratiti blok u **`malloc_hook`** koji je moguće iskoristiti za pisanje **one gadget-a**.
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
* **Libc info leak**: Postoji upotreba nakon oslobođenja i dvostruko oslobođenje. U ovom writeup-u autor je procurio adresu libc-a čitajući adresu bloka smeštenog u malom binu (kao što je procurio iz nesortiranog bina ali iz malog).
* **Tcache napad**: Tcache je izvršen putem **dvostrukog oslobođenja**. Isti blok je oslobođen dva puta, tako da će unutar Tcache-a blok pokazivati na sebe. Zatim, on se alocira, njegov FD pokazivač se menja da pokazuje na **free hook** i zatim se ponovo alocira tako da će sledeći blok na listi biti u free hook-u. Zatim, i ovaj je alociran i moguće je upisati adresu `system` ovde tako da kada se alocira malloc koji sadrži `"/bin/sh"` dobijemo shell.
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html)
* Glavna ranjivost ovde je mogućnost `oslobođenja` bilo koje adrese u hipu navođenjem njenog ofseta
* **Napad na tcache indekse**: Moguće je alocirati i osloboditi blok određene veličine koji kada se čuva unutar tcache bloka (blok sa informacijama o binovima tcache-a) generisaće **adresu sa vrednošću 0x100**. Ovo je zato što tcache čuva broj blokova u svakom binu u različitim bajtovima, stoga jedan blok u jednom određenom indeksu generiše vrednost 0x100.
* Zatim, ova vrednost izgleda kao da postoji blok veličine 0x100. Omogućava zloupotrebu putem `oslobođenja` ove adrese. Ovo će **dodati tu adresu u indeks blokova veličine 0x100 u tcache-u**.
* Zatim, **alociranjem** bloka veličine **0x100**, prethodna adresa će biti vraćena kao blok, omogućavajući prepisivanje drugih tcache indeksa.\
Na primer, postavljanje adrese malloc hook-a u jednom od njih i alokacija bloka veličine tog indeksa omogućiće blok u calloc hook-u, što omogućava pisanje one gadget-a za dobijanje s školjke.
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html)
* Istovetna ranjivost kao i prethodno sa jednim dodatnim ograničenjem
* **Napad na tcache indekse**: Sličan napad kao prethodni ali sa manje koraka tako što se **oslobađa blok koji sadrži informacije o tcache-u** tako da se njegova adresa doda u tcache indeks njegove veličine tako da je moguće alocirati tu veličinu i dobiti informacije o tcache bloku kao blok, što omogućava dodavanje free hook-a kao adrese jednog indeksa, alokacija toga, i pisanje one gadget-a na njemu.
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>