Basic Stack Binary Exploitation Methodology

Zacznij od zera i stań się ekspertem od hakowania AWS dzięki htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe Informacje o ELF

Zanim zaczniesz eksploatować cokolwiek, warto zrozumieć część struktury binarnego pliku ELF:

ELF Basic Information

Narzędzia Eksploatacyjne

Exploiting Tools

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 odpowiednich sekcjach zabezpieczeń, ale nie w tej metodologii.

Kontrolowanie Przepływu

Istnieje kilka sposobów, aby 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 można znaleźć w:

Write What Where 2 Exec

Wieczne Pętle

Warto wziąć pod uwagę, że zazwyczaj jedna eksploatacja podatności może nie wystarczyć do wykonania udanego ataku, zwłaszcza gdy konieczne jest obejście pewnych zabezpieczeń. Dlatego warto omówić kilka 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.

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żesz wywołać ten syscall) do kontrolowania wielu rejestrów

  • Gadżetów z ret2csu i ret2vdso 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 zostać 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

Za pomocą 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 będziesz musiał je ominąć (wyciek).

  • Bez ASLR i nx możliwe jest skok do adresu stosu, ponieważ nigdy się nie zmieni

  • Z ASLR będziesz musiał użyć technik takich jak ret2esp/ret2reg, aby do niego skoczyć

  • Z nx, będziesz musiał użyć pewnego ROP do wywołania memprotect i uczynienia pewnej strony rwx, aby następnie przechować tam shellcode (wywołując np. 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ą biblioteki libc

  • 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.

  • Z ASLR ale bez PIE, znając libc i z binarnym używającym funkcji system jest możliwe ret 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 adresu system 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łnienia stosu o jeden bajt

  • Przydatne jako alternatywny sposób na kontrolowanie EIP, nadużywają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

Last updated