# Atak na Tcache Bin
{% hint style="success" %}
Dowiedz się i ćwicz Hacking AWS:
[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)
\
Dowiedz się i ćwicz Hacking GCP:
[**HackTricks Training GCP Red Team Expert (GRTE)**
](https://training.hacktricks.xyz/courses/grte)
Wesprzyj HackTricks
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się trikami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
{% endhint %}
## Podstawowe informacje
Aby uzyskać więcej informacji na temat tego, co to jest Tcache bin, sprawdź tę stronę:
{% content-ref url="bins-and-memory-allocations.md" %}
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
{% endcontent-ref %}
Po pierwsze, zauważ, że Tcache został wprowadzony w wersji Glibc 2.26.
**Atak Tcache** (znany również jako **zatrucie Tcache**) zaproponowany na stronie [**guyinatuxido**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) jest bardzo podobny do ataku na fast bin, gdzie celem jest nadpisanie wskaźnika do następnego fragmentu w binie wewnątrz zwolnionego fragmentu na dowolny adres, aby później było możliwe **przydzielenie tego konkretnego adresu i potencjalne nadpisanie wskaźników**.
Jednak obecnie, jeśli uruchomisz wspomniany kod, otrzymasz błąd: **`malloc(): unaligned tcache chunk detected`**. Dlatego konieczne jest wpisanie jako adresu w nowy wskaźnik adresu wyrównanego (lub wykonanie wystarczającej liczby razy binarnie, aby wpisany adres był faktycznie wyrównany).
### Atak na indeksy Tcache
Zazwyczaj na początku sterty można znaleźć fragment zawierający **liczbę fragmentów na indeks** wewnątrz tcache oraz adres do **głównego fragmentu indeksu tcache**. Jeśli z jakiegoś powodu możliwe jest zmodyfikowanie tych informacji, byłoby możliwe **spowodowanie, aby główny fragment jakiegoś indeksu wskazywał na pożądany adres** (np. `__malloc_hook`), aby następnie przydzielić fragment o rozmiarze indeksu i nadpisać zawartość `__malloc_hook` w tym przypadku.
## Przykłady
* CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html)
* **Wyciek informacji z Libc**: Możliwe jest zapełnienie tcaches, dodanie fragmentu do listy nieuporządkowanej, opróżnienie tcache i **ponowne przydzielenie fragmentu z listy nieuporządkowanej**, nadpisując tylko pierwsze 8B, pozostawiając **drugi adres do Libc z fragmentu nietknięty, dzięki czemu możemy go odczytać**.
* **Atak Tcache**: Binarne jest podatne na przepełnienie sterty o 1B. Zostanie to wykorzystane do zmiany **nagłówka rozmiaru** przydzielonego fragmentu, zwiększając go. Następnie ten fragment zostanie **zwolniony**, dodając go do tcache fragmentów o fałszywym rozmiarze. Następnie przydzielimy fragment o fałszywym rozmiarze, a poprzedni fragment zostanie **zwrócony, wiedząc, że ten fragment był faktycznie mniejszy**, co daje możliwość **nadpisania następnego fragmentu w pamięci**.\
Będziemy wykorzystywać to do **nadpisania wskaźnika FD następnego fragmentu**, aby wskazywał na **`malloc_hook`**, dzięki czemu możliwe będzie przydzielenie 2 wskaźników: najpierw prawidłowy wskaźnik, który właśnie zmodyfikowaliśmy, a następnie druga alokacja zwróci fragment w **`malloc_hook`**, który można wykorzystać do napisania **one gadget**.
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
* **Wyciek informacji z Libc**: Występuje tu użycie po zwolnieniu i podwójne zwolnienie. W tym rozwiązaniu autor wyciekł adres Libc, odczytując adres fragmentu umieszczonego w małym binie (podobnie jak wyciek z listy nieuporządkowanej, ale z małego).
* **Atak Tcache**: Wykonuje się Tcache poprzez **podwójne zwolnienie**. Ten sam fragment jest zwalniany dwukrotnie, więc wewnątrz Tcache fragment będzie wskazywał na siebie. Następnie jest on przydzielany, jego wskaźnik FD jest modyfikowany, aby wskazywał na **free hook**, a następnie jest on ponownie przydzielany, więc następny fragment na liście będzie w free hook. Następnie jest on również przydzielany i możliwe jest zapisanie adresu `system` tutaj, więc gdy zostanie zwolniony malloc zawierający `"/bin/sh"`, otrzymamy powłokę.
* 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)
* Główną luką jest możliwość `zwolnienia` dowolnego adresu na stercie, wskazując jego przesunięcie
* **Atak na indeksy Tcache**: Możliwe jest przydzielenie i zwolnienie fragmentu o rozmiarze, który po przechowywaniu wewnątrz fragmentu tcache (fragment z informacjami o binach tcache) wygeneruje **adres o wartości 0x100**. Wynika to z faktu, że tcache przechowuje liczbę fragmentów w każdym binie w różnych bajtach, dlatego jeden fragment w jednym konkretnym indeksie generuje wartość 0x100.
* Następnie ta wartość wygląda na to, jakby istniał fragment o rozmiarze 0x100. Pozwala to na nadużycie poprzez `zwolnienie` tego adresu. Spowoduje to **dodanie tego adresu do indeksu fragmentów o rozmiarze 0x100 w tcache**.
* Następnie, **przydzielając** fragment o rozmiarze **0x100**, poprzedni adres zostanie zwrócony jako fragment, co pozwala na nadpisanie innych indeksów tcache.\
Na przykład umieszczenie adresu hooka malloc w jednym z nich i przydzielenie fragmentu o rozmiarze tego indeksu umożliwi przydzielenie fragmentu w hooku calloc, co pozwala na napisanie one gadgeta, aby uzyskać powłokę.
* 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)
* Ta sama podatność co wcześniej z jednym dodatkowym ograniczeniem
* **Atak na indeksy Tcache**: Podobny atak do poprzedniego, ale z użyciem mniejszej liczby kroków poprzez **zwolnienie fragmentu zawierającego informacje o tcache**, dzięki czemu jego adres zostaje dodany do indeksu tcache jego rozmiaru, co pozwala na przydzielenie tego rozmiaru i uzyskanie informacji o fragmencie tcache jako fragmentu, co pozwala na dodanie hooka free jako adresu jednego indeksu, przydzielenie go i zapisanie na nim one gadgeta.
* [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/)
* **Zapis po zwolnieniu** w celu dodania liczby do wskaźnika `fd`.
* W tym wyzwaniu potrzebne jest wiele **heap feng-shui**. W opisie pokazano, jak **kontrolowanie głowy listy wolnych fragmentów Tcache** jest bardzo przydatne.
* **Wyciek Glibc** poprzez `stdout` (FSOP).
* **Zatrucie Tcache** w celu uzyskania arbitralnego zapisu.
{% hint style="success" %}
Dowiedz się i ćwicz Hacking AWS:
[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)
\
Dowiedz się i ćwicz Hacking GCP:
[**HackTricks Training GCP Red Team Expert (GRTE)**
](https://training.hacktricks.xyz/courses/grte)
Wesprzyj HackTricks
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Udostępnij sztuczki hakerskie, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}