.. | ||
tools | ||
elf-tricks.md | ||
README.md |
Podstawowa Metodologia Eksploatacji Binarnych
Dowiedz się, jak hakować 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ź PLANY SUBSKRYPCYJNE!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej albo śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud na GitHubie.
Podstawowe Informacje o ELF
Zanim zaczniesz eksploatować cokolwiek, warto zrozumieć część struktury binarnego pliku ELF:
{% content-ref url="elf-tricks.md" %} elf-tricks.md {% endcontent-ref %}
Narzędzia Eksploatacji
{% content-ref url="tools/" %} narzędzia {% endcontent-ref %}
Metodologia Przepełnienia Stosu
Z 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. Sposoby obejścia zabezpieczeń można znaleźć w każdej sekcji zabezpieczeń, ale nie w tej metodologii.
Kontrolowanie Przepływu
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.
- Być może trzeba wykorzystać Przepełnienia Liczb Całkowitych, aby spowodować przepełnienie.
- Lub poprzez Arbitrary Writes + Write What Where to Execution
- Formatowanie łańcuchów: Wykorzystanie
printf
do zapisywania dowolnej zawartości pod dowolnymi adresami. - Indeksowanie Tablic: Wykorzystanie źle zaprojektowanego indeksowania, aby móc kontrolować niektóre tablice i uzyskać dowolny zapis.
- Być może trzeba wykorzystać Przepełnienia Liczb Całkowitych, aby spowodować przepełnienie
- bof to WWW via ROP: Wykorzystanie przepełnienia bufora do skonstruowania ROP i uzyskania WWW.
Techniki Write What Where to Execution można znaleźć w:
{% content-ref url="../arbitrary-write-2-exec/" %} arbitrary-write-2-exec {% endcontent-ref %}
Wieczne Pętle
Warto wziąć pod uwagę, że zazwyczaj jedna eksploatacja podatności może nie wystarczyć do wykonania udanego ataku, zwłaszcza gdy trzeba ominąć pewne zabezpieczenia. 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, gdzie 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) adres, aby wrócić 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
.
Cele Eksploatacji
Cel: Wywołanie Istniejącej Funkcji
- ret2win: Istnieje funkcja w kodzie, którą musisz wywołać (być może z określonymi parametrami), aby uzyskać flagę.
- W zwykłym przepełnieniu bufora bez PIE i canary, wystarczy zapisać adres w adresie powrotu przechowywanym na stosie.
- 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 jest wystarczająco dużo gadżetów, aby przygotować wszystkie parametry
- SROP (jeśli można wywołać ten syscall) do kontrolowania wielu rejestrów
- Gadżetów z ret2csu i ret2vdso do kontrolowania kilku rejestrów
- Poprzez Write What Where można wykorzystać 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.
- ASLR lub PIE mogą wpłynąć na adresy.
- Nie zainicjowane zmienne: Nigdy nie wiesz.
Cel: RCE
Poprzez shellcode, jeśli nx jest wyłączone lub łączenie shellcode z ROP:
- (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 trzeba go ominąć (wyciek).
- Bez ASLR i nx można skoczyć pod adres stosu, ponieważ nie zmieni się on nigdy
- Z ASLR będziesz musiał użyć technik takich jak ret2esp/ret2reg, aby skoczyć do niego
- Z nx, będziesz musiał użyć pewnego ROP do wywołania
memprotect
i uczynienia pewnej stronyrwx
, aby następnie przechować tam shellcode (wywołując na przykład read) i potem skoczyć tam. - To połączy shellcode z łańcuchem ROP.
Za pomocą wywołań systemowych
- 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. - Jeśli są włączone ASLR lub PIE, będziesz musiał je pokonać, aby użyć gadżetów ROP z binariów lub bibliotek.
- SROP może być przydatne do przygotowania ret2execve.
- Gadżety z ret2csu i ret2vdso do kontrolowania kilku rejestrów
Za pomocą libc
- Ret2lib: Przydatne do wywołania funkcji z biblioteki (zazwyczaj z
libc
) jaksystem
z przygotowanymi argumentami (np.'/bin/sh'
). Potrzebujesz, aby binarny załadował bibliotekę z funkcją, którą chcesz wywołać (zazwyczaj libc). - Jeśli jest skompilowany statycznie i nie ma 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. - Z ASLR ale bez PIE, znając libc i z binarnym używającym funkcji
system
, możnaret
do adresu systemu w GOT z adresem'/bin/sh'
w parametrze (trzeba to ustalić). - Z ASLR ale bez PIE, znając libc i bez użycia binarnego
system
: - Użyj
ret2dlresolve
do rozwiązania adresusystem
i jego wywołania - Ominięcie ASLR i obliczenie adresu
system
i'/bin/sh'
w pamięci. - Z ASLR i PIE i nie znając wersji libc: Musisz:
- Ominąć PIE
- Znaleźć używaną wersję libc (wyciek kilku adresów funkcji)
- Sprawdź poprzednie scenariusze z ASLR, aby kontynuować.
Za pomocą EBP/RBP
- 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
Różne
- 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żliwe jest nadpisanie tego adresu.
- ASLR lub PIE mogą wpłynąć na adresy.
- Nie zainicjowane zmienne: Nigdy nie wiesz
Naucz się hakować 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ź PLANY SUBSKRYPCYJNE!
- 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 hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.