mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/mobile-pentesting/android-app-pentesting/android-an
This commit is contained in:
parent
6acc737122
commit
b3ebc73c5a
@ -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 <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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user