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

8.1 KiB

Atak na Tcache Bin

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

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 {% endcontent-ref %}

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

Atak 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 wystarczająco wiele razy uruchomienie binarnego pliku, 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 każdego indeksu tcache. Jeśli z jakiegoś powodu jest możliwe zmodyfikowanie tych informacji, byłoby możliwe skierowanie głównego fragmentu pewnego indeksu pod wybrany adres (np. hak malloc) aby później przydzielić fragment o rozmiarze indeksu i nadpisać zawartość hakera malloc w tym przypadku.

Przykłady

  • CTF 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: Binarny plik jest podatny na przepełnienie sterty o 1B. Będzie 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 sfałszowanym 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 wskazującego na malloc_hook, więc 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 zapisania one gadget.
  • CTF https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html
  • Wyciek informacji z libc: Istnieje 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 znajdzie się 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
  • 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 wykorzystanie go 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 hakera malloc w jednym z nich i przydzielenie fragmentu o rozmiarze tego indeksu umożliwi uzyskanie fragmentu w hakera calloc, co pozwala na zapisanie one gadgeta, 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 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 free hook jako adresu jednego indeksu, przydzielenie go i zapisanie one gadgeta na nim.
Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: