# Tcache Bin Attack {{#include ../../banners/hacktricks-training.md}} ## Osnovne informacije Za više informacija o tome šta je Tcache bin, proverite ovu stranicu: {{#ref}} bins-and-memory-allocations.md {{#endref}} Prvo, imajte na umu da je Tcache uveden u Glibc verziji 2.26. **Tcache napad** (poznat i kao **Tcache trovanje**) predložen na [**guyinatuxido stranici**](https://guyinatuxedo.github.io/29-tcache/tcache_explanation/index.html) je veoma sličan fast bin napadu gde je cilj prepisati pokazivač na sledeći deo u binu unutar oslobođenog dela na proizvoljnu adresu kako bi kasnije bilo moguće **alokovati 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 napisati kao adresu u novom pokazivaču usklađenu adresu (ili izvršiti binarni kod dovoljno puta tako da je napisana adresa zapravo usklađena). ### Tcache indeksi napad Obično je moguće pronaći na početku heap-a deo koji sadrži **broj delova po indeksu** unutar tcache-a i adresu do **glavnog dela svakog tcache indeksa**. Ako iz nekog razloga bude moguće izmeniti ove informacije, bilo bi moguće **naterati glavni deo nekog indeksa da pokazuje na željenu adresu** (kao što je `__malloc_hook`) kako bi se zatim alokovao deo veličine indeksa i prepisali sadržaji `__malloc_hook` 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 napuniti tcache, dodati deo u nesortiranu listu, isprazniti tcache i **ponovo alocirati deo iz nesortiranog bina** samo prepisujući prvih 8B, ostavljajući **drugom adresom do libc iz dela netaknutu kako bismo mogli da je pročitamo**. - **Tcache napad**: Binarni kod je ranjiv na 1B heap overflow. Ovo će se iskoristiti da se promeni **header veličine** alociranog dela čineći ga većim. Zatim, ovaj deo će biti **oslobođen**, dodajući ga u tcache delova lažne veličine. Zatim ćemo alocirati deo sa lažnom veličinom, a prethodni deo će biti **vraćen znajući da je ovaj deo zapravo manji** i to pruža priliku da **prepišemo sledeći deo u memoriji**.\ Iskoristićemo ovo da **prepišemo FD pokazivač sledećeg dela** da pokazuje na **`malloc_hook`**, tako da je moguće alocirati 2 pokazivača: prvo legitiman pokazivač koji smo upravo izmenili, a zatim će druga alokacija vratiti deo u **`malloc_hook`** koji je moguće iskoristiti za pisanje **one gadget**. - 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 korišćenje nakon oslobađanja i dvostruko oslobađanje. U ovom izveštaju autor je otkrio adresu libc čitajući adresu dela smeštenog u malom binu (kao da je otkrio iz nesortiranog bina, ali iz malog). - **Tcache napad**: Tcache se vrši putem **dvostrukog oslobađanja**. Isti deo se oslobađa dva puta, tako da unutar Tcache-a deo pokazuje na sebe. Zatim se alocira, njegov FD pokazivač se menja da pokazuje na **free hook** i zatim se ponovo alocira tako da će sledeći deo na listi biti u free hook-u. Zatim se ovo takođe alocira i moguće je ovde napisati adresu `system` tako da kada se oslobodi malloc koji sadrži `"/bin/sh"` dobijamo 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 sposobnost da se `free` bilo koja adresa u heap-u ukazivanjem na njen offset. - **Tcache indeksi napad**: Moguće je alocirati i osloboditi deo veličine koja kada se čuva unutar tcache dela (deo sa informacijama o tcache binovima) generiše **adresu sa vrednošću 0x100**. Ovo je zato što tcache čuva broj delova u svakom binu u različitim bajtovima, stoga jedan deo u jednom specifičnom indeksu generiše vrednost 0x100. - Zatim, ova vrednost izgleda kao da postoji deo veličine 0x100. Omogućavajući da se iskoristi tako što se `free` ova adresa. Ovo će **dodati tu adresu u indeks delova veličine 0x100 u tcache**. - Zatim, **alokacija** dela veličine **0x100**, prethodna adresa će biti vraćena kao deo, omogućavajući prepisivanje drugih tcache indeksa.\ Na primer, stavljajući adresu malloc hook u jedan od njih i alocirajući deo veličine tog indeksa dobićemo deo u calloc hook-u, što omogućava pisanje one gadget za dobijanje shell-a. - 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) - Ista ranjivost kao pre sa jednom dodatnom restrikcijom. - **Tcache indeksi napad**: Sličan napad kao prethodni, ali koristeći manje koraka oslobađanjem dela koji sadrži tcache informacije tako da se njegova adresa dodaje u tcache indeks njegove veličine, tako da je moguće alocirati tu veličinu i dobiti tcache informacije kao deo, što omogućava dodavanje free hook kao adresu jednog indeksa, alocirati ga i napisati one gadget na njemu. - [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/) - **Write After Free** da se doda broj u `fd` pokazivač. - Puno **heap feng-shui** je potrebno u ovom izazovu. Izveštaj pokazuje kako je **kontrola glave Tcache** free-liste veoma korisna. - **Glibc leak** kroz `stdout` (FSOP). - **Tcache trovanje** za dobijanje proizvoljne write primitive. {{#include ../../banners/hacktricks-training.md}}