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

This commit is contained in:
Translator 2025-09-29 12:17:19 +00:00
parent 2abaa79e39
commit 6345ba9b3b

View File

@ -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
- Antidebug natif : ptrace(), syscalls, antiattach, 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 antidebug: ptrace(), syscalls, antiattach, 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 Spawntime 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(). Spawntime 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 antidebug simple dans libc:
Exemple : neutraliser ptrace pour contourner un simple antidebug 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 ; assurezvous davoir 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 inittime 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 CAtrust (et Android 7+ user CA trust), voir :
- Pour les astuces de configuration réseau CAtrust (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 rerun 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 — attendezvous à 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/)