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 telegram 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, aby go przetestować, jeśli chcesz.
Cel
- Celem tego ataku jest możliwość alokacji fragmentu pamięci pod konkretnym adresem.
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 zrobić 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, aby przenieść top chunk na tę pozycję. 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 target - old_top - 4*sizeof(long)
(4 longi, ponieważ metadane top chunka i nowego chunka po alokacji) przesuniemy top chunka pod adres, który chcemy nadpisać.
Następnie wykonujemy kolejne malloc, aby uzyskać chunk zawierający na początku dane 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.
- W binarnym pliku istnieje przepełnienie, które można wykorzystać do zmodyfikowania rozmiaru top chunka, 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 chunka 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 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
Input your name:
istnieje początkowa podatność, która pozwala na wyciek adresu z heapa. - Następnie w funkcjonalności
Org:
iHost:
można wypełnić 64B wskaźnikas
podczas pytania 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 chunka danymi wprowadzonymi w nazwie hosta. - Teraz, gdy możliwe jest dowolne zapisywanie, GOT
atoi
został nadpisany adresem printf. Następnie możliwe było wyciekanie adresuIO_2_1_stderr
z%24$p
. 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 z tym wyciekiem ponowne nadpisanieatoi@got
zsystem
i wywołanie 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ż istnieją pewne metody odczytu, możliwe jest wyciekanie adresu libc poprzez zapisanie wskaźnika do funkcji free w GOT i następnie wywołanie funkcji 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.