Atak na Niesortowany Koszyk

Reading time: 7 minutes

tip

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

Wsparcie HackTricks

Podstawowe Informacje

Aby uzyskać więcej informacji na temat tego, czym jest niesortowany koszyk, sprawdź tę stronę:

{{#ref}} bins-and-memory-allocations.md {{#endref}}

Niesortowane listy mogą zapisać adres do unsorted_chunks (av) w adresie bk kawałka. Dlatego, jeśli atakujący może zmodyfikować adres wskaźnika bk w kawałku wewnątrz niesortowanego koszyka, może być w stanie zapisać ten adres w dowolnym adresie, co może być pomocne w wycieku adresów Glibc lub obejściu niektórych zabezpieczeń.

Tak więc, w zasadzie, ten atak pozwala na ustawienie dużej liczby w dowolnym adresie. Ta duża liczba to adres, który może być adresem sterty lub adresem Glibc. Typowym celem jest global_max_fast, aby umożliwić tworzenie koszyków szybkich o większych rozmiarach (i przejście z ataku na niesortowany koszyk do ataku na koszyk szybki).

tip

Zobaczenie przykładu podanego w https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle i użycie 0x4000 i 0x5000 zamiast 0x400 i 0x500 jako rozmiarów kawałków (aby uniknąć Tcache) pozwala zobaczyć, że obecnie błąd malloc(): unsorted double linked list corrupted jest wyzwalany.

Dlatego ten atak na niesortowany koszyk teraz (wśród innych kontroli) również wymaga możliwości naprawienia podwójnie powiązanej listy, aby to zostało obejście victim->bk->fd == victim lub nie victim->fd == av (arena), co oznacza, że adres, w którym chcemy zapisać, musi mieć adres fałszywego kawałka w swojej pozycji fd, a fałszywy kawałek fd wskazuje na arenę.

caution

Zauważ, że ten atak psuje niesortowany koszyk (stąd mały i duży również). Dlatego możemy teraz używać tylko alokacji z szybkiego koszyka (bardziej złożony program może wykonać inne alokacje i się zawiesić), a aby to wyzwolić, musimy alokować ten sam rozmiar, inaczej program się zawiesi.

Zauważ, że nadpisanie global_max_fast może pomóc w tym przypadku, ufając, że szybki koszyk będzie w stanie zająć się wszystkimi innymi alokacjami, aż do zakończenia eksploatu.

Kod z guyinatuxedo wyjaśnia to bardzo dobrze, chociaż jeśli zmodyfikujesz malloci, aby alokować pamięć wystarczająco dużą, aby nie zakończyć w Tcache, możesz zobaczyć, że wcześniej wspomniany błąd pojawia się, uniemożliwiając tę technikę: malloc(): unsorted double linked list corrupted

Atak na Wycieki Informacji z Niesortowanego Koszyka

To w rzeczywistości bardzo podstawowa koncepcja. Kawałki w niesortowanym koszyku będą miały wskaźniki. Pierwszy kawałek w niesortowanym koszyku będzie miał fd i bk linki wskazujące na część głównej areny (Glibc).
Dlatego, jeśli możesz umieścić kawałek wewnątrz niesortowanego koszyka i go odczytać (użycie po zwolnieniu) lub ponownie go alokować bez nadpisywania przynajmniej 1 z wskaźników, aby następnie odczytać go, możesz uzyskać wyciek informacji Glibc.

Podobny atak użyty w tym opisie polegał na nadużywaniu struktury 4 kawałków (A, B, C i D - D jest tylko po to, aby zapobiec konsolidacji z górnym kawałkiem), więc użyto przepełnienia bajtu zerowego w B, aby sprawić, że C wskazywał, że B był nieużywany. Ponadto w B zmodyfikowano dane prev_size, aby rozmiar zamiast rozmiaru B był A+B.
Następnie C został zwolniony i skonsolidowany z A+B (ale B wciąż był używany). Nowy kawałek o rozmiarze A został alokowany, a następnie adresy wycieków libc zostały zapisane w B, skąd zostały wycieknięte.

Odniesienia i Inne Przykłady

  • https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap
  • Celem jest nadpisanie zmiennej globalnej wartością większą niż 4869, aby możliwe było uzyskanie flagi, a PIE nie jest włączone.
  • Możliwe jest generowanie kawałków o dowolnych rozmiarach, a także występuje przepełnienie sterty o pożądanym rozmiarze.
  • Atak zaczyna się od stworzenia 3 kawałków: chunk0 do nadużywania przepełnienia, chunk1 do przepełnienia i chunk2, aby górny kawałek nie konsolidował poprzednich.
  • Następnie chunk1 jest zwalniany, a chunk0 jest przepełniany, aby wskaźnik bk chunk1 wskazywał: bk = magic - 0x10
  • Następnie chunk3 jest alokowany o tym samym rozmiarze co chunk1, co wyzwoli atak na niesortowany koszyk i zmodyfikuje wartość zmiennej globalnej, co umożliwi uzyskanie flagi.
  • https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html
  • Funkcja scalania jest podatna, ponieważ jeśli oba przekazane indeksy są takie same, to zostanie ponownie alokowana i następnie zwolniona, ale zwróci wskaźnik do tego zwolnionego obszaru, który można wykorzystać.
  • Dlatego tworzone są 2 kawałki: chunk0, który zostanie scalony z samym sobą, oraz chunk1, aby zapobiec konsolidacji z górnym kawałkiem. Następnie funkcja scalania jest wywoływana z chunk0 dwukrotnie, co spowoduje użycie po zwolnieniu.
  • Następnie wywoływana jest funkcja view z indeksem 2 (który jest indeksem kawałka używanego po zwolnieniu), co wycieka adres libc.
  • Ponieważ binarka ma zabezpieczenia, aby alokować tylko rozmiary większe niż global_max_fast, więc nie używa się szybkiego koszyka, zostanie użyty atak na niesortowany koszyk, aby nadpisać zmienną globalną global_max_fast.
  • Następnie możliwe jest wywołanie funkcji edytowania z indeksem 2 (wskaźnik używany po zwolnieniu) i nadpisanie wskaźnika bk, aby wskazywał na p64(global_max_fast-0x10). Następnie, tworząc nowy kawałek, użyje wcześniej skompromitowanego adresu zwolnionego (0x20), co wyzwoli atak na niesortowany koszyk, nadpisując global_max_fast, co jest bardzo dużą wartością, co teraz pozwala na tworzenie kawałków w szybkich koszykach.
  • Teraz przeprowadzany jest atak na szybki koszyk:
  • Przede wszystkim odkryto, że możliwe jest pracowanie z szybkimi kawałkami o rozmiarze 200 w lokalizacji __free_hook:
  • gef➤  p &__free_hook
    

$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000

  • Jeśli uda nam się uzyskać szybki kawałek o rozmiarze 0x200 w tej lokalizacji, będzie możliwe nadpisanie wskaźnika funkcji, który zostanie wykonany.
  • W tym celu tworzony jest nowy kawałek o rozmiarze 0xfc, a funkcja scalania jest wywoływana z tym wskaźnikiem dwukrotnie, w ten sposób uzyskujemy wskaźnik do zwolnionego kawałka o rozmiarze 0xfc*2 = 0x1f8 w szybkim koszyku.
  • Następnie wywoływana jest funkcja edytowania w tym kawałku, aby zmodyfikować adres fd tego szybkiego koszyka, aby wskazywał na poprzednią funkcję __free_hook.
  • Następnie tworzony jest kawałek o rozmiarze 0x1f8, aby odzyskać z szybkiego koszyka poprzedni bezużyteczny kawałek, więc tworzony jest kolejny kawałek o rozmiarze 0x1f8, aby uzyskać kawałek szybkiego koszyka w __free_hook, który jest nadpisywany adresem funkcji system.
  • A na koniec kawałek zawierający ciąg /bin/sh\x00 jest zwalniany, wywołując funkcję usuwania, co wyzwala funkcję __free_hook, która wskazuje na system z /bin/sh\x00 jako parametrem.
  • CTF https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html
  • Inny przykład nadużywania przepełnienia 1B do konsolidacji kawałków w niesortowanym koszyku i uzyskania wycieku informacji libc, a następnie przeprowadzenia ataku na szybki koszyk w celu nadpisania wskaźnika malloc z adresem jednego gadżetu.
  • Robot Factory. BlackHat MEA CTF 2022
  • Możemy alokować tylko kawałki o rozmiarze większym niż 0x100.
  • Nadpisanie global_max_fast za pomocą ataku na niesortowany koszyk (działa 1/16 razy z powodu ASLR, ponieważ musimy zmodyfikować 12 bitów, ale musimy zmodyfikować 16 bitów).
  • Atak na szybki koszyk w celu modyfikacji globalnej tablicy kawałków. To daje dowolną prymitywę odczytu/zapisu, co pozwala na modyfikację GOT i ustawienie niektórej funkcji, aby wskazywała na system.

tip

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

Wsparcie HackTricks