mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
229 lines
8.5 KiB
Markdown
229 lines
8.5 KiB
Markdown
# Objection Tutorial
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|
|
|
|
## **Introduction**
|
|
|
|
**objection - Exploration Mobile en Temps Réel**
|
|
|
|
[**Objection**](https://github.com/sensepost/objection) est un outil d'exploration mobile en temps réel, alimenté par [Frida](https://www.frida.re). Il a été conçu pour aider à évaluer les applications mobiles et leur posture de sécurité sans avoir besoin d'un appareil mobile jailbreaké ou rooté.
|
|
|
|
**Remarque :** Ce n'est pas une forme de contournement de jailbreak / root. En utilisant `objection`, vous êtes toujours limité par toutes les restrictions imposées par le sandbox applicable auquel vous êtes confronté.
|
|
|
|
### Résumé
|
|
|
|
Le **but** de **objection** est de permettre à l'utilisateur d'appeler les **actions principales offertes par Frida**. **Sinon**, l'utilisateur devra créer un **script unique pour chaque application** qu'il souhaite tester.
|
|
|
|
## Tutoriel
|
|
|
|
Pour ce tutoriel, je vais utiliser l'APK que vous pouvez télécharger ici :
|
|
|
|
{{#file}}
|
|
app-release.zip
|
|
{{#endfile}}
|
|
|
|
Ou depuis son [dépôt original](https://github.com/asvid/FridaApp) (télécharger app-release.apk)
|
|
|
|
### Installation
|
|
```bash
|
|
pip3 install objection
|
|
```
|
|
### Connexion
|
|
|
|
Faites une **connexion ADB régulière** et **démarrez** le serveur **frida** sur l'appareil (et vérifiez que frida fonctionne à la fois sur le client et le serveur).
|
|
|
|
Si vous utilisez un **appareil rooté**, il est nécessaire de sélectionner l'application que vous souhaitez tester dans l'option _**--gadget**_. dans ce cas :
|
|
```bash
|
|
frida-ps -Uai
|
|
objection --gadget asvid.github.io.fridaapp explore
|
|
```
|
|
### Actions de base
|
|
|
|
Tous les commandes possibles d'objection ne seront pas listées dans ce tutoriel, seulement celles que j'ai trouvées les plus utiles.
|
|
|
|
#### Environnement
|
|
|
|
Certaines informations intéressantes (comme des mots de passe ou des chemins) peuvent être trouvées à l'intérieur de l'environnement.
|
|
```bash
|
|
env
|
|
```
|
|
.png>)
|
|
|
|
#### Informations sur Frida
|
|
```bash
|
|
frida
|
|
```
|
|
.png>)
|
|
|
|
#### Téléchargement/Upload
|
|
```bash
|
|
file download <remote path> [<local path>]
|
|
file upload <local path> [<remote path>]
|
|
```
|
|
#### Importer le script frida
|
|
```bash
|
|
import <local path frida-script>
|
|
```
|
|
#### SSLPinning
|
|
```bash
|
|
android sslpinning disable #Attempts to disable SSL Pinning on Android devices.
|
|
```
|
|
#### Détection de root
|
|
```bash
|
|
android root disable #Attempts to disable root detection on Android devices.
|
|
android root simulate #Attempts to simulate a rooted Android environment.
|
|
```
|
|
#### Commande Exec
|
|
```bash
|
|
android shell_exec whoami
|
|
```
|
|
#### Captures d'écran
|
|
```bash
|
|
android ui screenshot /tmp/screenshot
|
|
android ui FLAG_SECURE false #This may enable you to take screenshots using the hardware keys
|
|
```
|
|
### Analyse statique rendue dynamique
|
|
|
|
Dans une application réelle, nous devrions connaître toutes les informations découvertes dans cette partie avant d'utiliser objection grâce à **l'analyse statique**. Quoi qu'il en soit, de cette manière, vous pourrez peut-être voir **quelque chose de nouveau**, car ici vous n'aurez qu'une liste complète de classes, de méthodes et d'objets exportés.
|
|
|
|
Ceci est également utile si, d'une manière ou d'une autre, vous êtes **incapable d'obtenir un code source lisible** de l'application.
|
|
|
|
#### Lister les activités, les récepteurs et les services
|
|
```bash
|
|
android hooking list activities
|
|
```
|
|
.png>)
|
|
```bash
|
|
android hooking list services
|
|
android hooking list receivers
|
|
```
|
|
Frida lancera une erreur si aucun n'est trouvé
|
|
|
|
#### Obtenir l'activité actuelle
|
|
```bash
|
|
android hooking get current_activity
|
|
```
|
|
.png>)
|
|
|
|
#### Rechercher des classes
|
|
|
|
Commençons à chercher des classes dans notre application.
|
|
```bash
|
|
android hooking search classes asvid.github.io.fridaapp
|
|
```
|
|
.png>)
|
|
|
|
#### Méthodes de recherche d'une classe
|
|
|
|
Maintenant, extrayons les méthodes à l'intérieur de la classe _MainActivity:_
|
|
```bash
|
|
android hooking search methods asvid.github.io.fridaapp MainActivity
|
|
```
|
|
.png>)
|
|
|
|
#### Lister les méthodes déclarées d'une classe avec leurs paramètres
|
|
|
|
Voyons quels paramètres les méthodes de la classe nécessitent :
|
|
```bash
|
|
android hooking list class_methods asvid.github.io.fridaapp.MainActivity
|
|
```
|
|
.png>)
|
|
|
|
#### Lister les classes
|
|
|
|
Vous pouvez également lister toutes les classes qui ont été chargées dans l'application actuelle :
|
|
```bash
|
|
android hooking list classes #List all loaded classes, As the target application gets usedmore, this command will return more classes.
|
|
```
|
|
C'est très utile si vous voulez **intercepter la méthode d'une classe et que vous ne connaissez que le nom de la classe**. Vous pourriez utiliser cette fonction pour **chercher quel module possède la classe** et ensuite intercepter sa méthode.
|
|
|
|
### L'interception est facile
|
|
|
|
#### Intercepter (surveiller) une méthode
|
|
|
|
À partir du [code source](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) de l'application, nous savons que la **fonction** _**sum()**_ **de** _**MainActivity**_ est exécutée **toutes les secondes**. Essayons de **dumper toutes les informations possibles** chaque fois que la fonction est appelée (arguments, valeur de retour et backtrace) :
|
|
```bash
|
|
android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return
|
|
```
|
|
.png>)
|
|
|
|
#### Hooking (surveillance) d'une classe entière
|
|
|
|
En fait, je trouve tous les méthodes de la classe MainActivity vraiment intéressantes, alors **hookons-les toutes**. Faites attention, cela pourrait **faire planter** une application.
|
|
```bash
|
|
android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --dump-return
|
|
```
|
|
Si vous jouez avec l'application pendant que la classe est accrochée, vous verrez quand **chaque fonction est appelée**, ses **arguments** et la **valeur de retour**.
|
|
|
|
.png>)
|
|
|
|
#### Changer la valeur de retour booléenne d'une fonction
|
|
|
|
À partir du code source, vous pouvez voir que la fonction _checkPin_ reçoit un _String_ comme argument et retourne un _boolean_. Faisons en sorte que la fonction **retourne toujours true** :
|
|
|
|
.png>)
|
|
|
|
Maintenant, si vous écrivez quoi que ce soit dans la zone de texte pour le code PIN, vous verrez que tout est valide :
|
|
|
|
.png>)
|
|
|
|
### Instances de classe
|
|
|
|
Recherchez et imprimez **des instances en direct d'une classe Java spécifique**, spécifiée par un nom de classe entièrement qualifié. Voici le résultat d'une tentative d'obtention d'une valeur de chaîne pour une objection découverte qui contiendrait généralement **des valeurs de propriété pour l'objet**.
|
|
```
|
|
android heap print_instances <class>
|
|
```
|
|
.png>)
|
|
|
|
### Keystore/Intents
|
|
|
|
Vous pouvez jouer avec le keystore et les intents en utilisant :
|
|
```bash
|
|
android keystore list
|
|
android intents launch_activity
|
|
android intent launch_service
|
|
```
|
|
### Mémoire
|
|
|
|
#### Vidage
|
|
```bash
|
|
memory dump all <local destination> #Dump all memory
|
|
memory dump from_base <base_address> <size_to_dump> <local_destination> #Dump a part
|
|
```
|
|
#### Liste
|
|
```bash
|
|
memory list modules
|
|
```
|
|
.png>)
|
|
|
|
En bas de la liste, vous pouvez voir frida :
|
|
|
|
.png>)
|
|
|
|
Vérifions ce que frida exporte :
|
|
|
|
.png>)
|
|
|
|
#### Recherche/Écriture
|
|
|
|
Vous pouvez également rechercher et écrire dans la mémoire avec objection :
|
|
```bash
|
|
memory search "<pattern eg: 41 41 41 ?? 41>" (--string) (--offsets-only)
|
|
memory write "<address>" "<pattern eg: 41 41 41 41>" (--string)
|
|
```
|
|
### SQLite
|
|
|
|
Vous pouvez utiliser la commande `sqlite` pour interagir avec les bases de données sqlite.
|
|
|
|
### Exit
|
|
```bash
|
|
exit
|
|
```
|
|
## Ce qui me manque dans Objection
|
|
|
|
- Les méthodes de hooking font parfois planter l'application (c'est aussi à cause de Frida).
|
|
- Vous ne pouvez pas utiliser les instances des classes pour appeler les fonctions de l'instance. Et vous ne pouvez pas créer de nouvelles instances de classes et les utiliser pour appeler des fonctions.
|
|
- Il n'y a pas de raccourci (comme celui pour sslpinnin) pour hooker toutes les méthodes cryptographiques courantes utilisées par l'application afin de voir le texte chiffré, le texte en clair, les clés, les IV et les algorithmes utilisés.
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|