Mitmproxy: analyser le trafic de vos applications mobiles

Partager cet article

Temps estimé pour la lecture de cet article : 52 min

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.

présentation wireshark

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.

mitmproxy sample

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 :

mitmproxy adb devices

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
mitmproxy android monitored network

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.

mitmproxy ios installation certificate

Enfin, il suffit d’activer le certificat installé rendez-vous dans : Général > Informations > Réglages des certificats > mitmproxy.

mitmproxy ios certificates listmitmproxy ios settings certificates

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

mitmproxy ios wifi

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.

mitmproxy install first samplemitmproxy install second sample

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 :

mitmproxy jisho first samplemitmproxy jisho second sample

Tout ça, c’est fort intéressant mais passons maintenant à ce qui nous intéresse vraiment le résultat obtenu avec mitmproxy :

mitmproxy result sample

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.

mitmproxy result request

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.

mitmproxy result response

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 :

mitmproxy result detail

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

mitmproxy android trusted certificatesmitmproxy android certificate remove

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é.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.