House of Force
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ta technika została załatana (tutaj) i generuje ten błąd: malloc(): corrupted top size
Możesz spróbować kodu stąd, aby go przetestować, jeśli chcesz.
Celem tego ataku jest możliwość przydzielenia kawałka pamięci pod określonym adresem.
Przepełnienie, które pozwala na nadpisanie rozmiaru nagłówka górnego kawałka (np. -1).
Możliwość kontrolowania rozmiaru przydzielania pamięci na stercie.
Jeśli atakujący chce przydzielić kawałek pamięci pod adresem P, aby nadpisać wartość tutaj. Zaczyna od nadpisania rozmiaru górnego kawałka wartością -1
(może za pomocą przepełnienia). To zapewnia, że malloc nie będzie używał mmap do żadnego przydziału, ponieważ górny kawałek zawsze będzie miał wystarczająco dużo miejsca.
Następnie oblicza odległość między adresem górnego kawałka a docelową przestrzenią do przydzielenia. Dzieje się tak, ponieważ malloc o tym rozmiarze zostanie wykonany w celu przeniesienia górnego kawałka na tę pozycję. W ten sposób różnica/rozmiar może być łatwo obliczona:
Zatem, przydzielenie rozmiaru target - old_top - 4*sizeof(long)
(4 longi są potrzebne z powodu metadanych górnego kawałka i nowego kawałka podczas alokacji) przeniesie górny kawałek do adresu, który chcemy nadpisać.
Następnie, wykonaj kolejne malloc, aby uzyskać kawałek pod docelowym adresem.
Celem tego scenariusza jest ret2win, w którym musimy zmodyfikować adres funkcji, która ma być wywołana przez adres funkcji ret2win
Program binarny ma przepełnienie, które można wykorzystać do modyfikacji rozmiaru górnego kawałka, który jest zmieniany na -1 lub p64(0xffffffffffffffff)
Następnie oblicza się adres miejsca, w którym znajduje się wskaźnik do nadpisania, a różnica od bieżącej pozycji górnego kawałka do tego miejsca jest alokowana za pomocą malloc
Na koniec alokowany jest nowy kawałek, który będzie zawierał ten pożądany cel wewnątrz, który jest nadpisywany przez funkcję ret2win
W Input your name:
znajduje się początkowa luka, która pozwala na wyciek adresu z heap
Następnie w funkcjonalności Org:
i Host:
możliwe jest wypełnienie 64B wskaźnika s
, gdy zapytano o nazwa organizacji, która w stosie jest następnie śledzona przez adres v2, który jest następnie śledzony przez wskazaną nazwę hosta. Ponieważ następnie, strcpy będzie kopiować zawartość s do kawałka o rozmiarze 64B, możliwe jest nadpisanie rozmiaru górnego kawałka danymi umieszczonymi w nazwie hosta.
Teraz, gdy możliwe jest dowolne zapisanie, GOT atoi
został nadpisany adresem printf. Następnie możliwe było wyciekanie adresu IO_2_1_stderr
z %24$p
. A z tym wyciekiem libc możliwe było ponowne nadpisanie GOT atoi
adresem do system
i wywołanie go, przekazując jako parametr /bin/sh
Alternatywna metoda proponowana w tym innym opisie polega na nadpisaniu free
z puts
, a następnie dodaniu adresu atoi@got
, w wskaźniku, który później zostanie zwolniony, aby został wycieknięty, a z tym wyciekiem ponownie nadpisać atoi@got
z system
i wywołać go z /bin/sh
.
Istnieje UAF, który pozwala na ponowne użycie kawałka, który został zwolniony bez wyczyszczenia wskaźnika. Ponieważ istnieją pewne metody odczytu, możliwe jest wyciekanie adresu libc, zapisując wskaźnik do funkcji free w GOT tutaj, a następnie wywołując funkcję odczytu.
Następnie, House of force został użyty (wykorzystując UAF) do nadpisania rozmiaru pozostałej przestrzeni na -1, alokowania kawałka wystarczająco dużego, aby dotrzeć do hooka free, a następnie alokowania kolejnego kawałka, który będzie zawierał hook free. Następnie, zapisz w hooku adres system
, zapisz w kawałku "/bin/sh"
i na koniec zwolnij kawałek z tą zawartością ciągu.
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)