Basic Stack Binary Exploitation Methodology
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)
Zanim zaczniesz eksploatować cokolwiek, warto zrozumieć część struktury binarnego pliku ELF:
ELF Basic InformationZ tak wieloma technikami dobrze jest mieć schemat, kiedy każda technika będzie przydatna. Zauważ, że te same zabezpieczenia będą wpływać na różne techniki. Możesz znaleźć sposoby na obejście zabezpieczeń w każdej sekcji zabezpieczeń, ale nie w tej metodologii.
Istnieje kilka sposobów, w jaki można kontrolować przepływ programu:
Przepełnienia Stosu nadpisywanie wskaźnika powrotu ze stosu lub EBP -> ESP -> EIP.
Może być konieczne nadużycie Przepełnień Liczb Całkowitych, aby spowodować przepełnienie.
Lub za pomocą Arbitrary Writes + Write What Where to Execution
Formatowanie łańcuchów: Nadużyj printf
, aby zapisać dowolne treści pod dowolnymi adresami.
Indeksowanie Tablic: Nadużyj źle zaprojektowane indeksowanie, aby móc kontrolować niektóre tablice i uzyskać dowolny zapis.
Może być konieczne nadużycie Przepełnień Liczb Całkowitych, aby spowodować przepełnienie
bof to WWW via ROP: Nadużyj przepełnienie bufora, aby skonstruować ROP i móc uzyskać WWW.
Techniki Write What Where to Execution znajdziesz w:
Write What Where 2 ExecCo należy wziąć pod uwagę, to że zazwyczaj jedna eksploatacja podatności może nie wystarczyć do wykonania udanego ataku, zwłaszcza gdy konieczne jest obejście pewnych zabezpieczeń. Dlatego interesujące jest omówienie kilku opcji, aby umożliwić wielokrotne wykorzystanie jednej podatności w tym samym wykonaniu binarnego pliku:
Zapisz w łańcuchu ROP adres funkcji main
lub adres, w którym występuje podatność.
Kontrolując odpowiedni łańcuch ROP, możesz wykonać wszystkie akcje w tym łańcuchu.
Zapisz adres exit
w GOT (lub dowolnej innej funkcji używanej przez binarny plik przed zakończeniem) adresu powrotu do powrotu do podatności.
Jak wyjaśniono w .fini_array, przechowuj tutaj 2 funkcje, jedną do ponownego wywołania podatności i drugą do wywołania**__libc_csu_fini
**, która ponownie wywoła funkcję z .fini_array
.
ret2win: Istnieje funkcja w kodzie, którą musisz wywołać (być może z określonymi parametrami), aby uzyskać flagę.
W przypadku przepełnienia bufora z PIE, będziesz musiał je ominąć.
W przypadku przepełnienia bufora z canary, będziesz musiał je ominąć.
Jeśli musisz ustawić kilka parametrów, aby poprawnie wywołać funkcję ret2win, możesz użyć:
Łańcucha ROP jeśli istnieje wystarczająco wiele gadżetów, aby przygotować wszystkie parametry
SROP (jeśli możesz wywołać ten syscall) do kontrolowania wielu rejestrów
Za pomocą Write What Where możesz nadużyć inne podatności (nie bof), aby wywołać funkcję win
.
Przekierowywanie Wskaźników: W przypadku, gdy stos zawiera wskaźniki do funkcji, która ma zostać wywołana lub do ciągu znaków, który ma być użyty przez interesującą funkcję (system lub printf), można nadpisać ten adres.
Nie zainicjowane zmienne: Nigdy nie wiesz.
(Stack) Shellcode: Jest to przydatne do przechowywania shellcode'u na stosie przed lub po nadpisaniu wskaźnika powrotu, a następnie skok do niego w celu wykonania:
W każdym przypadku, jeśli jest canary, w zwykłym przepełnieniu bufora będziesz musiał je ominąć (wyciek).
Z ASLR będziesz musiał użyć technik takich jak ret2esp/ret2reg do skoku do niego
To połączy shellcode z łańcuchem ROP.
Ret2syscall: Przydatne do wywołania execve
w celu uruchomienia dowolnych poleceń. Musisz być w stanie znaleźć gadżety do wywołania określonego wywołania systemowego z parametrami.
SROP może być przydatne do przygotowania ret2execve.
Ret2lib: Przydatne do wywołania funkcji z biblioteki (zazwyczaj z libc
) jak system
z przygotowanymi argumentami (np. '/bin/sh'
). Potrzebujesz, aby binarny załadował bibliotekę z funkcją, którą chcesz wywołać (zazwyczaj libc).
Jeśli skompilowano statycznie i brak PIE, adres system
i /bin/sh
nie zmienią się, więc można ich użyć statycznie.
Bez ASLR i znając wersję libc załadowaną, adres system
i /bin/sh
nie zmienią się, więc można ich użyć statycznie.
Użyj ret2dlresolve
, aby rozwiązać adres system
i go wywołać.
Ominięcie ASLR i obliczenie adresu system
i '/bin/sh'
w pamięci.
Ominąć PIE
Znaleźć używaną wersję libc (wyciek kilku adresów funkcji)
Sprawdź poprzednie scenariusze z ASLR, aby kontynuować.
Stack Pivoting / EBP2Ret / EBP Chaining: Kontroluj ESP, aby kontrolować RET poprzez przechowywane EBP na stosie.
Przydatne do przepełnień stosu off-by-one
Przydatne jako alternatywny sposób na kontrolowanie EIP, wykorzystując EIP do konstruowania ładunku w pamięci, a następnie skakania do niego za pomocą EBP
Przekierowywanie wskaźników: W przypadku, gdy stos zawiera wskaźniki do funkcji, która ma zostać wywołana lub do ciągu znaków, który ma być użyty przez interesującą funkcję (system lub printf), można nadpisać ten adres.
Nie zainicjowane zmienne: Nigdy nie wiesz
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)