House of Force
Last updated
Last updated
Dowiedz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Dowiedz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
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ć.
Celem tego ataku jest możliwość alokacji fragmentu pamięci w określonym adresie.
Przepełnienie, które pozwala nadpisać rozmiar nagłówka top chunk (np. -1).
Możliwość kontrolowania rozmiaru alokacji sterty
Jeśli atakujący chce zaalokować fragment pamięci pod adresem P, aby nadpisać wartość tutaj. Zaczyna od nadpisania rozmiaru top chunk -1
(może to być z przepełnieniem). 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 docelową przestrzenią do alokacji. Jest to konieczne, ponieważ malloc o takim rozmiarze zostanie wykonany, aby przenieść top chunk na tę pozycję. Tak można łatwo obliczyć różnicę/rozmiar:
Dlatego przydzielenie rozmiaru target - old_top - 4*sizeof(long)
(4 longi, ponieważ metadane top chunk i nowego chunka są przydzielane) spowoduje przeniesienie top chunka pod adres, który chcemy nadpisać. Następnie wykonujemy kolejne malloc, aby uzyskać chunka pod docelowym adresem.
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 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 między bieżącą pozycją top chunka a tam jest alokowana za pomocą malloc
.
W końcu alokowany jest nowy chunk, który będzie zawierał ten pożądany cel, wewnątrz którego zostanie nadpisany funkcją ret2win.
W Wprowadź swoje imię:
istnieje początkowa podatność, która pozwala na wyciek adresu z heapa.
Następnie w funkcjonalności Org:
i Host:
można wypełnić 64B wskaźnika s
, gdy zostanie zapytane o nazwę org, która na stosie jest następnie śledzona przez adres v2, a następnie przez 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 pisanie, GOT atoi
został nadpisany adresem printf. Następnie możliwe było wyciekanie adresu IO_2_1_stderr
z %24$p
. Dzięki temu wyciekowi libc możliwe było ponowne nadpisanie GOT atoi
adresem system
i wywołanie go, przekazując jako parametr /bin/sh
.
Alternatywna metoda zapropnowana w tym innym rozwiązaniu, polega na nadpisaniu free
z puts
, a następnie dodaniu adresu atoi@got
do wskaźnika, który zostanie później zwolniony, aby został wycieknięty, a z tym wyciekiem ponowne nadpisanie atoi@got
z system
i wywołanie go z /bin/sh
.
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, 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, zaalokowania wystarczająco dużego chunka, aby dotrzeć do free hook, a następnie zaalokowania innego chunka, który będzie zawierał free hook. Następnie, w hooku zapisano adres system
, w chunku "/bin/sh"
i ostatecznie zwolniono chunk z tym zawartością ciągu znaków.