Tcache Bin Attack

Reading time: 5 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

Basic Information

Aby uzyskać więcej informacji na temat tego, czym jest Tcache bin, sprawdź tę stronę:

{{#ref}} bins-and-memory-allocations.md {{#endref}}

Przede wszystkim należy zauważyć, że Tcache został wprowadzony w wersji Glibc 2.26.

Atak Tcache (znany również jako trucie Tcache) zaproponowany na stronie guyinatuxido jest bardzo podobny do ataku na szybkie biny, gdzie celem jest nadpisanie wskaźnika do następnego kawałka w binie wewnątrz zwolnionego kawałka na dowolny adres, aby później można było przydzielić ten konkretny adres i potencjalnie nadpisać wskaźniki.

Jednak obecnie, jeśli uruchomisz wspomniany kod, otrzymasz błąd: malloc(): unaligned tcache chunk detected. Dlatego konieczne jest zapisanie jako adres w nowym wskaźniku wyrównanego adresu (lub wykonanie wystarczającej liczby razy binarnego, aby zapisany adres był faktycznie wyrównany).

Atak na indeksy Tcache

Zazwyczaj na początku sterty można znaleźć kawałek zawierający liczbę kawałków na indeks wewnątrz tcache oraz adres do głównego kawałka każdego indeksu tcache. Jeśli z jakiegoś powodu możliwe jest modyfikowanie tych informacji, można sprawić, aby główny kawałek niektórego indeksu wskazywał na pożądany adres (np. __malloc_hook), aby następnie przydzielić kawałek o rozmiarze indeksu i nadpisać zawartość __malloc_hook w tym przypadku.

Przykłady

  • CTF https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html
  • Wycieki informacji z Libc: Możliwe jest wypełnienie tcache, dodanie kawałka do nieposortowanej listy, opróżnienie tcache i ponowne przydzielenie kawałka z nieposortowanej biny, nadpisując tylko pierwsze 8B, pozostawiając drugi adres do libc z kawałka nietknięty, aby móc go odczytać.
  • Atak Tcache: Binarne jest podatne na 1B przepełnienie sterty. To zostanie wykorzystane do zmiany nagłówka rozmiaru przydzielonego kawałka, czyniąc go większym. Następnie ten kawałek zostanie zwolniony, dodając go do tcache kawałków o fałszywym rozmiarze. Następnie przydzielimy kawałek o fałszywym rozmiarze, a poprzedni kawałek zostanie zwrócony, wiedząc, że ten kawałek był faktycznie mniejszy, co daje możliwość nadpisania następnego kawałka w pamięci.
    Wykorzystamy to, aby nadpisać wskaźnik FD następnego kawałka, aby wskazywał na malloc_hook, aby następnie można było przydzielić 2 wskaźniki: najpierw legitny wskaźnik, który właśnie zmodyfikowaliśmy, a następnie drugie przydzielenie zwróci kawałek w malloc_hook, który można wykorzystać do zapisania jednego gadżetu.
  • CTF https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html
  • Wycieki informacji z Libc: Istnieje użycie po zwolnieniu i podwójne zwolnienie. W tym opisie autor wyciekł adres libc, odczytując adres kawałka umieszczonego w małej binie (jak wyciekając go z nieposortowanej biny, ale z małej).
  • Atak Tcache: Atak Tcache jest przeprowadzany za pomocą podwójnego zwolnienia. Ten sam kawałek jest zwalniany dwa razy, więc wewnątrz Tcache kawałek będzie wskazywał na siebie. Następnie jest przydzielany, jego wskaźnik FD jest modyfikowany, aby wskazywał na free hook, a następnie jest ponownie przydzielany, więc następny kawałek na liście będzie w free hook. Następnie ten kawałek jest również przydzielany i możliwe jest zapisanie adresu system tutaj, więc gdy malloc zawierający "/bin/sh" zostanie zwolniony, uzyskujemy powłokę.
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html
  • Główna podatność tutaj to możliwość free dowolnego adresu w stercie, wskazując jego offset.
  • Atak na indeksy Tcache: Możliwe jest przydzielenie i zwolnienie kawałka o rozmiarze, który po zapisaniu wewnątrz kawałka tcache (kawałek z informacjami o binach tcache) wygeneruje adres o wartości 0x100. Dzieje się tak, ponieważ tcache przechowuje liczbę kawałków w każdej binie w różnych bajtach, dlatego jeden kawałek w jednym konkretnym indeksie generuje wartość 0x100.
  • Następnie ta wartość wygląda, jakby istniał kawałek o rozmiarze 0x100. Umożliwiając nadużycie tego przez free ten adres. To doda ten adres do indeksu kawałków o rozmiarze 0x100 w tcache.
  • Następnie, przydzielając kawałek o rozmiarze 0x100, poprzedni adres zostanie zwrócony jako kawałek, co pozwoli na nadpisanie innych indeksów tcache.
    Na przykład umieszczając adres malloc hook w jednym z nich i przydzielając kawałek o rozmiarze tego indeksu, uzyskamy kawałek w calloc hook, co pozwala na zapisanie jednego gadżetu, aby uzyskać powłokę.
  • CTF 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 mniejszą liczbą kroków, poprzez zwolnienie kawałka, który zawiera informacje o tcache, aby jego adres został dodany do indeksu tcache o jego rozmiarze, więc możliwe jest przydzielenie tego rozmiaru i uzyskanie informacji o kawałku tcache jako kawałka, co pozwala na dodanie free hook jako adresu jednego indeksu, przydzielenie go i zapisanie jednego gadżetu na nim.
  • Math Door. HTB Cyber Apocalypse CTF 2023
  • Write After Free w celu dodania liczby do wskaźnika fd.
  • W tym wyzwaniu potrzebne jest dużo heap feng-shui. Opis pokazuje, jak kontrolowanie głowy Tcache listy wolnych jest bardzo przydatne.
  • Wycieki Glibc przez stdout (FSOP).
  • Trucie Tcache w celu uzyskania dowolnej prymitywy zapisu.

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks