Capturer le trafic avec mitmproxy

Publié le 04/11/2018

Depuis le temps qu’il n’y a pas eu d’article en voici un avec un peu de réseau dedans. Il est souvent utile dans le cadre d’une preuve de concept, d’une analyse ou d’un développement de pouvoir isoler un appareil sur un réseau afin d’en analyser le comportement. Dans cet article nous allons donc voir comment mettre en place un point d’accès wifi routé vers internet à travers lequel nous pourrons analyser les flux http et https.

Il sera ici question donc de http et https mais rien n’empêche bien sûr d’analyser tout autre type de trafic.

 

I – Le matériel

Il nous faut donc au minimum pour analyser le trafic : un point d’entrée des données, un « truc » pour analyser/enregistrer les données et un point de sortie des données vers internet. Le but étant bien sûr que le tout soient transparent et que la circulation des données soit bidirectionnelle.

Dans cet exemple nous utiliserons un ordinateur quelconque (il peut s’agir d’un portable, comme d’un raspberry pi, peu importe) avec deux interfaces réseaux : une interface sans fil comme point d’accès et une interface (filaire ou sans fil) de sortie vers internet.

 

Dans cet exemple nous utiliserons :

- interface wifi pour notre point d'accès : wlp0s20u1

- interface filaire vers internet : enp0s25

 

Toutes les cartes wifi ne sont pas capables de faire office de point d’accès, on peut vérifier cela avec iw par exemple :

$ iw list
[...]
Supported interface modes:
* AP

 

Si notre carte wifi supporte le mode AP (Access Point) on peut continuer. La première chose à faire est de donner une adresse IP statique à notre point d’accès via ip :

$ ip address add 192.168.0.1/255.255.255.0 dev wlp0s20u1

 

Ici on ajoute donc l’adresse 192.168.0.1 avec le masque réseau 255.255.255.0 au périphérique wlp0s20u1.

 

II – Mise en place du point d’accès

Pour cela le plus simple est d’utiliser hostapd, un programme conçu pour gérer des points d’accès (avec ou sans authentification). On l’installe donc sur notre machine via le package manager par exemple. Voici un exemple de configuration dans /etc/hostpad/hostapd.conf :

interface=wlp0s20u1
driver=nl80211
ssid=interception
channel=1
auth_algs=3
wpa=2
rsn_pairwise=CCMP
wpa_key_mgmt=WPA-PSK
wpa_passphrase=unsupermotdepasse

 

On précise plusieurs paramètres comme l’interface qui sert de point d’accès, le driver (nl80211 faisant l’affaire dans la majorité des cas, cependant certaines cartes wifi peuvent nécessiter des drivers spécifiques), le SSID de notre point d’accès, les méthodes de sécurité et chiffrement de notre réseau.

 

On peut à présent lancer hostapd via systemctl ou directement via le binaire en lui passant le fichier de configuration. À partir de maintenant nous pouvons voir notre réseau et nous y connecter mais nous allons tout de même ajouter de quoi simplifier les choses : un serveur DHCP et un DNS afin d’attribuer une adresse aux machines qui s’y connectent et leur donner un moyen de résoudre des noms de domaine.

 

III – Serveur DHCP et résolveur DNS

Ici on peut utiliser isc-dhcpd couplé à unbound pour la résolution mais le but de cet article est de s’intéresser à la mise en place rapide d’un point d’accès, nous allons donc simplement utiliser dnsmasq qui va nous permettre d’attribuer nos adresses IP tout en redirigeant les requêtes DNS vers un résolveur de notre choix.

 

Pour cela on installe dnsmasq et on le configure via /etc/dnsmasq.conf afin de prendre en compte les fichiers .conf placés dans /etc/dnsmasq.d/ :

# Include all files in a directory which end in .conf
conf-dir=/etc/dnsmasq.d/,*.conf

 

On crée ensuite un fichier /etc/dnsmasq.d/ap.conf avec notre configuration :

interface=wlp0s20u1
listen-address=192.168.0.1
bind-interfaces
no-resolv
domain-needed
bogus-priv
dhcp-range=192.168.0.10,192.168.0.50,255.255.255.0,1h
dhcp-option=3,192.168.0.1
dhcp-option=6,192.168.0.1
server=80.67.169.12
log-queries
log-dhcp

 

