diff --git a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md index 33418b359..ac36d5f48 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md +++ b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -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/root‑blockieren 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 Android‑Apps wiederherzustellen, die Instrumentierung erkennen/root‑blocken 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 anti‑debug: ptrace(), syscalls, anti‑attach, 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 — 30‑second Frida Codeshare tests -Try common drop‑in scripts before deep diving: +Versuche gängige Drop‑in‑Skripte, 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 Prozess‑Spawns/onCreate(). Spawn‑time 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(). Spawn‑time 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 init‑time 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 init‑time 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 Netzwerk‑Konfiguration/CA‑Trust (und Benutzer‑CA‑Trust ab Android 7), siehe: +- Für Netwerkkonfiguration CA‑trust‑Tricks (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 Befehls‑Cheat‑Sheet ```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 Toolkit’s 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 :` 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