hacktricks/binary-exploitation/libc-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 zaalokowanie 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 możliwe jest zmodyfikowanie tych informacji, można spowodować, że główny fragment pewnego indeksu wskaże na pożądany adres (np. hak malloc) aby następnie zaalokować 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 zaalokowanie 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. Zostanie to wykorzystane do zmiany nagłówka rozmiaru zaalokowanego fragmentu, zwiększając go. Następnie ten fragment zostanie zwolniony, dodając go do tcache fragmentów o fałszywym rozmiarze. Następnie zaalokujemy 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 wskazującego na malloc_hook, dzięki czemu możliwe będzie zaalokowanie 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
  • 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 nieuporządkowanego binu, 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 ten będzie wskazywał na siebie. Następnie jest on alokowany, jego wskaźnik FD jest modyfikowany, aby wskazywał na free hook, a następnie jest ponownie alokowany, więc następny fragment na liście będzie w free hook. Następnie ten fragment również jest alokowany 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 zaalokowanie i zwolnienie fragmentu o rozmiarze, który przechowywany wewnątrz fragmentu tcache (fragment z informacjami o binach tcache) spowoduje wygenerowanie adresu 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, zaalokowanie fragmentu 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 zaalokowanie fragmentu o rozmiarze tego indeksu umożliwi uzyskanie fragmentu w hakera calloc, co pozwala na napisanie 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 umożliwia zaalokowanie tego rozmiaru i uzyskanie informacji o fragmencie tcache jako fragmentu, co pozwala dodać free hook jako adres jednego indeksu, zaalokować go i zapisać na nim one gadgeta.
Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: