Podstawowa Metodologia Eksploatacji Binarnych

Reading time: 7 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

Podstawowe Informacje o ELF

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

{{#ref}} elf-tricks.md {{#endref}}

Narzędzia Eksploatacyjne

{{#ref}} tools/ {{#endref}}

Metodologia Przepełnienia Stosu

Przy tak wielu technikach 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.

Kontrolowanie Przepływu

Istnieje kilka sposobów, aby kontrolować przepływ programu:

  • Przepełnienia Stosu nadpisujące wskaźnik powrotu ze stosu lub EBP -> ESP -> EIP.
  • Może być konieczne nadużycie Przepełnień Liczbowych, aby spowodować przepełnienie.
  • Lub poprzez Arbitralne Zapisanie + Write What Where to Execution.
  • Format strings: Nadużyj printf, aby zapisać arbitralną zawartość w arbitralnych adresach.
  • Indeksowanie Tablic: Nadużyj źle zaprojektowanego indeksowania, aby móc kontrolować niektóre tablice i uzyskać arbitralne zapisanie.
  • Może być konieczne nadużycie Przepełnień Liczbowych, aby spowodować przepełnienie.
  • bof do WWW poprzez ROP: Nadużyj przepełnienia bufora, aby skonstruować ROP i móc uzyskać WWW.

Możesz znaleźć techniki Write What Where to Execution w:

{{#ref}} ../arbitrary-write-2-exec/ {{#endref}}

Wieczne Pętle

Coś, co należy wziąć pod uwagę, to że zazwyczaj jedna eksploatacja luki może nie być wystarczająca, aby przeprowadzić udaną eksploatację, szczególnie niektóre zabezpieczenia muszą być obejście. Dlatego warto omówić kilka opcji, aby uczynić pojedynczą lukę eksploatowalną wiele razy w tej samej egzekucji binarnej:

  • Zapisz w łańcuchu ROP adres funkcji main lub adres, w którym występuje luka.
  • Kontrolując odpowiedni łańcuch ROP, możesz wykonać wszystkie akcje w tym łańcuchu.
  • Zapisz adres exit w GOT (lub jakiejkolwiek innej funkcji używanej przez binarny przed zakończeniem) adres, aby wrócić do luki.
  • Jak wyjaśniono w .fini_array, przechowuj tutaj 2 funkcje, jedną do ponownego wywołania luki 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ć (może z pewnymi specyficznymi parametrami), aby uzyskać flagę.
  • W zwykłym bof bez PIE i canary wystarczy zapisać adres w adresie powrotu przechowywanym na stosie.
  • W bof z PIE będziesz musiał to obejść.
  • W bof z canary będziesz musiał to obejść.
  • 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 (w przypadku, gdy możesz wywołać ten syscall), aby kontrolować wiele rejestrów.
  • Gadżetów z ret2csu i ret2vdso, aby kontrolować kilka rejestrów.
  • Poprzez Write What Where możesz nadużyć innych luk (nie bof), aby wywołać funkcję win.
  • Przekierowywanie Wskaźników: W przypadku, gdy stos zawiera wskaźniki do funkcji, która ma być wywołana, lub do ciągu, który ma być użyty przez interesującą funkcję (system lub printf), możliwe jest nadpisanie tego adresu.
  • ASLR lub PIE mogą wpływać na adresy.
  • Niezainicjowane zmienne: Nigdy nie wiesz.

Cel: RCE

Poprzez shellcode, jeśli nx wyłączone lub mieszając shellcode z ROP:

  • (Stack) Shellcode: To jest przydatne do przechowywania shellcode na stosie przed lub po nadpisaniu wskaźnika powrotu, a następnie skok do niego, aby go wykonać:
  • W każdym przypadku, jeśli istnieje canary, w zwykłym bof będziesz musiał to obejść (leak).
  • 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ć ROP do wywołania memprotect i uczynić jakąś stronę rwx, aby następnie przechować shellcode tam (wywołując read na przykład) i następnie tam skoczyć.
  • To połączy shellcode z łańcuchem ROP.

Poprzez syscalls

  • Ret2syscall: Przydatne do wywołania execve, aby uruchomić arbitralne polecenia. Musisz być w stanie znaleźć gadżety do wywołania konkretnego syscall z parametrami.
  • Jeśli ASLR lub PIE są włączone, będziesz musiał je pokonać w celu użycia gadżetów ROP z binarnego lub bibliotek.
  • SROP może być przydatne do przygotowania ret2execve.
  • Gadżety z ret2csu i ret2vdso, aby kontrolować kilka rejestrów.

Poprzez libc

  • Ret2lib: Przydatne do wywołania funkcji z biblioteki (zwykle z libc) jak system z pewnymi przygotowanymi argumentami (np. '/bin/sh'). Musisz, aby binarny załadował bibliotekę z funkcją, którą chciałbyś wywołać (zwykle libc).
  • Jeśli skompilowane statycznie i bez PIE, adres system i /bin/sh nie będą się zmieniać, więc możliwe jest ich użycie statycznie.
  • Bez ASLR i znając wersję libc załadowaną, adres system i /bin/sh nie będą się zmieniać, więc możliwe jest ich użycie statycznie.
  • Z ASLR ale bez PIE, znając libc i z binarnym używającym funkcji system możliwe jest ret do adresu system w GOT z adresem '/bin/sh' w parametrze (musisz to ustalić).
  • Z ASLR ale bez PIE, znając libc i bez binarnego używającego system:
  • Użyj ret2dlresolve, aby rozwiązać adres system i go wywołać.
  • Obejdź ASLR i oblicz adres system i '/bin/sh' w pamięci.
  • Z ASLR i PIE i nie znając libc: Musisz:
  • Obejść PIE.
  • Znaleźć wersję libc używaną (wyciek kilku adresów funkcji).
  • Sprawdzić poprzednie scenariusze z ASLR, aby kontynuować.

Poprzez EBP/RBP

  • Pivotowanie Stosu / EBP2Ret / Łańcuchowanie EBP: Kontroluj ESP, aby kontrolować RET poprzez przechowywany EBP na stosie.
  • Przydatne dla off-by-one przepełnień stosu.
  • Przydatne jako alternatywny sposób na kontrolowanie EIP, nadużywając EIP do skonstruowania ładunku w pamięci, a następnie skacząc do niego poprzez EBP.

Różne

  • Przekierowywanie Wskaźników: W przypadku, gdy stos zawiera wskaźniki do funkcji, która ma być wywołana, lub do ciągu, który ma być użyty przez interesującą funkcję (system lub printf), możliwe jest nadpisanie tego adresu.
  • ASLR lub PIE mogą wpływać na adresy.
  • Niezainicjowane zmienne: Nigdy nie wiesz.

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks