Tcache Bin Attack
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aby uzyskać więcej informacji na temat tego, czym jest Tcache bin, sprawdź tę stronę:
Bins & Memory AllocationsPrzede wszystkim zauważ, ż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).
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.
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 nieposortowanego binu tylko nadpisując 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 do nadpisania wskaźnika 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.
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łym binie (jak wyciekając go z nieposortowanego binu, ale z małego).
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ę.
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łka z informacjami o binach tcache) wygeneruje adres o wartości 0x100. Dzieje się tak, ponieważ tcache przechowuje liczbę kawałków w każdym 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ę.
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.
Zapis po zwolnieniu w celu dodania liczby do wskaźnika fd
.
W tym wyzwaniu potrzebne jest dużo feng-shui sterty. Opis pokazuje, jak kontrolowanie głowy Tcache listy zwolnionych jest bardzo przydatne.
Wycieki Glibc przez stdout
(FSOP).
Trucie Tcache w celu uzyskania dowolnej prymitywy zapisu.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)