Ici nous indiquons à dnsmasq d’écouter sur notre interface afin de fournir des adresses IP sur l’interval 192.168.0.10-192.168.0.50 pour une durée d’une heure. On lui fournit également les IP du routeur et du serveur DNS et on redirige les requêtes DNS vers un DNS extérieur.

 

IV – Redirection du trafic

À partir de là nous allons créer des règles Iptables afin de rediriger le trafic entrant vers notre interface de sortie vers internet, tout en permettant l’interception du trafic entre les deux.

 

Nous activons le postrouting sur notre interface vers internet :

$ iptables -t nat -A POSTROUTING -o enp0s25 -j MASQUERADE

 

Nous faisons en sorte que les connexions soit possibles de l’interface AP jusqu’à l’interface Internet mais également dans l’autre sens pour les connexions déjà établies :

$ iptables -A FORWARD -i enp0s25 -o wlp0s20u1 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ iptables -A FORWARD -i wlp0s20u1 -o enp0s25 -j ACCEPT

 

Nous faisons un pré-routage des ports 80 et 443 de l’interface AP vers le port d’écoute de notre outil d’analyse :

$ iptables -t nat -A PREROUTING -i wlp0s20u1 -p tcp --match multiport --dports 80,443 -j REDIRECT --to-port 8080

 

À partir de là tout devrait fonctionner, il nous reste à bien activer hostapd et dnsmasq :

$ systemctl start hostapd
$ systemctl start dnsmasq

 

V – Analyser le trafic

Nous allons à présent utiliser un outil pour analyser le trafic des appareils connectés sur notre point d’accès. Ici j’ai décidé d’utiliser mitmproxy qui est un outil rapide à prendre en main et très complet.

 

Nous lançons donc mitmproxy en mode transparent sur le port 8080 :

$ mitmproxy –mode transparent -p 8080

 

Voilà, en connectant notre appareil on verra les flux http passer dans mitmproxy.

Pour le https il faut par exemple installer le certificat de mitmproxy sur notre système en allant sur http://mitm.it.

 

VI – Aller plus loin

Ce qui est vraiment intéressant dans l’analyse du trafic d’un téléphone sous android par exemple c’est le trafic des applications installées sur l’appareil. En modifiant nos règles de routage pour rediriger tout le trafic vers notre outil d’analyse (et plus seulement http et https) il est possible de regarder ce que font nos applications quand on les lance.

Pour cela il faut cependant ajouter notre certificat (celui généré par mitmproxy) dans le magasin de certificats du téléphone, ce qui nécessite quelques manipulations en plus du fait que notre téléphone soit rooté.

 

Android enregistre chaque certificat sous un nom contenant le hash de ce dernier suivi de .0, nous allons donc récupérer ce hash grâce à openssl :

$ openssl x509 -subject_hash_old -in mitmproxy-ca-cert.pem | head -1

 

Et nous copions donc notre certificat sur notre téléphone (sur la carte SD par exemple) sous le nom c8750f0d.0 dans mon cas. Maintenant il nous faut ajouter ce fichier dans le bon dossier pour que notre système le prenne en compte.

Pour faire cela nous allons ouvrir un shell root sur notre téléphone (via ADB ou directement sur l’appareil) et remonter notre système en read-write (il est en read-only par défaut) :

$ mount -o remount,rw /system

 

Puis nous allons copier notre certificat dans le magasin du téléphone :

$ cp /emplacement/du/certificat/c8750f0d.0 /system/etc/security/cacerts/

 

On lui donne les permissions :

$ chmod 644 /system/etc/security/cacerts/c8750f0d.0

 

Et enfin on remonte notre système en read-only :

$ mount -o remount,ro /system

 

Il peut être nécessaire de redemarrer le téléphone afin que le certificat soit pris en compte.

Écran du magasin de certificats android

On voit ici le certificat de mitmproxy dans le magasin de certificats Android

 

VII – Conclusion

C’est fini, on peut maintenant tranquillement lancer nos applications et regarder chez qui elles vont converser. Cependant l’analyse du trafic des applications sur mobile reste un sujet très complexe car nombre d’applications sur notre téléphone risquent de générer du « bruit » durant notre analyse. Vous pouvez regarder le travail d'Exodus Privacy sur le sujet.

Publié dans informatique tls certificate wifi


captcha