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
2abaa79e39
commit
6345ba9b3b
@ -6,11 +6,11 @@ This page provides a practical workflow to regain dynamic analysis against Andro
|
||||
|
||||
## Detection Surface (what apps check)
|
||||
|
||||
- Vérifications de root : binaire su, chemins Magisk, valeurs getprop, packages root courants
|
||||
- Vérifications Frida/debugger (Java) : Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), analyse de /proc, classpath, bibliothèques chargées
|
||||
- Anti‑debug natif : ptrace(), syscalls, anti‑attach, breakpoints, inline hooks
|
||||
- Vérifications d'initialisation précoce : Application.onCreate() ou hooks de démarrage de processus qui plantent si instrumentation est présente
|
||||
- TLS pinning : TrustManager/HostnameVerifier personnalisés, OkHttp CertificatePinner, Conscrypt pinning, pinning natifs
|
||||
- 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
|
||||
- TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins
|
||||
|
||||
## Step 1 — Quick win: hide root with Magisk DenyList
|
||||
|
||||
@ -35,13 +35,13 @@ Example:
|
||||
```bash
|
||||
frida -U -f com.example.app -l anti-frida-detection.js
|
||||
```
|
||||
Ils neutralisent généralement les vérifications Java de root/debug, les scans de processus/services et l'appel natif ptrace(). Utile sur des applications faiblement protégées ; les cibles durcies peuvent nécessiter des hooks sur mesure.
|
||||
Ces modules stubent typiquement les Java root/debug checks, les process/service scans et le native ptrace(). Utile sur des apps faiblement protégées ; les targets durcies peuvent nécessiter des hooks sur mesure.
|
||||
|
||||
- Codeshare: https://codeshare.frida.re/
|
||||
|
||||
## Automatiser avec Medusa (Frida framework)
|
||||
|
||||
Medusa fournit plus de 90 modules prêts à l'emploi pour SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, et plus encore.
|
||||
Medusa fournit 90+ modules prêts à l'emploi pour SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, et plus encore.
|
||||
```bash
|
||||
git clone https://github.com/Ch0pin/medusa
|
||||
cd medusa
|
||||
@ -54,31 +54,31 @@ use http_communications/multiple_unpinner
|
||||
use root_detection/universal_root_detection_bypass
|
||||
run com.target.app
|
||||
```
|
||||
Tip: Medusa is great for quick wins before writing custom hooks. You can also cherry-pick modules and combine them with your own scripts.
|
||||
Astuce : Medusa est idéal pour des gains rapides avant d'écrire des hooks personnalisés. Vous pouvez aussi cherry-pick des modules et les combiner avec vos propres scripts.
|
||||
|
||||
## Étape 3 — Contourner les détecteurs d'initialisation en s'attachant tard
|
||||
## Étape 3 — Contourner les détecteurs d'initialisation en s'attachant plus tard
|
||||
|
||||
De nombreuses détections ne s'exécutent que lors du process spawn/onCreate(). Les Spawn‑time injection (-f) ou gadgets se font repérer ; en s'attachant après le chargement de l'UI, on peut les contourner.
|
||||
De nombreuses détections ne s'exécutent que lors du spawn du processus/onCreate(). Spawn‑time injection (-f) ou les gadgets se font repérer ; s'attachant après le chargement de l'UI permet souvent de passer outre.
|
||||
```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
|
||||
```
|
||||
Si cela fonctionne, maintenez la session stable et procédez à la cartographie et aux vérifications des stubs.
|
||||
Si cela fonctionne, maintenez la session stable et poursuivez par la cartographie et les vérifications des stubs.
|
||||
|
||||
## Étape 4 — Cartographier la logique de détection via Jadx et recherche de chaînes
|
||||
|
||||
Mots-clés de triage statique dans Jadx :
|
||||
- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger"
|
||||
|
||||
Modèles Java typiques :
|
||||
Schémas Java typiques :
|
||||
```java
|
||||
public boolean isFridaDetected() {
|
||||
return getRunningServices().contains("frida");
|
||||
}
|
||||
```
|
||||
Common APIs to review/hook:
|
||||
APIs courantes à examiner/hook:
|
||||
- android.os.Debug.isDebuggerConnected
|
||||
- android.app.ActivityManager.getRunningAppProcesses / getRunningServices
|
||||
- java.lang.System.loadLibrary / System.load (native bridge)
|
||||
@ -87,7 +87,7 @@ Common APIs to review/hook:
|
||||
|
||||
## Étape 5 — Runtime stubbing with Frida (Java)
|
||||
|
||||
Surchargez les guards personnalisés pour renvoyer des valeurs sûres sans repacking:
|
||||
Surchargez les gardes personnalisés pour renvoyer des valeurs sûres sans 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(); };
|
||||
});
|
||||
```
|
||||
Triage des crashes précoces ? Dump classes juste avant qu'il ne plante pour repérer les namespaces de détection probables :
|
||||
Triage des plantages précoces ? Dump classes juste avant qu'il ne plante pour repérer les namespaces probablement utilisés pour la détection :
|
||||
```js
|
||||
Java.perform(() => {
|
||||
Java.enumerateLoadedClasses({
|
||||
@ -111,7 +111,6 @@ onComplete: () => console.log('Done')
|
||||
});
|
||||
});
|
||||
```
|
||||
```javascript
|
||||
// Quick root detection stub example (adapt to target package/class names)
|
||||
Java.perform(() => {
|
||||
try {
|
||||
@ -119,9 +118,8 @@ const RootChecker = Java.use('com.target.security.RootCheck');
|
||||
RootChecker.isDeviceRooted.implementation = function () { return false; };
|
||||
} catch (e) {}
|
||||
});
|
||||
```
|
||||
|
||||
Consigner et neutraliser les méthodes suspectes pour confirmer le flux d'exécution :
|
||||
Log et neutraliser les méthodes suspectes pour confirmer le flux d'exécution :
|
||||
```js
|
||||
Java.perform(() => {
|
||||
const Det = Java.use('com.example.security.DetectionManager');
|
||||
@ -131,9 +129,9 @@ return false;
|
||||
};
|
||||
});
|
||||
```
|
||||
## Bypass emulator/VM detection (Java stubs)
|
||||
## Contourner la détection d'émulateur/VM (Java stubs)
|
||||
|
||||
Heuristiques courantes : Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE contenant generic/goldfish/ranchu/sdk ; artefacts QEMU comme /dev/qemu_pipe, /dev/socket/qemud ; MAC par défaut 02:00:00:00:00:00 ; NAT 10.0.2.x ; téléphonie/capteurs manquants.
|
||||
Heuristiques courantes : Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE contenant generic/goldfish/ranchu/sdk ; artefacts QEMU comme /dev/qemu_pipe, /dev/socket/qemud ; MAC par défaut 02:00:00:00:00:00 ; NAT 10.0.2.x ; téléphonie/capteurs absents.
|
||||
|
||||
Falsification rapide des champs Build :
|
||||
```js
|
||||
@ -145,7 +143,7 @@ Build.BRAND.value = 'google';
|
||||
Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys';
|
||||
});
|
||||
```
|
||||
Compléter avec des stubs pour les vérifications d'existence de fichiers et les identifiants (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) afin de renvoyer des valeurs réalistes.
|
||||
Compléter par des stubs pour les vérifications d'existence de fichiers et les identifiants (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) pour retourner des valeurs réalistes.
|
||||
|
||||
## SSL pinning bypass quick hook (Java)
|
||||
|
||||
@ -168,27 +166,27 @@ return SSLContextInit.call(this, km, TrustManagers, sr);
|
||||
});
|
||||
```
|
||||
Remarques
|
||||
- Étendre pour OkHttp : hook okhttp3.CertificatePinner et HostnameVerifier si nécessaire, ou utiliser un script universel d'unpinning depuis CodeShare.
|
||||
- Adapter pour OkHttp : hook okhttp3.CertificatePinner et HostnameVerifier au besoin, ou utilisez un script universel d'unpinning depuis CodeShare.
|
||||
- Exemple d'exécution : `frida -U -f com.target.app -l ssl-bypass.js --no-pause`
|
||||
|
||||
## Étape 6 — Suivre la piste JNI/native lorsque les Java hooks échouent
|
||||
## Étape 6 — Suivre la piste JNI/native lorsque les hooks Java échouent
|
||||
|
||||
Tracer les points d'entrée JNI pour localiser les chargeurs natifs et l'initialisation de la détection :
|
||||
Tracez les points d'entrée JNI pour localiser les loaders natifs et l'initialisation de la détection :
|
||||
```bash
|
||||
frida-trace -n com.example.app -i "JNI_OnLoad"
|
||||
```
|
||||
Triage natif rapide des fichiers .so empaquetés :
|
||||
Triage natif rapide des fichiers .so inclus :
|
||||
```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'
|
||||
```
|
||||
Reversing interactif/natif:
|
||||
Interactif/natif reversing:
|
||||
- Ghidra: https://ghidra-sre.org/
|
||||
- r2frida: https://github.com/nowsecure/r2frida
|
||||
|
||||
Exemple : neutraliser ptrace pour contourner un anti‑debug simple dans libc:
|
||||
Exemple : neutraliser ptrace pour contourner un simple anti‑debug dans libc:
|
||||
```js
|
||||
const ptrace = Module.findExportByName(null, 'ptrace');
|
||||
if (ptrace) {
|
||||
@ -204,28 +202,28 @@ reversing-native-libraries.md
|
||||
|
||||
## Étape 7 — Objection patching (embed gadget / strip basics)
|
||||
|
||||
Si vous préférez repacking aux runtime hooks, essayez :
|
||||
Lorsque vous préférez le repacking aux runtime hooks, essayez :
|
||||
```bash
|
||||
objection patchapk --source app.apk
|
||||
```
|
||||
Notes:
|
||||
- Nécessite apktool ; assurez‑vous d’avoir une version à jour depuis le guide officiel pour éviter des problèmes de build : https://apktool.org/docs/install
|
||||
- Gadget injection permet l'instrumentation sans root mais peut toujours être détecté par des vérifications plus strictes au démarrage.
|
||||
Remarques:
|
||||
- Nécessite apktool; assurez-vous d'une version à jour via le guide officiel pour éviter des problèmes de build: https://apktool.org/docs/install
|
||||
- Gadget injection permet l'instrumentation sans root mais peut toujours être détectée par des init‑time checks plus strictes.
|
||||
|
||||
En option, ajoutez des modules LSPosed et Shamiko pour un masquage du root plus efficace dans les environnements Zygisk, et soignez la DenyList pour couvrir les processus enfants.
|
||||
En option, ajoutez des modules LSPosed et Shamiko pour un root hiding plus efficace dans les environnements Zygisk, et configurez DenyList pour couvrir les child processes.
|
||||
|
||||
References:
|
||||
Références:
|
||||
- Objection: https://github.com/sensepost/objection
|
||||
|
||||
## Étape 8 — Solution de repli : Corriger le TLS pinning pour la visibilité réseau
|
||||
## Étape 8 — Repli : Patch TLS pinning pour la visibilité réseau
|
||||
|
||||
Si l'instrumentation est bloquée, vous pouvez toujours inspecter le trafic en supprimant statiquement le pinning :
|
||||
Si l'instrumentation est bloquée, vous pouvez toujours inspecter le trafic en supprimant le pinning de façon statique :
|
||||
```bash
|
||||
apk-mitm app.apk
|
||||
# Then install the patched APK and proxy via Burp/mitmproxy
|
||||
```
|
||||
- Outil: https://github.com/shroudedcode/apk-mitm
|
||||
- Pour les astuces de configuration réseau CA‑trust (et Android 7+ user CA trust), voir :
|
||||
- Pour les astuces de configuration réseau CA‑trust (et la confiance CA utilisateur Android 7+), voir :
|
||||
|
||||
{{#ref}}
|
||||
make-apk-accept-ca-certificate.md
|
||||
@ -235,7 +233,7 @@ make-apk-accept-ca-certificate.md
|
||||
install-burp-certificate.md
|
||||
{{#endref}}
|
||||
|
||||
## Fiche mémo pratique des commandes
|
||||
## Fiche pratique de commandes utiles
|
||||
```bash
|
||||
# List processes and attach
|
||||
frida-ps -Uai
|
||||
@ -253,14 +251,32 @@ objection --gadget com.example.app explore
|
||||
# Static TLS pinning removal
|
||||
apk-mitm app.apk
|
||||
```
|
||||
## Conseils & mises en garde
|
||||
## Universal proxy forcing + TLS unpinning (HTTP Toolkit Frida hooks)
|
||||
|
||||
- Privilégiez attaching late plutôt que spawning lorsque les apps plantent au lancement
|
||||
- Certaines detections re‑run dans des critical flows (par ex. payment, auth) — gardez les hooks actifs pendant la navigation
|
||||
- Mix static and dynamic : string hunt dans Jadx pour présélectionner des classes ; puis hook methods pour vérifier à runtime
|
||||
- Les apps hardenées peuvent utiliser des packers et native TLS pinning — attendez‑vous à reverse native code
|
||||
Les applications modernes ignorent souvent les proxies système et appliquent plusieurs couches de pinning (Java + native), rendant la capture du trafic difficile même avec les CA utilisateur/système installées. Une approche pratique consiste à combiner universal TLS unpinning avec proxy forcing via des hooks Frida prêts à l'emploi, et à rediriger tout le trafic via mitmproxy/Burp.
|
||||
|
||||
## References
|
||||
Workflow
|
||||
- Exécutez mitmproxy sur votre hôte (ou Burp). Assurez-vous que l'appareil peut atteindre l'IP/port de l'hôte.
|
||||
- Chargez les hooks Frida consolidés de HTTP Toolkit pour à la fois unpin TLS et forcer l'utilisation du proxy sur les stacks courants (OkHttp/OkHttp3, HttpsURLConnection, Conscrypt, WebView, etc.). Cela contourne les vérifications CertificatePinner/TrustManager et remplace les sélecteurs de proxy, de sorte que le trafic est toujours envoyé via votre proxy même si l'app désactive explicitement les proxies.
|
||||
- Démarrez l'app cible avec Frida et le script de hook, puis capturez les requêtes dans mitmproxy.
|
||||
|
||||
Exemple
|
||||
```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
|
||||
```
|
||||
Remarques
|
||||
- Combinez-le avec un proxy système global via `adb shell settings put global http_proxy <host>:<port>` lorsque possible. Les Frida hooks forceront l'utilisation du proxy même lorsque les apps contournent les paramètres globaux.
|
||||
- Cette technique est idéale lorsque vous devez MITM des flux d'onboarding mobile vers IoT où le pinning/évitation du proxy est courant.
|
||||
- Hooks: https://github.com/httptoolkit/frida-interception-and-unpinning
|
||||
|
||||
## Références
|
||||
|
||||
- [Reversing Android Apps: Bypassing Detection Like a Pro](https://www.kayssel.com/newsletter/issue-12/)
|
||||
- [Frida Codeshare](https://codeshare.frida.re/)
|
||||
|
Loading…
x
Reference in New Issue
Block a user