Fast Bin Attack
Last updated
Last updated
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)
Aby uzyskać więcej informacji na temat tego, co to jest szybki bin, sprawdź tę stronę:
Bins & Memory AllocationsPonieważ szybki bin jest listą jednokierunkową, istnieje znacznie mniej zabezpieczeń niż w innych binach i zmiana adresu w zwolnionym fragmencie szybkiego binu wystarczy, aby później zaalokować fragment w dowolnym adresie pamięci.
Podsumowując:
Możesz znaleźć pełny przykład w bardzo dobrze wyjaśnionym kodzie na stronie https://guyinatuxedo.github.io/28-fastbin_attack/explanation_fastbinAttack/index.html:
Jeśli jest możliwe nadpisanie wartości zmiennej globalnej global_max_fast
dużą liczbą, pozwala to generować szybkie kawałki o większych rozmiarach, potencjalnie umożliwiając przeprowadzenie ataków na szybkie kawałki w scenariuszach, gdzie wcześniej nie było to możliwe. Ta sytuacja jest przydatna w kontekście ataku na duży kawałek i ataku na nieuporządkowany kawałek.
Możliwe jest alokowanie kawałków, zwalnianie ich, odczytywanie ich zawartości i wypełnianie ich (z wykorzystaniem podatności na przepełnienie).
Skonsoliduj kawałek w celu wycieku informacji: Technika polega na nadużyciu przepełnienia, aby stworzyć fałszywy prev_size
, dzięki czemu jeden poprzedni kawałek jest umieszczany w większym, więc przy alokowaniu większego kawałka zawierającego inny kawałek, możliwe jest wydrukowanie jego danych i wyciek adresu do libc (main_arena+88
).
Nadpisz hak malloc: Dzięki temu, i nadużywając poprzedniej sytuacji nakładania się, było możliwe posiadanie 2 kawałków wskazujących na tę samą pamięć. Dlatego zwolnienie ich obu (zwolnienie innego kawałka pomiędzy nimi, aby uniknąć zabezpieczeń) pozwoliło na posiadanie tego samego kawałka w szybkim kawałku 2 razy. Następnie było możliwe ponowne go zaalokować, nadpisać adres następnego kawałka, aby wskazywał trochę przed __malloc_hook
(aby wskazywał na liczbę całkowitą, którą malloc uważa za rozmiar wolny - kolejne obejście), ponownie go zaalokować, a następnie zaalokować inny kawałek, który otrzyma adresy haków malloc.
Ostatecznie wstawiono tam jeden gadżet.
Istnieje przepełnienie sterty, użycie po zwolnienu i podwójne zwolnienie, ponieważ po zwolnieniu kawałka możliwe jest ponowne użycie i ponowne zwolnienie wskaźników.
Wyciek informacji z libc: Wystarczy zwolnić kilka kawałków, a otrzymamy wskaźnik do części lokalizacji głównej areny. Ponieważ można ponownie użyć zwolnionych wskaźników, wystarczy odczytać ten adres.
Atak na szybkie kawałki: Wszystkie wskaźniki do alokacji są przechowywane wewnątrz tablicy, więc możemy zwolnić kilka szybkich kawałków, a w ostatnim nadpisać adres, aby wskazywał trochę przed tą tablicą wskaźników. Następnie zaalokować kilka kawałków o tym samym rozmiarze i otrzymamy najpierw prawdziwy, a następnie fałszywy zawierający tablicę wskaźników. Teraz możemy nadpisać te wskaźniki alokacji, aby adres GOT free
wskazywał na system
, a następnie zapisać "/bin/sh"
w kawałku 1, aby następnie wywołać free(chunk1)
, który zamiast tego wykona system("/bin/sh")
.
Kolejny przykład nadużycia przepełnienia jednego bajtu w celu skonsolidowania kawałków w nieuporządkowanym kawałku, uzyskania wycieku informacji z libc, a następnie przeprowadzenia ataku na szybkie kawałki w celu nadpisania hak malloc adresem jednego gadżetu
Po wycieku informacji nadużywając nieuporządkowanego kawałka z UAF, aby wyciekł adres libc i adres PIE, wykorzystano atak na szybkie kawałki, aby zaalokować kawałek w miejscu, gdzie znajdowały się wskaźniki do kontrolowanych kawałków, dzięki czemu możliwe było nadpisanie pewnych wskaźników, aby zapisać jeden gadżet w GOT
Możesz znaleźć atak na szybkie kawałki nadużywany poprzez atak na nieuporządkowany kawałek:
Zauważ, że przed przeprowadzeniem ataków na szybkie kawałki często nadużywa się listy wolnych kawałków, aby wyciekać adresy libc/sterty (jeśli jest to konieczne).
Możemy alokować tylko kawałki o rozmiarze większym niż 0x100
.
Nadpisz global_max_fast
za pomocą ataku na nieuporządkowany kawałek (działa 1/16 razy ze względu na ASLR, ponieważ musimy zmodyfikować 12 bitów, ale musimy zmodyfikować 16 bitów).
Atak na szybkie kawałki w celu zmodyfikowania globalnej tablicy kawałków. To daje arbitralne prymitywy odczytu/zapisu, co pozwala na modyfikację GOT i ustawienie pewnej funkcji tak, aby wskazywała na system
.
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)