Tcache Bin Attack

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

Wesprzyj HackTricks

Podstawowe informacje

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

Bins & Memory Allocations

Po pierwsze, zauważ, że Tcache został wprowadzony w wersji Glibc 2.26.

Atak Tcache (znany również jako zatrucie Tcache) zaproponowany na stronie guyinatuxido 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

  • 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.

  • 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ę.

  • 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ę.

  • 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.

  • 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.

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

Wesprzyj HackTricks

Last updated