House of Orange

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

Kod

Cel

  • Wykorzystanie funkcji malloc_printerr

Wymagania

  • Nadpisanie rozmiaru top chunk

  • Wycieki libc i heap

Tło

Potrzebne informacje z komentarzy z tego przykładu:

Rzecz w tym, że w starszych wersjach libc, gdy wywoływana była funkcja malloc_printerr, iterowała ona przez listę struktur _IO_FILE przechowywanych w _IO_list_all, i faktycznie wykonywała wskaźnik instrukcji w tej strukturze. Ten atak stworzy fałszywą strukturę _IO_FILE, którą zapiszemy do _IO_list_all, i spowoduje uruchomienie malloc_printerr. Następnie wykona adres, który mamy zapisany w strukturach _IO_FILE, a my uzyskamy wykonanie kodu

Atak

Atak rozpoczyna się od uzyskania top chunk wewnątrz unsorted bin. Osiąga się to, wywołując malloc z rozmiarem większym niż aktualny rozmiar top chunk, ale mniejszym niż mmp_.mmap_threshold (domyślnie 128K), co w przeciwnym razie spowodowałoby alokację mmap. Gdy rozmiar top chunk zostanie zmodyfikowany, ważne jest zapewnienie, że top chunk + jego rozmiar jest wyrównany do strony i że bit prev_inuse top chunk zawsze jest ustawiony.

Aby uzyskać top chunk wewnątrz unsorted bin, alokuj kawałek, aby utworzyć top chunk, zmień rozmiar top chunk (z przepełnieniem w przydzielonym kawałku), aby top chunk + rozmiar był wyrównany do strony z bitem prev_inuse ustawionym. Następnie zaalokuj kawałek większy niż nowy rozmiar top chunk. Należy zauważyć, że free nigdy nie jest wywoływane, aby umieścić top chunk w unsorted bin.

Stary top chunk jest teraz w unsorted bin. Zakładając, że możemy odczytać dane wewnątrz niego (możliwe z powodu podatności, która również spowodowała przepełnienie), możliwe jest wyciekanie adresów libc z niego i uzyskanie adresu _IO_list_all.

Atak na unsorted bin jest wykonywany poprzez nadużycie przepełnienia, aby zapisać topChunk->bk->fwd = _IO_list_all - 0x10. Gdy zostanie przydzielony nowy kawałek, stary top chunk zostanie podzielony, a wskaźnik do unsorted bin zostanie zapisany do _IO_list_all.

Następny krok polega na zmniejszeniu rozmiaru starego top chunk, aby pasował do małego binu, ustawiając specjalnie jego rozmiar na 0x61. Służy to dwóm celom:

  1. Wstawienie do Small Bin 4: Gdy malloc przegląda unsorted bin i widzi ten kawałek, spróbuje wstawić go do małego binu 4 ze względu na jego mały rozmiar. Powoduje to, że kawałek trafia na początek listy małego binu 4, który jest miejscem wskaźnika FD kawałka _IO_list_all, ponieważ zapisaliśmy bliski adres w _IO_list_all poprzez atak na unsorted bin.

  2. Wywołanie Malloc Check: Manipulacja rozmiarem tego kawałka spowoduje, że malloc wykona wewnętrzne sprawdzenia. Gdy sprawdza rozmiar fałszywego kawałka przód, który będzie wynosił zero, wywoła błąd i wywoła malloc_printerr.

Manipulacja małym binem pozwoli ci kontrolować wskaźnik przodu kawałka. Nakładka na _IO_list_all jest wykorzystywana do stworzenia fałszywej struktury _IO_FILE. Struktura jest starannie opracowana, aby zawierać kluczowe pola, takie jak _IO_write_base i _IO_write_ptr, ustawione na wartości, które przechodzą wewnętrzne sprawdzenia w libc. Dodatkowo tworzona jest tabela skoków wewnątrz fałszywej struktury, gdzie wskaźnik instrukcji jest ustawiony na adres, w którym może być wykonany dowolny kod (np. funkcja system).

Podsumowując pozostałą część techniki:

  • Zmniejsz stary top chunk: Dostosuj rozmiar starego top chunk do 0x61, aby pasował do małego binu.

  • Ustaw fałszywą strukturę _IO_FILE: Nakładka starego top chunk z fałszywą strukturą _IO_FILE i ustaw pola odpowiednio, aby przejąć kontrolę nad przepływem wykonania.

Następny krok polega na stworzeniu fałszywej struktury _IO_FILE, która nakłada się na stary top chunk obecnie w unsorted bin. Pierwsze bajty tej struktury są starannie opracowane, aby zawierać wskaźnik do polecenia (np. "/bin/sh"), które zostanie wykonane.

Kluczowe pola w fałszywej strukturze _IO_FILE, takie jak _IO_write_base i _IO_write_ptr, są ustawione na wartości, które przechodzą wewnętrzne sprawdzenia w libc. Dodatkowo tworzona jest tabela skoków wewnątrz fałszywej struktury, gdzie wskaźnik instrukcji jest ustawiony na adres, w którym może być wykonany dowolny kod. Zazwyczaj będzie to adres funkcji system lub innej funkcji, która może wykonywać polecenia powłoki.

Atak kulminuje, gdy wywołanie malloc powoduje wykonanie kodu poprzez manipulowaną strukturę _IO_FILE. Pozwala to efektywnie na wykonanie dowolnego kodu, zwykle skutkując uruchomieniem powłoki lub innego złośliwego ładunku.

Podsumowanie ataku:

  1. Ustaw top chunk: Zaalokuj kawałek i zmodyfikuj rozmiar top chunk.

  2. Wymuś top chunk w unsorted bin: Zaalokuj większy kawałek.

  3. Wyciek adresów libc: Użyj podatności do odczytu z unsorted bin.

  4. Wykonaj atak na unsorted bin: Zapisz do _IO_list_all poprzez przepełnienie.

  5. Zmniejsz stary top chunk: Dostosuj jego rozmiar, aby pasował do małego binu.

  6. Ustaw fałszywą strukturę _IO_FILE: Stwórz fałszywą strukturę pliku, aby przejąć kontrolę nad przepływem wykonania.

  7. Wywołaj wykonanie kodu: Zaalokuj kawałek do wykonania ataku i uruchom dowolny kod.

Ta metoda wykorzystuje mechanizmy zarządzania stosem, wycieki informacji libc i przepełnienia sterty, aby osiągnąć wykonanie kodu bez bezpośredniego wywoływania free. Starannie opracowując fałszywą strukturę _IO_FILE i umieszczając ją we właściwym miejscu, atak może przejąć kontrolę nad przepływem wykonania podczas standardowych operacji alokacji pamięci. Pozwala to na wykonanie dowolnego kodu, potencjalnie skutkując uruchomieniem powłoki lub innymi złośliwymi działaniami.

Odnośniki

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

Inne sposoby wsparcia HackTricks:

Last updated