Translated ['src/mobile-pentesting/android-app-pentesting/android-task-h

This commit is contained in:
Translator 2025-02-25 22:34:53 +00:00
parent 27b7894983
commit c8e3aa0803
5 changed files with 69 additions and 17 deletions

View File

@ -8,7 +8,7 @@ Dans Android, une **tâche** est essentiellement un ensemble d'activités avec l
Voici un aperçu rapide des transitions d'activités :
- **Activité 1** commence comme la seule activité au premier plan.
- **Activité 1** commence comme l'unique activité au premier plan.
- Le lancement de **l'Activité 2** pousse **l'Activité 1** dans le back stack, amenant **l'Activité 2** au premier plan.
- Le démarrage de **l'Activité 3** déplace **l'Activité 1** et **l'Activité 2** plus loin dans le stack, avec **l'Activité 3** maintenant devant.
- La fermeture de **l'Activité 3** ramène **l'Activité 2** au premier plan, mettant en avant le mécanisme de navigation des tâches simplifié d'Android.
@ -30,14 +30,20 @@ L'attribut `launchMode` dirige le traitement des instances d'activités au sein
1. **Installation de l'Application Malveillante** : La victime installe l'application de l'attaquant sur son appareil.
2. **Activation Initiale** : La victime ouvre d'abord l'application malveillante, préparant l'appareil pour l'attaque.
3. **Tentative de Lancement de l'Application Cible** : La victime tente d'ouvrir l'application cible.
4. **Exécution du Détournement** : En raison de l'affinité de tâche correspondante, l'application malveillante est lancée à la place de l'application cible.
4. **Exécution du Détournement** : À un moment donné, l'application essaie d'ouvrir la vue **singleTask**. En raison de l'affinité de tâche correspondante, l'application malveillante est lancée à la place de l'application cible.
5. **Tromperie** : L'application malveillante présente un faux écran de connexion ressemblant à l'application cible, trompant l'utilisateur pour qu'il saisisse des informations sensibles.
Pour une mise en œuvre pratique de cette attaque, consultez le dépôt Task Hijacking Strandhogg sur GitHub : [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
> [!TIP]
> Notez que pour que cette attaque fonctionne, la vue vulnérable **n'a pas besoin d'être exportée à true** ni d'être l'activité principale.
Pour une mise en œuvre pratique de cette attaque, référez-vous au dépôt Task Hijacking Strandhogg sur GitHub : [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
### Mesures de Prévention
Pour prévenir de telles attaques, les développeurs peuvent définir `taskAffinity` sur une chaîne vide et opter pour le mode de lancement `singleInstance`, garantissant l'isolement de leur application par rapport aux autres. La personnalisation de la fonction `onBackPressed()` offre une protection supplémentaire contre le détournement de tâches.
Pour prévenir de telles attaques, les développeurs peuvent :
- Définir **`**taskAffinity`** de la vue **singleTask** sur une chaîne vide (`android:taskAffinity=""`)
- Opter pour le mode de lancement **`singleInstance`**, garantissant l'isolement de leur application par rapport aux autres.
- Personnaliser la fonction **`onBackPressed()`** pour offrir une protection supplémentaire contre le détournement de tâches.
## **Références**

View File

@ -1,26 +1,34 @@
{{#include ../../banners/hacktricks-training.md}}
# Analyse de l'application React Native
# Analyse d'application React Native
Pour confirmer si l'application a été construite sur le framework React Native, suivez ces étapes :
1. Renommez le fichier APK avec une extension zip et extrayez-le dans un nouveau dossier en utilisant la commande `cp com.example.apk example-apk.zip` et `unzip -qq example-apk.zip -d ReactNative`.
2. Naviguez vers le dossier ReactNative nouvellement créé et localisez le dossier assets. À l'intérieur de ce dossier, vous devriez trouver le fichier `index.android.bundle`, qui contient le JavaScript React dans un format minifié.
2. Naviguez vers le nouveau dossier ReactNative et localisez le dossier assets. À l'intérieur de ce dossier, vous devriez trouver le fichier `index.android.bundle`, qui contient le JavaScript React dans un format minifié.
3. Utilisez la commande `find . -print | grep -i ".bundle$"` pour rechercher le fichier JavaScript.
Pour analyser davantage le code JavaScript, créez un fichier nommé `index.html` dans le même répertoire avec le code suivant :
## Code Javascript
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**.
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)**.
### Webpack
Pour analyser davantage le code JavaScript, vous pouvez télécharger le fichier sur [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) ou suivre ces étapes :
1. Créez un fichier nommé `index.html` dans le même répertoire avec le code suivant :
```html
<script src="./index.android.bundle"></script>
```
Vous pouvez télécharger le fichier sur [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) ou suivre ces étapes :
2. Ouvrez le fichier `index.html` dans Google Chrome.
1. Ouvrez le fichier `index.html` dans Google Chrome.
3. Ouvrez la barre d'outils de développement en appuyant sur **Command+Option+J pour OS X** ou **Control+Shift+J pour Windows**.
2. Ouvrez la barre d'outils de développement en appuyant sur **Command+Option+J pour OS X** ou **Control+Shift+J pour Windows**.
3. Cliquez sur "Sources" dans la barre d'outils de développement. Vous devriez voir un fichier JavaScript qui est divisé en dossiers et fichiers, constituant le bundle principal.
4. Cliquez sur "Sources" dans la barre d'outils de développement. Vous devriez voir un fichier JavaScript qui est divisé en dossiers et fichiers, constituant le bundle principal.
Si vous trouvez un fichier appelé `index.android.bundle.map`, vous pourrez analyser le code source dans un format non minifié. Les fichiers de carte contiennent un mappage source, ce qui vous permet de mapper des identifiants minifiés.
@ -32,8 +40,42 @@ Pour rechercher des informations d'identification sensibles et des points de ter
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.
### 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.
## 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).
Vous pouvez vérifier si le bundle contient du bytecode Hermes en exécutant la commande suivante :
```bash
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 :
```bash
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
```
### Modifier le code et reconstruire
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.
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.
L'outil **[hermes-dec](https://github.com/P1sec/hermes-dec)** ne prend pas en charge la reconstruction du bytecode.
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.
## 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'infos à ce sujet sur [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
## 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)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -11,6 +11,8 @@ En effet, cela **aveugle l'utilisateur sur le fait qu'il effectue réellement de
Pour détecter les applications vulnérables à cette attaque, vous devez rechercher des **activités exportées** dans le manifeste android (notez qu'une activité avec un intent-filter est automatiquement exportée par défaut). Une fois que vous avez trouvé les activités exportées, **vérifiez si elles nécessitent une permission**. Cela est dû au fait que **l'application malveillante aura également besoin de cette permission**.
Vous pouvez également vérifier la version SDK minimale de l'application, en vérifiant la valeur de **`android:minSdkVersion`** dans le fichier **`AndroidManifest.xml`**. Si la valeur est **inférieure à 30**, l'application est vulnérable au Tapjacking.
### Protection
#### Android 12 (API 31,32) et supérieur
@ -43,20 +45,20 @@ Suivez les **instructions du README pour l'utiliser**.
### FloatingWindowApp
Un projet exemple implémentant **FloatingWindowApp**, qui peut être utilisé pour se superposer à d'autres activités afin d'effectuer une attaque clickjacking, peut être trouvé ici [**FloatingWindowApp**](https://github.com/aminography/FloatingWindowApp) (un peu ancien, bonne chance pour construire l'apk).
Un projet exemple implémentant **FloatingWindowApp**, qui peut être utilisé pour se superposer à d'autres activités afin d'effectuer une attaque clickjacking, peut être trouvé dans [**FloatingWindowApp**](https://github.com/aminography/FloatingWindowApp) (un peu ancien, bonne chance pour construire l'apk).
### Qark
> [!CAUTION]
> Il semble que ce projet ne soit plus maintenu et que cette fonctionnalité ne fonctionne plus correctement
Vous pouvez utiliser [**qark**](https://github.com/linkedin/qark) avec les paramètres `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` pour créer une application malveillante afin de tester les éventuelles vulnérabilités **Tapjacking**.\
Vous pouvez utiliser [**qark**](https://github.com/linkedin/qark) avec les paramètres `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` pour créer une application malveillante afin de tester les vulnérabilités potentielles de **Tapjacking**.\
L'atténuation est relativement simple car le développeur peut choisir de ne pas recevoir d'événements tactiles lorsqu'une vue est recouverte par une autre. En utilisant la [Référence des développeurs Android](https://developer.android.com/reference/android/view/View#security):
> Parfois, il est essentiel qu'une application puisse vérifier qu'une action est effectuée avec la pleine connaissance et le consentement de l'utilisateur, comme accorder une demande de permission, effectuer un achat ou cliquer sur une publicité. Malheureusement, une application malveillante pourrait essayer de tromper l'utilisateur pour qu'il effectue ces actions, à son insu, en dissimulant le but prévu de la vue. En remède, le framework offre un mécanisme de filtrage des touches qui peut être utilisé pour améliorer la sécurité des vues qui fournissent un accès à des fonctionnalités sensibles.
>
> Pour activer le filtrage des touches, appelez [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) ou définissez l'attribut de mise en page android:filterTouchesWhenObscured sur true. Lorsqu'il est activé, le framework rejettera les touches reçues chaque fois que la fenêtre de la vue est obscurcie par une autre fenêtre visible. En conséquence, la vue ne recevra pas de touches chaque fois qu'un toast, une boîte de dialogue ou une autre fenêtre apparaît au-dessus de la fenêtre de la vue.
> Pour activer le filtrage des touches, appelez [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) ou définissez l'attribut de mise en page android:filterTouchesWhenObscured sur true. Lorsqu'il est activé, le framework rejettera les touches reçues chaque fois que la fenêtre de la vue est obscurcie par une autre fenêtre visible. En conséquence, la vue ne recevra pas de touches chaque fois qu'un toast, un dialogue ou une autre fenêtre apparaît au-dessus de la fenêtre de la vue.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -471,12 +471,13 @@ window.search = window.search || {};
showResults(true);
}
fetch(path_to_root + 'searchindex.json')
var branch = lang === "en" ? "master" : lang
fetch(`https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.json`)
.then(response => response.json())
.then(json => init(json))
.catch(error => { // Try to load searchindex.js if fetch failed
var script = document.createElement('script');
script.src = path_to_root + 'searchindex.js';
script.src = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.js`;
script.onload = () => init(window.search);
document.head.appendChild(script);
});

View File

@ -55,6 +55,7 @@
<!-- Provide site root to javascript -->
<script>
var path_to_root = "{{ path_to_root }}";
var lang = "{{ language }}";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
</script>
<!-- Start loading toc.js asap -->