House of Orange
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)
Technika eksploatacji została naprawiona w tym łatce, więc to już nie działa (działa w wersjach wcześniejszych 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
Wykorzystanie funkcji malloc_printerr
Nadpisanie rozmiaru górnego kawałka
Wycieki libc i heap
Nieco potrzebnego tła 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 sfałszuje fałszywą strukturę _IO_FILE
, którą zapiszemy do _IO_list_all
, i spowoduje uruchomienie malloc_printerr
.
Następnie wykona dowolny adres, który mamy zapisany w tabeli skoków struktur _IO_FILE
, a my uzyskamy wykonanie kodu.
Atak zaczyna się od uzyskania górnego kawałka wewnątrz nieposortowanego pojemnika. Osiąga się to przez wywołanie malloc
z rozmiarem większym niż aktualny rozmiar górnego kawałka, ale mniejszym niż mmp_.mmap_threshold
(domyślnie 128K), co w przeciwnym razie spowodowałoby alokację mmap
. Kiedy rozmiar górnego kawałka jest modyfikowany, ważne jest, aby upewnić się, że górny kawałek + jego rozmiar jest wyrównany do strony i że bit prev_inuse górnego kawałka jest zawsze ustawiony.
Aby uzyskać górny kawałek wewnątrz nieposortowanego pojemnika, alokuj kawałek, aby utworzyć górny kawałek, zmień rozmiar górnego kawałka (z przepełnieniem w alokowanym kawałku), aby górny kawałek + rozmiar był wyrównany do strony z ustawionym bitem prev_inuse. Następnie alokuj kawałek większy niż nowy rozmiar górnego kawałka. Zauważ, że free
nigdy nie jest wywoływane, aby uzyskać górny kawałek do nieposortowanego pojemnika.
Stary górny kawałek jest teraz w nieposortowanym pojemniku. Zakładając, że możemy odczytać dane w nim (prawdopodobnie z powodu luki, 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 nieposortowany pojemnik jest przeprowadzany przez wykorzystanie przepełnienia do zapisania topChunk->bk->fwd = _IO_list_all - 0x10
. Gdy alokowany jest nowy kawałek, stary górny kawałek zostanie podzielony, a wskaźnik do nieposortowanego pojemnika zostanie zapisany w _IO_list_all
.
Kolejny krok polega na zmniejszeniu rozmiaru starego górnego kawałka, aby zmieścił się w małym pojemniku, ustawiając jego rozmiar na 0x61. Służy to dwóm celom:
Wstawienie do Małego Pojemnika 4: Gdy malloc
przeszukuje nieposortowany pojemnik i widzi ten kawałek, spróbuje wstawić go do małego pojemnika 4 z powodu jego małego rozmiaru. To sprawia, że kawałek trafia na początek listy małego pojemnika 4, co jest lokalizacją wskaźnika FD kawałka _IO_list_all
, ponieważ zapisaliśmy bliski adres w _IO_list_all
za pomocą ataku na nieposortowany pojemnik.
Wywołanie Sprawdzenia Malloc: Manipulacja rozmiarem tego kawałka spowoduje, że malloc
przeprowadzi wewnętrzne kontrole. Gdy sprawdzi rozmiar fałszywego kawałka do przodu, który będzie zerowy, wywoła błąd i wywoła malloc_printerr
.
Manipulacja małym pojemnikiem pozwoli ci kontrolować wskaźnik do przodu kawałka. Nakładanie się na _IO_list_all jest używane do sfałszowania fałszywej struktury _IO_FILE. Struktura jest starannie skonstruowana, aby zawierała kluczowe pola, takie jak _IO_write_base
i _IO_write_ptr
, ustawione na wartości, które przechodzą wewnętrzne kontrole w libc. Dodatkowo, w fałszywej strukturze tworzona jest tabela skoków, w której wskaźnik instrukcji jest ustawiony na adres, w którym może być wykonany dowolny kod (np. funkcja system
).
Aby podsumować pozostałą część techniki:
Zmniejsz Stary Górny Kawałek: Dostosuj rozmiar starego górnego kawałka do 0x61, aby zmieścił się w małym pojemniku.
Ustaw Fałszywą Strukturę _IO_FILE
: Nakładaj stary górny kawałek na fałszywą strukturę _IO_FILE i odpowiednio ustawiaj pola, aby przejąć kontrolę nad przepływem wykonania.
Kolejny krok polega na sfałszowaniu fałszywej struktury _IO_FILE, która nakłada się na stary górny kawałek obecnie w nieposortowanym pojemniku. Pierwsze bajty tej struktury są starannie skonstruowane, aby zawierały 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 kontrole w libc. Dodatkowo, w fałszywej strukturze tworzona jest tabela skoków, w której wskaźnik instrukcji jest ustawiony na adres, w którym może być wykonany dowolny kod. Zazwyczaj byłby to adres funkcji system
lub innej funkcji, która może wykonywać polecenia powłoki.
Atak kulminuje, gdy wywołanie malloc
wyzwala wykonanie kodu przez manipulowaną strukturę _IO_FILE. To skutecznie pozwala na wykonanie dowolnego kodu, co zazwyczaj skutkuje uruchomieniem powłoki lub innym złośliwym ładunkiem.
Podsumowanie Ataku:
Ustaw górny kawałek: Alokuj kawałek i zmodyfikuj rozmiar górnego kawałka.
Wymuś górny kawałek do nieposortowanego pojemnika: Alokuj większy kawałek.
Wycieki adresów libc: Wykorzystaj lukę, aby odczytać z nieposortowanego pojemnika.
Wykonaj atak na nieposortowany pojemnik: Zapisz do _IO_list_all za pomocą przepełnienia.
Zmniejsz stary górny kawałek: Dostosuj jego rozmiar, aby zmieścił się w małym pojemniku.
Ustaw fałszywą strukturę _IO_FILE: Sfałszuj fałszywą strukturę pliku, aby przejąć kontrolę nad przepływem.
Wyzwól wykonanie kodu: Alokuj kawałek, aby wykonać atak i uruchomić dowolny kod.
Podejście to wykorzystuje mechanizmy zarządzania pamięcią, wycieki informacji libc i przepełnienia stosu, aby osiągnąć wykonanie kodu bez bezpośredniego wywoływania free
. Poprzez staranne skonstruowanie fałszywej struktury _IO_FILE i umieszczenie jej w odpowiedniej lokalizacji, atak może przejąć kontrolę nad przepływem wykonania podczas standardowych operacji alokacji pamięci. To umożliwia wykonanie dowolnego kodu, co potencjalnie skutkuje uruchomieniem powłoki lub innymi złośliwymi działaniami.
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)