House of Orange
Last updated
Last updated
Dowiedz się i ćwicz Hacking AWS:HackTricks Szkolenie AWS Red Team Expert (ARTE) Dowiedz się i ćwicz Hacking GCP: HackTricks Szkolenie GCP Red Team Expert (GRTE)
Technika eksploatacji została naprawiona w tym patchu, więc nie działa już (działa w wersjach starszych niż 2.26)
Ten sam przykład z większą ilością komentarzy w https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Nadużyj funkcję malloc_printerr
Nadpisz rozmiar top chunk
Wycieki libc i heap
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 przez listę struktur _IO_FILE
przechowywanych w _IO_list_all
, a 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 spowodujemy uruchomienie malloc_printerr
.
Następnie wykona adres, który mamy zapisany w strukturach _IO_FILE
, a my uzyskamy wykonanie kodu
Atak rozpoczyna się od uzyskania top chunk wewnątrz unsorted bin. Osiąga się to poprzez wywołanie 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 jest modyfikowany, 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 uzyskać 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 zaalokowany 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:
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 lokalizacją wskaźnika FD kawałka _IO_list_all
, ponieważ zapisaliśmy bliski adres w _IO_list_all
poprzez atak na unsorted bin.
Wywołanie Malloc Check: Manipulacja rozmiarem tego kawałka spowoduje, że malloc
wykona wewnętrzne sprawdzenia. Gdy sprawdza rozmiar fałszywego kawałka do przodu, który będzie wynosił zero, wywołuje błąd i wywołuje malloc_printerr
.
Manipulacja małym binem pozwoli ci kontrolować wskaźnik do 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żna wykonać dowolny kod (np. funkcję 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ępnym krokiem jest stworzenie 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żna wykonać 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 prowadząc do uruchomienia powłoki lub innego złośliwego ładunku.
Podsumowanie Ataku:
Ustaw top chunk: Zaalokuj kawałek i zmodyfikuj rozmiar top chunk.
Wymuś top chunk do unsorted bin: Zaalokuj większy kawałek.
Wyciek adresów libc: Użyj podatności do odczytu z unsorted bin.
Wykonaj atak na unsorted bin: Zapisz do _IO_list_all poprzez przepełnienie.
Zmniejsz stary top chunk: Dostosuj jego rozmiar, aby pasował do małego binu.
Ustaw fałszywą strukturę _IO_FILE: Stwórz fałszywą strukturę pliku, aby przejąć kontrolę nad przepływem wykonania.
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
. Poprzez staranne opracowanie fałszywej struktury _IO_FILE i umieszczenie jej 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 prowadząc do uruchomienia powłoki lub innych złośliwych działań.
Ucz się i praktykuj Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i praktykuj Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)