Translated ['', 'src/mobile-pentesting/android-app-pentesting/android-an

This commit is contained in:
Translator 2025-09-29 12:45:02 +00:00
parent 6acc737122
commit b3ebc73c5a

View File

@ -2,11 +2,11 @@
{{#include ../../banners/hacktricks-training.md}}
Diese Seite bietet einen praktischen Workflow, um die dynamische Analyse gegen Android-Apps wiederherzustellen, die Instrumentation erkennen/rootblockieren oder TLS pinning erzwingen. Der Fokus liegt auf schneller Triage, häufigen Erkennungen und kopierbaren Hooks/Taktiken, um diese nach Möglichkeit ohne Repacking zu umgehen.
Diese Seite bietet einen praktischen Workflow, um die dynamische Analyse gegen AndroidApps wiederherzustellen, die Instrumentierung erkennen/rootblocken oder TLS pinning erzwingen. Der Fokus liegt auf schneller Triage, typischen Erkennungen und kopierbaren Hooks/Taktiken, um sie möglichst ohne Repacking zu umgehen.
## Detection Surface (what apps check)
- Root-Checks: su binary, Magisk paths, getprop values, common root packages
- Root checks: su binary, Magisk paths, getprop values, common root packages
- Frida/debugger checks (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs
- Native antidebug: ptrace(), syscalls, antiattach, breakpoints, inline hooks
- Early init checks: Application.onCreate() or process start hooks that crash if instrumentation is present
@ -25,7 +25,7 @@ References:
## Step 2 — 30second Frida Codeshare tests
Try common dropin scripts before deep diving:
Versuche gängige DropinSkripte, bevor du tiefer einsteigst:
- anti-root-bypass.js
- anti-frida-detection.js
@ -35,7 +35,7 @@ Example:
```bash
frida -U -f com.example.app -l anti-frida-detection.js
```
Diese ersetzen typischerweise Java root/debug-Prüfungen, Prozess-/Service-Scans und native ptrace()-Aufrufe durch Stubs. Nützlich bei leicht geschützten Apps; gehärtete Ziele benötigen möglicherweise maßgeschneiderte Hooks.
Diese implementieren typischerweise Stubs für Java root/debug checks, process/service scans und native ptrace(). Nützlich bei leicht geschützten Apps; gehärtete Targets benötigen möglicherweise maßgeschneiderte Hooks.
- Codeshare: https://codeshare.frida.re/
@ -54,22 +54,22 @@ use http_communications/multiple_unpinner
use root_detection/universal_root_detection_bypass
run com.target.app
```
Tipp: Medusa ist großartig für schnelle Erfolge, bevor du eigene hooks schreibst. Du kannst auch modules gezielt auswählen und mit deinen eigenen scripts kombinieren.
Tipp: Medusa ist großartig für schnelle Erfolge, bevor du custom hooks schreibst. Du kannst auch modules gezielt auswählen und mit deinen eigenen scripts kombinieren.
## Schritt 3 — Detektoren zur Initialisierungszeit umgehen durch spätes Anhängen
## Schritt 3 — Bypass init-time detectors by attaching late
Viele Erkennungen laufen nur während des ProzessSpawns/onCreate(). Spawntime injection (-f) oder gadgets werden erwischt; spätes Anhängen, nachdem die UI geladen ist, kann unbemerkt vorbeischlüpfen.
Viele detections laufen nur während process spawn/onCreate(). Spawntime injection (-f) oder gadgets werden dabei erwischt; wenn du erst nach dem Laden der UI attachst, kannst du dagegen durchrutschen.
```bash
# Launch the app normally (launcher/adb), wait for UI, then attach
frida -U -n com.example.app
# Or with Objection to attach to running process
aobjection --gadget com.example.app explore # if using gadget
```
Wenn das funktioniert, halte die Sitzung stabil und fahre mit map- und stub-Checks fort.
Wenn das funktioniert, halte die Session stabil und fahre mit map und stub checks fort.
## Schritt 4 — Erkennungslogik mit Jadx und string hunting kartieren
## Schritt 4 — Detection-Logik mit Jadx und String-Hunting abbilden
Statische Triage-Schlüsselwörter in Jadx:
Statische Triage-Keywords in Jadx:
- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger"
Typische Java-Muster:
@ -78,16 +78,16 @@ public boolean isFridaDetected() {
return getRunningServices().contains("frida");
}
```
Häufige APIs zur Überprüfung/Hook:
Gängige APIs zum review/hook:
- android.os.Debug.isDebuggerConnected
- android.app.ActivityManager.getRunningAppProcesses / getRunningServices
- java.lang.System.loadLibrary / System.load (Native-Bridge)
- java.lang.Runtime.exec / ProcessBuilder (Prüf-/Erkennungsbefehle)
- android.os.SystemProperties.get (Root-/Emulator-Heuristiken)
- java.lang.System.loadLibrary / System.load (native bridge)
- java.lang.Runtime.exec / ProcessBuilder (probing commands)
- android.os.SystemProperties.get (root/emulator heuristics)
## Schritt 5 — Runtime stubbing mit Frida (Java)
Überschreibe benutzerdefinierte Guards, damit sie sichere Werte zurückgeben, ohne repacking:
Override custom guards, um sichere Werte zurückzugeben, ohne repacking:
```js
Java.perform(() => {
const Checks = Java.use('com.example.security.Checks');
@ -102,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager');
AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); };
});
```
Frühzeitige Abstürze triagieren? Dump die Klassen kurz bevor die App abstürzt, um wahrscheinliche Detection-Namespaces zu erkennen:
Frühe Abstürze triagieren? Dump classes kurz bevor es abstürzt, um wahrscheinliche Detection-Namespaces zu erkennen:
```js
Java.perform(() => {
Java.enumerateLoadedClasses({
@ -119,7 +119,7 @@ RootChecker.isDeviceRooted.implementation = function () { return false; };
} catch (e) {}
});
Protokolliere und deaktiviere verdächtige Methoden, um den Ausführungsfluss zu bestätigen:
Protokolliere und neutralisiere verdächtige Methoden, um den Ausführungsfluss zu bestätigen:
```js
Java.perform(() => {
const Det = Java.use('com.example.security.DetectionManager');
@ -131,7 +131,7 @@ return false;
```
## Bypass emulator/VM detection (Java stubs)
Gängige Heuristiken: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE, die generic/goldfish/ranchu/sdk enthalten; QEMU-Artefakte wie /dev/qemu_pipe, /dev/socket/qemud; Standard-MAC 02:00:00:00:00:00; 10.0.2.x NAT; fehlende telephony/sensors.
Gängige Heuristiken: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE mit generic/goldfish/ranchu/sdk; QEMU-Artefakte wie /dev/qemu_pipe, /dev/socket/qemud; Standard-MAC 02:00:00:00:00:00; 10.0.2.x NAT; fehlende telephony/Sensoren.
Schnelles Spoofing der Build-Felder:
```js
@ -143,7 +143,7 @@ Build.BRAND.value = 'google';
Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys';
});
```
Ergänze Stub-Implementierungen für Datei-Existenzprüfungen und Identifikatoren (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList), damit realistische Werte zurückgegeben werden.
Ergänze Stub-Implementierungen für Dateiexistenzprüfungen und Identifikatoren (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList), damit realistische Werte zurückgegeben werden.
## SSL pinning bypass quick hook (Java)
@ -166,23 +166,23 @@ return SSLContextInit.call(this, km, TrustManagers, sr);
});
```
Hinweise
- Für OkHttp erweitern: hook okhttp3.CertificatePinner und HostnameVerifier bei Bedarf, oder verwende ein universelles unpinning script von CodeShare.
- Beispiel ausführen: `frida -U -f com.target.app -l ssl-bypass.js --no-pause`
- Für OkHttp erweitern: hook okhttp3.CertificatePinner und HostnameVerifier nach Bedarf, oder verwende ein universelles unpinning script von CodeShare.
- Run example: `frida -U -f com.target.app -l ssl-bypass.js --no-pause`
## Schritt 6 — Der JNI/native-Spur folgen, wenn Java hooks fehlschlagen
## Schritt 6 — Follow the JNI/native trail when Java hooks fail
Verfolge JNI-Einstiegspunkte, um native Loader und Detection-Init zu lokalisieren:
Verfolge JNI-Einstiegspunkte, um native Loader und die Detektionsinitialisierung zu lokalisieren:
```bash
frida-trace -n com.example.app -i "JNI_OnLoad"
```
Schnelle native Triage der gebündelten .so-Dateien:
Schnelle native Triage von gebündelten .so files:
```bash
# List exported symbols & JNI
nm -D libfoo.so | head
objdump -T libfoo.so | grep Java_
strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root'
```
Interaktives/native reversing:
Interaktive/native reversing:
- Ghidra: https://ghidra-sre.org/
- r2frida: https://github.com/nowsecure/r2frida
@ -202,28 +202,28 @@ reversing-native-libraries.md
## Schritt 7 — Objection patching (embed gadget / strip basics)
Wenn du repacking gegenüber runtime hooks bevorzugst, versuche:
Wenn Sie repacking runtime hooks vorziehen, versuchen Sie:
```bash
objection patchapk --source app.apk
```
Hinweise:
- Erfordert apktool; stelle sicher, dass du eine aktuelle Version gemäß der offiziellen Anleitung verwendest, um Build-Probleme zu vermeiden: https://apktool.org/docs/install
- Gadget injection ermöglicht instrumentation ohne Root, kann aber dennoch von stärkeren inittime checks erkannt werden.
- Benötigt apktool; stelle eine aktuelle Version gemäß der offiziellen Anleitung sicher, um Build-Probleme zu vermeiden: https://apktool.org/docs/install
- Gadget injection ermöglicht instrumentation ohne root, kann jedoch immer noch von stärkeren inittime checks erkannt werden.
Optional kannst du LSPosed-Module und Shamiko hinzufügen, um stärkeres root hiding in Zygisk-Umgebungen zu erreichen, und die DenyList pflegen, um Child-Prozesse abzudecken.
Optional: Füge LSPosed-Module und Shamiko hinzu, um Root-Hiding in Zygisk-Umgebungen zu verstärken, und kuratiere die DenyList so, dass auch child processes abgedeckt sind.
Referenzen:
- Objection: https://github.com/sensepost/objection
## Schritt 8 — Fallback: TLS pinning patchen für Netzwerksichtbarkeit
## Schritt 8 — Fallback: Patch TLS pinning für Netzwerk-Sichtbarkeit
Wenn instrumentation blockiert ist, kannst du den Traffic trotzdem untersuchen, indem du das Pinning statisch entfernst:
Wenn instrumentation blockiert ist, kannst du den Traffic trotzdem untersuchen, indem du pinning statisch entfernst:
```bash
apk-mitm app.apk
# Then install the patched APK and proxy via Burp/mitmproxy
```
- Tool: https://github.com/shroudedcode/apk-mitm
- Für Tricks zur NetzwerkKonfiguration/CATrust (und BenutzerCATrust ab Android 7), siehe:
- Für Netwerkkonfiguration CAtrustTricks (und Android 7+ user CA trust), siehe:
{{#ref}}
make-apk-accept-ca-certificate.md
@ -233,7 +233,7 @@ make-apk-accept-ca-certificate.md
install-burp-certificate.md
{{#endref}}
## Praktische Befehlsübersicht
## Nützliche BefehlsCheatSheet
```bash
# List processes and attach
frida-ps -Uai
@ -251,12 +251,30 @@ objection --gadget com.example.app explore
# Static TLS pinning removal
apk-mitm app.apk
```
## Tipps & Hinweise
## Universal proxy forcing + TLS unpinning (HTTP Toolkit Frida hooks)
- Bevorzuge late attaching gegenüber spawning, wenn Apps beim Launch abstürzen
- Einige Detections laufen in kritischen Flows (z. B. payment, auth) erneut — halte hooks während der Navigation aktiv
- Kombiniere static und dynamic: string hunt in Jadx, um Klassen vorzuselektieren; hook dann Methoden, um sie zur runtime zu verifizieren
- Hardened apps können packers und native TLS pinning verwenden — erwarte, nativen Code zu reverse-engineeren
Moderne Apps ignorieren häufig System-Proxies und erzwingen mehrere Pinning-Ebenen (Java + native), wodurch das Erfassen von Traffic mühsam wird, selbst wenn user/system CAs installiert sind. Ein praktischer Ansatz ist, universelles TLS unpinning mit Proxy-Forcing über fertige Frida-Hooks zu kombinieren und alles über mitmproxy/Burp zu routen.
Workflow
- Starte mitmproxy auf deinem Host (oder Burp). Stelle sicher, dass das Gerät die Host IP/port erreichen kann.
- Lade HTTP Toolkits konsolidierte Frida-Hooks, um sowohl TLS unpinning durchzuführen als auch die Proxy-Nutzung in gängigen Stacks zu erzwingen (OkHttp/OkHttp3, HttpsURLConnection, Conscrypt, WebView, etc.). Das umgeht CertificatePinner/TrustManager-Prüfungen und überschreibt Proxy-Selectoren, sodass der Traffic immer über deinen Proxy geleitet wird, selbst wenn die App Proxies explizit deaktiviert.
- Starte die Ziel-App mit Frida und dem Hook-Skript und zeichne die Requests in mitmproxy auf.
Beispiel
```bash
# Device connected via ADB or over network (-U)
# See the repo for the exact script names & options
frida -U -f com.vendor.app \
-l ./android-unpinning-with-proxy.js \
--no-pause
# mitmproxy listening locally
mitmproxy -p 8080
```
Hinweise
- Mit einem systemweiten Proxy über `adb shell settings put global http_proxy <host>:<port>` kombinieren, wenn möglich. Die Frida hooks erzwingen die Proxy-Nutzung selbst dann, wenn Apps die globalen Einstellungen umgehen.
- Diese Technik ist ideal, wenn Sie MITM mobile-to-IoT onboarding flows benötigen, bei denen pinning/proxy avoidance häufig vorkommt.
- Hooks: https://github.com/httptoolkit/frida-interception-and-unpinning
## Referenzen