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/react-native-a
This commit is contained in:
parent
7de6cf9887
commit
a08ace500d
@ -1,6 +1,6 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
# Analyse de l'application React Native
|
||||
|
||||
# Analyse d'application React Native
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Pour confirmer si l'application a été construite sur le framework React Native, suivez ces étapes :
|
||||
|
||||
@ -10,11 +10,25 @@ Pour confirmer si l'application a été construite sur le framework React Native
|
||||
|
||||
3. Utilisez la commande `find . -print | grep -i ".bundle$"` pour rechercher le fichier JavaScript.
|
||||
|
||||
## Code Javascript
|
||||
Note : Si vous recevez un Android App Bundle (.aab) au lieu d'un APK, générez d'abord un APK universel, puis extrayez le bundle :
|
||||
```bash
|
||||
# Get bundletool.jar and generate a universal APK set
|
||||
java -jar bundletool.jar build-apks \
|
||||
--bundle=app-release.aab \
|
||||
--output=app.apks \
|
||||
--mode=universal \
|
||||
--overwrite
|
||||
|
||||
Si en vérifiant le contenu de `index.android.bundle` vous trouvez le code JavaScript de l'application (même s'il est minifié), vous pouvez **l'analyser pour trouver des informations sensibles et des vulnérabilités**.
|
||||
# Extract the APK and then unzip it to find assets/index.android.bundle
|
||||
unzip -p app.apks universal.apk > universal.apk
|
||||
unzip -qq universal.apk -d ReactNative
|
||||
ls ReactNative/assets/
|
||||
```
|
||||
## Javascript Code
|
||||
|
||||
Comme le bundle contient en réalité tout le code JS de l'application, il est possible de **le diviser en différents fichiers** (ce qui pourrait faciliter son ingénierie inverse) en utilisant l'**outil [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
|
||||
Si vous vérifiez le contenu du `index.android.bundle`, vous trouverez le code JavaScript de l'application (même s'il est minifié), vous pouvez **l'analyser pour trouver des informations sensibles et des vulnérabilités**.
|
||||
|
||||
Comme le bundle contient en réalité tout le code JS de l'application, il est possible de **le diviser en différents fichiers** (ce qui facilite potentiellement son ingénierie inverse) en utilisant l'**outil [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
|
||||
|
||||
### Webpack
|
||||
|
||||
@ -34,17 +48,40 @@ Si vous trouvez un fichier appelé `index.android.bundle.map`, vous pourrez anal
|
||||
|
||||
Pour rechercher des informations d'identification sensibles et des points de terminaison, suivez ces étapes :
|
||||
|
||||
1. Identifiez des mots-clés sensibles pour analyser le code JavaScript. Les applications React Native utilisent souvent des services tiers comme Firebase, les points de terminaison du service AWS S3, des clés privées, etc.
|
||||
1. Identifiez des mots-clés sensibles pour analyser le code JavaScript. Les applications React Native utilisent souvent des services tiers comme Firebase, des points de terminaison de service AWS S3, des clés privées, etc.
|
||||
|
||||
2. Dans ce cas spécifique, l'application a été observée en train d'utiliser le service Dialogflow. Recherchez un modèle lié à sa configuration.
|
||||
2. Dans ce cas spécifique, il a été observé que l'application utilisait le service Dialogflow. Recherchez un motif lié à sa configuration.
|
||||
|
||||
3. Il a été chanceux que des informations d'identification sensibles codées en dur aient été trouvées dans le code JavaScript lors du processus de reconnaissance.
|
||||
|
||||
### Chasse rapide aux secrets/points de terminaison dans les bundles
|
||||
|
||||
Ces simples greps font souvent ressortir des indicateurs intéressants même dans le JS minifié :
|
||||
```bash
|
||||
# Common backends and crash reporters
|
||||
strings -n 6 index.android.bundle | grep -Ei "(api\.|graphql|/v1/|/v2/|socket|wss://|sentry\.io|bugsnag|appcenter|codepush|firebaseio\.com|amplify|aws)"
|
||||
|
||||
# Firebase / Google keys (heuristics)
|
||||
strings -n 6 index.android.bundle | grep -Ei "(AIza[0-9A-Za-z_-]{35}|AIzaSy[0-9A-Za-z_-]{33})"
|
||||
|
||||
# AWS access key id heuristic
|
||||
strings -n 6 index.android.bundle | grep -E "AKIA[0-9A-Z]{16}"
|
||||
|
||||
# Expo/CodePush deployment keys
|
||||
strings -n 6 index.android.bundle | grep -Ei "(CodePush|codepush:\\/\\/|DeploymentKey)"
|
||||
|
||||
# Sentry DSN
|
||||
strings -n 6 index.android.bundle | grep -Ei "(Sentry\.init|dsn\s*:)"
|
||||
```
|
||||
Si vous soupçonnez des frameworks de mise à jour Over-The-Air, recherchez également :
|
||||
- Microsoft App Center / clés de déploiement CodePush
|
||||
- Configuration des mises à jour Expo EAS (`expo-updates`, `expo\.io`, certificats de signature)
|
||||
|
||||
### Modifier le code JS et reconstruire
|
||||
|
||||
Dans ce cas, changer le code est facile. Vous devez simplement renommer l'application pour utiliser l'extension `.zip` et l'extraire. Ensuite, vous pouvez **modifier le code JS à l'intérieur de ce bundle et reconstruire l'application**. Cela devrait suffire pour vous permettre de **injecter du code** dans l'application à des fins de test.
|
||||
Dans ce cas, modifier le code est facile. Il vous suffit de renommer l'application pour utiliser l'extension `.zip` et de l'extraire. Ensuite, vous pouvez **modifier le code JS à l'intérieur de ce bundle et reconstruire l'application**. Cela devrait suffire pour vous permettre de **injecter du code** dans l'application à des fins de test.
|
||||
|
||||
## Bytecode Hermes
|
||||
## Bytecode Hermes
|
||||
|
||||
Si le bundle contient **du bytecode Hermes**, vous **ne pourrez pas accéder au code Javascript** de l'application (même pas à la version minifiée).
|
||||
|
||||
@ -53,29 +90,106 @@ Vous pouvez vérifier si le bundle contient du bytecode Hermes en exécutant la
|
||||
file index.android.bundle
|
||||
index.android.bundle: Hermes JavaScript bytecode, version 96
|
||||
```
|
||||
Cependant, vous pouvez utiliser les outils **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** ou **[hermes_rs](https://github.com/Pilfer/hermes_rs)** pour **désassembler le bytecode** et aussi pour **le décompiler en un certain code JS pseudo**. Pour ce faire, par exemple ces commandes :
|
||||
Cependant, vous pouvez utiliser les outils **[hbctool](https://github.com/bongtrop/hbctool)**, des forks mis à jour de hbctool qui prennent en charge les versions de bytecode plus récentes, **[hasmer](https://github.com/lucasbaizer2/hasmer)**, **[hermes_rs](https://github.com/Pilfer/hermes_rs)** (bibliothèque/API Rust), ou **[hermes-dec](https://github.com/P1sec/hermes-dec)** pour **désassembler le bytecode** et aussi pour **le décompiler en un certain code JS pseudo**. Par exemple :
|
||||
```bash
|
||||
# Disassemble and re-assemble with hbctool (works only for supported HBC versions)
|
||||
hbctool disasm ./index.android.bundle ./hasm_out
|
||||
# ...edit ./hasm_out/**/*.hasm (e.g., change comparisons, constants, feature flags)...
|
||||
hbctool asm ./hasm_out ./index.android.bundle
|
||||
|
||||
# Using hasmer (focus on disassembly; assembler/decompiler are WIP)
|
||||
hasmer disasm ./index.android.bundle -o hasm_out
|
||||
|
||||
# Using hermes-dec to produce pseudo-JS
|
||||
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
|
||||
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
|
||||
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
|
||||
```
|
||||
### Modifier le code et reconstruire
|
||||
Astuce : Le projet open-source Hermes propose également des outils de développement tels que `hbcdump` dans des versions spécifiques de Hermes. Si vous construisez la version correspondante de Hermes utilisée pour produire le bundle, `hbcdump` peut extraire des fonctions, des tables de chaînes et du bytecode pour une analyse plus approfondie.
|
||||
|
||||
Idéalement, vous devriez être en mesure de modifier le code désassemblé (changer une comparaison, ou une valeur ou tout ce que vous devez modifier) puis **reconstruire le bytecode** et ensuite reconstruire l'application.
|
||||
### Modifier le code et reconstruire (Hermes)
|
||||
|
||||
L'outil **[hbctool](https://github.com/bongtrop/hbctool)** prend en charge le désassemblage du bundle et sa reconstruction après que les modifications ont été effectuées, cependant, il **ne prend en charge que les anciennes versions** du bytecode Hermes.
|
||||
Idéalement, vous devriez être en mesure de modifier le code désassemblé (changer une comparaison, ou une valeur ou tout ce que vous devez modifier) puis **reconstruire le bytecode** et reconstruire l'application.
|
||||
|
||||
L'outil **[hermes-dec](https://github.com/P1sec/hermes-dec)** ne prend pas en charge la reconstruction du bytecode.
|
||||
- L'**[hbctool](https://github.com/bongtrop/hbctool)** d'origine prend en charge le désassemblage du bundle et sa reconstruction après modifications, mais a historiquement pris en charge uniquement les anciennes versions de bytecode. Des forks maintenus par la communauté étendent le support aux nouvelles versions de Hermes (y compris les versions intermédiaires 80-96) et sont souvent l'option la plus pratique pour patcher les applications RN modernes.
|
||||
- L'outil **[hermes-dec](https://github.com/P1sec/hermes-dec)** ne prend pas en charge la reconstruction du bytecode (décompilateur/désassembleur uniquement), mais il est très utile pour naviguer dans la logique et extraire des chaînes.
|
||||
- L'outil **[hasmer](https://github.com/lucasbaizer2/hasmer)** vise à prendre en charge à la fois le désassemblage et l'assemblage pour plusieurs versions de Hermes ; l'assemblage est encore en maturation mais vaut la peine d'être essayé sur du bytecode récent.
|
||||
|
||||
L'outil **[hermes_rs](https://github.com/Pilfer/hermes_rs)** prend en charge la reconstruction du bytecode, mais c'est en réalité une bibliothèque et non un outil CLI.
|
||||
Un flux de travail minimal avec des assembleurs similaires à hbctool :
|
||||
```bash
|
||||
# 1) Disassemble to HASM directories
|
||||
hbctool disasm assets/index.android.bundle ./hasm
|
||||
|
||||
## Analyse dynamique
|
||||
# 2) Edit a guard or feature flag (example: force boolean true)
|
||||
# In the relevant .hasm, replace a LoadConstUInt8 0 with 1
|
||||
# or change a conditional jump target to bypass a check.
|
||||
|
||||
Vous pourriez essayer d'analyser dynamiquement l'application en utilisant Frida pour activer le mode développeur de l'application React et utiliser **`react-native-debugger`** pour s'y attacher. Cependant, pour cela, vous avez apparemment besoin du code source de l'application. Vous pouvez trouver plus d'infos à ce sujet sur [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
|
||||
# 3) Reassemble into a new bundle
|
||||
hbctool asm ./hasm assets/index.android.bundle
|
||||
|
||||
# 4) Repack the APK and resign
|
||||
zip -r ../patched.apk *
|
||||
# Align/sign as usual (see Android signing section in HackTricks)
|
||||
```
|
||||
Notez que le format de bytecode Hermes est versionné et l'assembleur doit correspondre exactement au format sur disque. Si vous obtenez des erreurs de format, passez à un fork/alternative mis à jour ou reconstruisez les outils Hermes correspondants.
|
||||
|
||||
## Analyse Dynamique
|
||||
|
||||
Vous pourriez essayer d'analyser dynamiquement l'application en utilisant Frida pour activer le mode développeur de l'application React et utiliser **`react-native-debugger`** pour s'y attacher. Cependant, pour cela, vous avez apparemment besoin du code source de l'application. Vous pouvez trouver plus d'informations à ce sujet dans [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
|
||||
|
||||
### Activation du Support Dev en version release avec Frida (précautions)
|
||||
|
||||
Certaines applications expédient accidentellement des classes qui rendent le Support Dev activable. Si présent, vous pouvez essayer de forcer `getUseDeveloperSupport()` à retourner true :
|
||||
```javascript
|
||||
// frida -U -f com.target.app -l enable-dev.js
|
||||
Java.perform(function(){
|
||||
try {
|
||||
var Host = Java.use('com.facebook.react.ReactNativeHost');
|
||||
Host.getUseDeveloperSupport.implementation = function(){
|
||||
return true; // force dev support
|
||||
};
|
||||
console.log('[+] Patched ReactNativeHost.getUseDeveloperSupport');
|
||||
} catch (e) {
|
||||
console.log('[-] Could not patch: ' + e);
|
||||
}
|
||||
});
|
||||
```
|
||||
Avertissement : Dans les versions de production correctement construites, `DevSupportManagerImpl` et les classes de débogage associées sont supprimées et activer ce drapeau peut faire planter l'application ou n'avoir aucun effet. Lorsque cela fonctionne, vous pouvez généralement exposer le menu de développement et attacher des débogueurs/inspecteurs.
|
||||
|
||||
### Interception réseau dans les applications RN
|
||||
|
||||
React Native Android s'appuie généralement sur OkHttp en arrière-plan (via le module natif `Networking`). Pour intercepter/observer le trafic sur un appareil non rooté lors de tests dynamiques :
|
||||
- Utilisez un proxy système + faites confiance au CA utilisateur ou utilisez d'autres techniques de contournement TLS Android génériques.
|
||||
- Astuce spécifique à RN : si l'application inclut Flipper en version de production par erreur (outils de débogage), le plugin Flipper Network peut exposer les requêtes/réponses.
|
||||
|
||||
Pour des techniques génériques d'interception Android et de contournement de pinning, référez-vous à :
|
||||
|
||||
{{#ref}}
|
||||
make-apk-accept-ca-certificate.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
frida-tutorial/objection-tutorial.md
|
||||
{{#endref}}
|
||||
|
||||
## Problèmes récents dans les bibliothèques RN populaires (quoi surveiller)
|
||||
|
||||
Lors de l'audit des modules tiers visibles dans le bundle JS ou les bibliothèques natives, vérifiez les vulnérabilités connues et vérifiez les versions dans `package.json`/`yarn.lock`.
|
||||
|
||||
- react-native-mmkv (Android) : les versions antérieures à 2.11.0 enregistraient la clé de chiffrement optionnelle dans les journaux Android. Si ADB/logcat est disponible, des secrets pourraient être récupérés. Assurez-vous d'utiliser >= 2.11.0. Indicateurs : utilisation de `react-native-mmkv`, déclarations de journal mentionnant l'initialisation de MMKV avec chiffrement. CVE-2024-21668.
|
||||
- react-native-document-picker : les versions < 9.1.1 étaient vulnérables à la traversée de chemin sur Android (sélection de fichiers), corrigé dans 9.1.1. Validez les entrées et la version de la bibliothèque.
|
||||
|
||||
Vérifications rapides :
|
||||
```bash
|
||||
grep -R "react-native-mmkv" -n {index.android.bundle,*.map} 2>/dev/null || true
|
||||
grep -R "react-native-document-picker" -n {index.android.bundle,*.map} 2>/dev/null || true
|
||||
# If you also have the node_modules (rare on release): grep -R in package.json / yarn.lock
|
||||
```
|
||||
## Références
|
||||
|
||||
- [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
|
||||
- [https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications](https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications)
|
||||
- [https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf](https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf)
|
||||
- CVE-2024-21668 : react-native-mmkv enregistre la clé de chiffrement des journaux sur Android, corrigé dans v2.11.0 (NVD) : https://nvd.nist.gov/vuln/detail/CVE-2024-21668
|
||||
- hbctool (et forks) pour assembler/désassembler Hermes : https://github.com/bongtrop/hbctool
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user