Introduction, pourquoi utiliser mitmproxy
Wireshark est un logiciel libre et gratuit, d’analyse réseau (ce qu’on appelle un sniffer) qui permet de visualiser l’ensemble des données transitant sur la machine qui l’exécute. Il est très utilisé dans le dépannage et l’analyse de réseaux informatiques, le développement de protocoles, l’éducation ou encore la rétro-ingénierie.
Wireshark est similaire à tcpdump, mais il implémente une interface graphique ainsi que plusieurs options de tri et filtrage des paquets. Il décode les paquets capturés et comprend les différentes structures (encapsulation) des protocoles de communication. Wireshark utilise pcap pour capturer les paquets.
C’est donc un must have pour analyser des échanges réseaux et en s’amusant à configurer un peu ce dernier, on peut l’utiliser avec Android. Toutefois, je le trouve un peu austère et c’est pourquoi je vais vous proposer un autre outil appelé mitmproxy ! Rentrons dans le vif du sujet.
Mitmproxy
Mitmproxy est un proxy open source (pour HTTP et HTTPS) interactif avec une interface en ligne de commande. Il utilise la technique man in the middle pour fonctionner.
Il permet par exemple :
- D’intercepter des requêtes et réponses HTTP/HTTPS et les modifier à la volée
- De rejouer des requêtes
- Comme c’est un proxy, on peut transférer le trafic vers un serveur spécifique
Pour l’installation, sous Linux, comme d’habitude, vous pouvez utiliser votre gestionnaire de paquets préférés, par exemple pour archlinux :
sudo pacman -S mitmproxy
Ou encore pour Mac OSX avec homebrew :
brew install mitmproxy
Et au pire rendez-vous sur la documentation de mitmproxy pour installer l’outil.
Mitmproxy et les certificats d’autorités
La première fois que vous allez lancer mitmproxy depuis la ligne de commande :
mitmproxy
Ce dernier va vous créer dans votre répertoire racine un ensemble de certificats d’autorités (CA pour Certificate Authority). Par défaut votre navigateur ou votre système ne fera pas confiance au certificat d’autorité de mitmproxy. Un avertissement concernant le certificat SSL va donc apparaître à chaque fois que vous visitez un nouveau domaine. Il vous faut donc configurer votre système afin que ce dernier fasse tout le temps confiance au certificat, qu’il le reconnaisse comme un « signing root authority ».
Voici, les différents certificats créés par mitmproxy dans le dossier .mitmproxy :
- mitmproxy-ca.pem : Le certificat et sa clé privé au format PEM.
- mitmproxy-ca-cert.pem : Le certificate au format PEM. Le certificat a utilisé pour distribuer sur toutes les plateformes excepté Windows.
- mitmproxy-ca-cert.p12 : Le certificate au format PKCS12. Utilisé pour Windows.
- mitmproxy-ca-cert.cer : Ressemble au format .pem, mais avec une extension utilisée par certains appareils Android.
Tester sur Android
À partir d’Android 7.0, Google a introduit un changement dans la façon de faire confiance aux « Certificate Authorities » (CA). Ces changements empêchent les applications tierces d’écouter les requêtes réseaux qui viennent d’une application. Il faut donc ajouter une exception de sécurité, pas d’inquiétudes ce n’est pas si complexe que ça.
Ajouter une exception de sécurité pour Android 7.0
Pour ajouter cette fameuse exception, on va devoir prendre notre apk de départ et le recompiler afin d’inclure les changements nécessaires, tout ça grâce au projet AddSecurityExceptionAndroid. Commencer par cloner le repository. Vous devriez avoir le script addSecurityExceptions.sh, c’est ce script en question qui va nous permettre de recompiler notre apk. (N’oubliez pas de lui donner le droit de s’exécuter).
Il vous suffit alors d’exécuter le script est de passer en paramètre le nom de votre apk.
./addSecurityExceptions.sh myApp.apk
Le script va alors se charger d’en générer une nouvelle. Il vous suffira alors de la réinstaller sur le téléphone.
Utiliser mitmproxy pour Android
On va pouvoir maintenant utiliser mitmproxy. La première étape, ça va être d’installer le certificat sur le téléphone. On va pouvoir envoyer ce dernier grâce à ADB, notamment grâce à la commande push. Commencer par brancher votre téléphone en USB, il doit être reconnu par adb, vous pouvez vérifier en tapant la commande :
adb devices
Ce qui vous donne ceci :
Ensuite, il ne vous reste plus qu’à vous déplacer dans le dossier .mitmproxy et exécuter la commande suivante :
adb push mitmproxy-ca-cert.pem /sdcard/
Installons maintenant le certificat. Ensuite, il faut aller dans « Sécurité et localisation », après « Chiffrement et identifiants » et enfin « Stockage des identifiants », appuyez sur « Installer depuis la mémoire ». Vous allez alors trouver le certificat à la racine de l’espace de stockage de votre téléphone.
Il faut ensuite, envoyez la nouvelle apk qu’on a recompilé à l’étape précédente :
adb push new.apk /sdcard/
Installer l’APK depuis le téléphone. Il est possible que vous ayez besoin d’activer l’installation depuis une source inconnue, suivez ce tutoriel si besoin.
Maintenant, vous pouvez lancer mitmproxy, par défaut ce dernier se lance sur le port 8080. Vous pouvez le changer grâce à l’option listen_port, suivez la documentation. On va avoir besoin de l’adresse IP de notre PC. Exécutez la commande suivante :
ifconfig
Vous devriez obtenir quelque chose dans ce goût-là :
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 8c:85:90:cd:4c:12 inet 192.168.2.60
La partie intéressante étant l’inet à savoir : 192.168.2.60. Nous avons toutes les cartes en main, il ne reste plus maintenant qu’à configurer le WIFI du téléphone sur le même que celui du PC et à faire passer la connexion par le proxy.
Configurer le WIFI sur Android afin de passer par mitmproxy
Commencez par ouvrir les paramètres WIFI de votre téléphone, ensuite :
- Sélectionner le réseau à configurer
- Dans « Options avancées », cherchez l’option proxy, passez-le en manuel
- Il faut alors saisir un nom d’hôte du proxy, saissez l’adresse ip obtenue grâce à ifconfig
- Dans port du proxy mettez 8080 ou l’adresse du port que vous avez choisie
- Enfin, enregistrez le tout
Comme vous pouvez le voir en bas en gauche de la capture de droite, Android vous informe que le réseau sur lequel vous êtes peut-être surveillé ! Vous n’avez plus qu’à utiliser l’application et analyser les requêtes réseaux qui vont transiter, nous allons voir ça dans la suite du tutoriel.
Tester sur iOS
Pour iOS, c’est un peu plus simple, vous n’avez pas besoin de modifier votre IPA. Il faut tout d’abord, envoyez le certificat mitmproxy-ca-cert.pem sur le téléphone, vous pouvez utiliser AirDrop pour ça.
Ensuite rendez-vous dans : Général > Profils > Certificat d’identité. Sélectionnez alors le certificat, puis installez-le.
Enfin, il suffit d’activer le certificat installé rendez-vous dans : Général > Informations > Réglages des certificats > mitmproxy.
Switchez l’option sur on. Il ne reste plus qu’à paramétrer le WIFI.
Configurer le WIFI sur iOS afin de passer par mitmproxy
Dans les paramètres WIFI :
- Sélectionnez le réseau à modifier
- Cliquez sur configer un proxy
- Choisir manuel
- Serveur: saississez l’ip obtenue avec ifconfig
- Port: 8080
- Enregistrez-le tout
Vous êtes prêt à utiliser votre application.
Utilisation de l’interface de mitmproxy en ligne de commande
Je vous propose maintenant un petit exemple pour Android avec l’application jisho. Cette application est tout simplement un dictionnaire de japonais, qui utilise l’API du site officiel jisho.org afin de donner l’équivalent d’un kanji en anglais. Commençons par recompiler l’APK avec l’outil AddSecurityExceptions et ensuite installons l’APK sur le téléphone. Il vous demandera surement une confirmation pour l’installation, acceptez.
Après avoir fait toutes les configurations qui vont bien, on peut lancer l’application et chercher le kanji du soleil 日 (nichi). Graphiquement, on obtient ceci :
Tout ça, c’est fort intéressant mais passons maintenant à ce qui nous intéresse vraiment le résultat obtenu avec mitmproxy :
On peut voir les différentes requêtes qui ont eu lieu lorsqu’une action a été réalisé dans l’application, notamment sur la capture, on voit que la seconde requête, renvoi un résultat 200 au format json. On peut naviguer à travers les requêtes grâce aux flèches haut et bas du clavier. Ensuite, il suffit de cliquer sur la touche entrée pour avoir plus de détails, on obtient notamment :
- Request : des informations sur la requête demandée
- Response : le retour du serveur
- Detail : des informations supplémentaires (le temps de réponse du serveur, le type de connexion, des informations sur les certificats…)
Voici, dans le détail le résultat de la seconde requête.
Concernant la requête, on observe donc :
- L’host, qui est donc jisho.org
- Le user agent utilisé, l’application utilise donc la librairie OkHttp
- La query envoyé, ici le kanji du soleil
Passons à la réponse renvoyée par le serveur.
Analysons le résultat de la réponse serveur :
- Le type du serveur, nginx ici
- La date
- Le content type
- Le status de la requête
- Le résultat Json renvoyé par le serveur
Enfin, voici plus d’informations dans la partie détail :
Quelques raccouris de mitmproxy
Voici quelques commandes utiles pour naviguer dans mitmproxy :
- enter pour sélectionner une requête
- q pour revenir à la liste des requêtes
- ? pour afficher l’aide du logiciel, q pour quitter l’aide
- z pour vider mitmproxy des précédentes requêtes, d pour supprimer la requête sélectionnée
- r pour rejouer une requête qui a déjà eu lieu
Pour écrire le résultat d’un flow (d’une requête) dans un fichier, il suffit de se positionner dessus. D’appuyer sur e, de sélectionner le type raw et de préciser la localisation du fichier sur le disque dur. Ce qui donne ceci, par exemple :
export.file raw @focus /Users/ludo/Desktop/log.txt
Pour approfondir encore plus le sujet, rien ne vaut la pratique ou la documentation officielle, have fun !
Nettoyer les paramètres
Attention, à bien désactiver les certificats et la configuration du proxy, car en effet si mitmproxy n’est pas lancé, les requêtes ne seront pas renvoyé, donc vous n’aurez pas internet ! Il faut également désactiver le proxy rajouté dans la configuration de votre réseau Wifi.
Supprimer un certificat sous Android
Pour supprimer un certificat sous Android, rendez-vous dans : « Sécurité et localisation », puis « Chiffrement et identifiants ». Enfin sous « Stockage des identifiants », allez dans « Identifiants de confiance », choisissez « User », vous aurez alors le certificat ajoutez au-dessus, cliquez dessus puis sur supprimer.
Supprimer un certificat sous iOS
Comme on a vu, avant vous pouvez retrouver les certificats dans : Général > Informations > Réglages des certificats > mitmproxy. En cliquant dessus, vous avez alors le choix de pouvoir supprimer le certificat.
Le mot de la fin
Merci d’avoir suivi le tutoriel jusqu’ici, j’ai essayé d’être clair et aussi didactique que possible. L’outil n’est pas si simple à mettre en place mais est très efficace. Je l’utilise assez souvent notamment lors du développement de nouveaux webservices. Un must have, une fois maitrisé.