6.9 KiB
Dom Siły
Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF sprawdź PLAN SUBSKRYPCYJNY!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.
Podstawowe Informacje
Kod
- Ta technika została załatana (tutaj) i powoduje ten błąd:
malloc(): corrupted top size
- Możesz wypróbować kod stąd, jeśli chcesz go przetestować.
Cel
- Celem tego ataku jest możliwość alokacji fragmentu pamięci w określonym adresie.
Wymagania
- Przepełnienie, które pozwala nadpisać rozmiar nagłówka top chunk (np. -1).
- Możliwość kontrolowania rozmiaru alokacji sterty
Atak
Jeśli atakujący chce zaalokować fragment pamięci pod adresem P w celu nadpisania wartości, zaczyna od nadpisania rozmiaru top chunk -1
(może to być wykonane poprzez przepełnienie). Zapewnia to, że malloc nie będzie używał mmap do żadnej alokacji, ponieważ Top chunk zawsze będzie miał wystarczająco dużo miejsca.
Następnie oblicz odległość między adresem top chunk a docelowym miejscem alokacji. Jest to konieczne, ponieważ alokacja malloc o takim rozmiarze zostanie wykonana w celu przeniesienia top chunk do tej pozycji. Tak można łatwo obliczyć różnicę/rozmiar:
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/
Dlatego alokując rozmiar cel - old_top - 4*sizeof(long)
(4 longi, ponieważ metadane top chunk i nowego chunka po alokacji) przesunie top chunk na adres, który chcemy nadpisać.
Następnie wykonaj kolejne malloc, aby uzyskać chunk zawierający na początku danych do zapisania docelowego adresu.
Odnośniki i Inne Przykłady
- https://github.com/shellphish/how2heap/tree/master
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/
- https://heap-exploitation.dhavalkapil.com/attacks/house_of_force
- https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c
- https://guyinatuxedo.github.io/41-house_of_force/house_force_exp/index.html
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/#hitcon-training-lab-11
- Celem tego scenariusza jest ret2win, gdzie musimy zmodyfikować adres funkcji, która zostanie wywołana przez funkcję ret2win.
- Binarny plik ma przepełnienie, które można wykorzystać do zmodyfikowania rozmiaru top chunk, który jest zmieniony na -1 lub p64(0xffffffffffffffff).
- Następnie obliczany jest adres miejsca, gdzie istnieje wskaźnik do nadpisania, a różnica od bieżącej pozycji top chunk do tego miejsca jest alokowana za pomocą
malloc
. - Na koniec alokowany jest nowy chunk, który będzie zawierał ten pożądany cel, w który zostanie nadpisany przez funkcję ret2win.
- https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp
- W
Wprowadź swoje imię:
istnieje początkowa podatność, która pozwala na wyciek adresu z heap. - Następnie w funkcjonalności
Org:
iHost:
można wypełnić 64B wskaźnikas
, gdy zostanie zapytane o nazwę org, która na stosie jest następnie śledzona przez adres v2, a następnie wskazaną nazwę hosta. Ponieważ strcpy będzie kopiować zawartość s do chunka o rozmiarze 64B, możliwe jest nadpisanie rozmiaru top chunk danymi umieszczonymi w nazwie hosta. - Teraz, gdy możliwe jest dowolne zapisywanie, GOT
atoi
został nadpisany adresem printf. Następnie możliwe było wyciek adresuIO_2_1_stderr
z%24$p
. I dzięki temu wyciekowi libc możliwe było ponowne nadpisanie GOTatoi
adresemsystem
i wywołanie go, przekazując jako parametr/bin/sh
. - Alternatywna metoda zapropnowana w tym innym rozwiązaniu, polega na nadpisaniu
free
zputs
, a następnie dodaniu adresuatoi@got
w wskaźniku, który zostanie później zwolniony, aby został wycieknięty, a dzięki temu wyciekowi ponownie nadpisaćatoi@got
zsystem
i wywołać go z/bin/sh
. - https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html
- Istnieje UAF, który pozwala na ponowne użycie zwolnionego chunka bez wyczyszczenia wskaźnika. Ponieważ są tu pewne metody odczytu, możliwe jest wyciekanie adresu libc, zapisując wskaźnik do funkcji free w GOT i następnie wywołując funkcję odczytu.
- Następnie, użyto House of force (wykorzystując UAF) do nadpisania rozmiaru pozostałej przestrzeni na -1, alokowania wystarczająco dużego chunka, aby dotrzeć do free hook, a następnie alokowania innego chunka, który będzie zawierał free hook. Następnie, w hooku zapisano adres
system
, w chunku zapisano"/bin/sh"
i na koniec zwolniono chunk z tym zawartością ciągu znaków.