Archive for juin, 2012

Nous y voilà ! Comment sniffer l’HTTPS ? Et bien c’est possible… et voici comment !

0. Préambule

Sniffer le trafic HTTPS est plus compliqué : soit vous décryptez les trames SSL (ça peut prendre du temps…), soit vous vous faîtes passer pour le serveur. HTTPS chiffre toute la connexion, par conséquent il n’est pas possible de récupérer les URLs, ni même le nom de domaine vers lequel les requêtes sont envoyées, vous n’aurez que l’adresse IP, ce qui est bien mais insuffisant !

Alors comment récupérer les données qui passent à travers le SSL ? En redirigeant tout le trafic vers un serveur sur notre machine, déchiffrer, puis jouer le rôle d’un proxy pour finalement renvoyer les données au vrai serveur.

Dans cet article, on va essayer de lire ce qui se passe avec www.paypal.com

1. Sniffer le trafic du mobile

Vous pouvez vous référer à l’article précédent Sniffer le trafic d’un iPhone/Android avec Linux.

2. Quel domaine ?

Comme je l’ai dit, on ne peut pas retrouver quel domaine est interrogé par un webservice en lisant la trame SSL. Mais on peut regarder de quelle IP notre mobile a besoin !

Pour récupérer le nom de domaine, il suffit donc de regarder quelles sont les requêtes DNS qui passent, et de regrouper les adresses IPs données avec l’IP du trafic SSL.

En l’occurence, il s’agira de www.paypal.com.

3. Déchiffrer : stunnel

On va utiliser le fabuleux programme stunnel pour lire le trafic SSL.

stunnel est un programme qui permet en gros d’utiliser SSL pour les clients et les serveurs qui ne le supporte pas. On va donc déchiffrer / rechiffrer le trafic pour le lire en clair.

3.1 Stunnel 1 : accéder en clair à un serveur https

Iil faut configurer stunnel :

pid = /var/run/stunnel-client.pid
client = yes
[www.paypal.com]
accept = 127.0.0.1:50000
connect = www.paypal.com:443

Si vous allez sur http://127.0.0.1:50000/ et que vous acceptez le certificat, vous devriez avoir une page HTML en résultat, signe qu’on a bien été connecté avec paypal.

3.2 Rediriger le trafic SSL vers un serveur sans SSL

Il nous faudra un certificat autosigné, puis créez un fichier mondomaine.pem qui contient la clé et le certificat :

cat mondomaine.key mondomaine.crt > mondomaine.key

Ensuite, il faudra bien configurer stunnel :

pid = /var/run/stunnel-server.pid
client = no
cert = /path/to/www.paypal.com.pem
key = /path/to/www.paypal.com.pem
[www.paypal.com]
accept = 0.0.0.0:50001
connect = 127.0.0.1:50000

Lancez stunnel avec ce fichier de conf : vous devriez pouvoir vous connecter sur https://127.0.0.1:50001/ en acceptant le certificat.

4. Rediriger le trafic provenant du mobile

Pour rediriger le trafic provenant du mobile vers notre serveur, il faut utiliser iptables :

$ iptables -t nat -A PREROUTING -d www.paypal.com -p tcp --dport 443 -j REDIRECT --to-ports 50001

Si vous allez depuis votre mobile sur https://www.paypal.com/, vous devriez avoir une alerte de certificat. Acceptez cette alerte : vous devriez avoir paypal.com, mais en passant par votre serveur.

5. Mais je ne vois toujours rien en clair…

Le trafic en clair passe sur votre localhost : utilisez donc wireshark sur cette interface…

6. C’est pour débugger une app et ça marche pas…

… parce que votre certificat n’a pas été validé par une autorité, et ne le sera jamais ! Envoyez le certificat .crt sur votre mobile (par email ?) et installez-le sur votre mobile 🙂

Générer un certificat autosigné, c’est générer un certificat pour un nom de domaine précis, sans que ce certificat ne soit valide aux yeux du navigateur. Néanmoins, ce certificat peut être importé dans une base de certificat, ce qui permet d’éviter les alertes de sécurité.

Il ne s’agit pas ici de sécurité, mais plutôt de générer un certificat pour un nom de domaine donné et de le faire accepté par un navigateur.

Le certificat doit comporter une clé privée

openssl genrsa -out mondomaine.key 1024

Et un certificat public

openssl req -new -x509 -days 365 -key mondomaine.key -out mondomaine.crt

C’est fini ! Quand on vous demande des champs, remplissez bien votre nom de domaine lorsqu’on vous demande le CN (Common Name, eg YOUR NAME).

Pour sniffer le réseau, nous allons transformer notre ordinateur sous Linux en routeur Wifi pour notre mobile.

Téléchargez le script sniff.sh, qui reprend toutes les étapes de ce tutorial, et modifiez-le à votre guise !

Avec ce système, l’ordinateur est connecté au réseau filaire pour Internet, et l’iPhone sera connecté à l’ordinateur via la carte réseau. Il est aussi possible de connecter l’ordinateur à Internet via wifi avec une deuxième carte réseau sans fil.

1. Désactivez votre gestionnaire réseau

Tous les gestionnaires réseaux ne sont pas capables de gérer plusieurs connexions réseau en même temps. Du coup, on désactive le gestionnaire réseau pour tout configurer manuellement (à l’ancienne !)

$ /etc/init.d/wicd stop
$ /etc/init.d/NetworkManager stop
$ ...

2. Votre connexion Internet

Réactivez votre connexion internet : si vous êtes en ethernet par exemple, vous pouvez exécuter dhcpcd eth0. Si vous êtes en Wifi, reportez-vous à la configuration de wpa_supplicant (mais vous aurez besoin d’une autre interface Wifi pour votre mobile !)

Ensuite, pour que votre ordinateur transfère les paquets, il faut activer le NAT :

$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # Active le NAT : changez eth0 par le nom de votre interface réseau Internet
$ sysctl net.ipv4.ip_forward=1 # Active le routage des paquets via votre ordinateur

3. Votre connexion Wifi

Pour transformer votre ordinateur en routeur, il faut configurer le wifi et le DHCP (facultatif) pour aider votre mobile à se connecter.

Configuration du Wifi

On configure l’interface pour lui donner un nom Wifi, et une adresse IP :

$ iwconfig wlan0 mode ad-hoc # passage en mode ad-hoc : on autorise un autre device Wifi à se connecter avec nous
$ iwconfig wlan0 essid RouteurMobile # Nom de votre réseau
$ ifconfig wlan0 10.10.10.1 # L'adresse IP de votre carte réseau Wifi

Sans DHCP

Vous pouvez connecter votre mobile dès à présent pour utiliser votre réseau, mais il faudra alors lui donner les paramètres suivants :

  • IP : 10.10.10.2
  • Gateway/Passerelle : 10.10.10.1
  • Netmask : 255.255.255.0 (ou 255.0.0.0 si vous voulez – ça importe peu)
  • DNS : on va utiliser les DNS de Google : 8.8.8.8 et 8.8.4.4

Avec DHCP

Sinon, vous configurez votre routeur linux pour fournir ces paramètres via un serveur DHCP. Cela évite de rentrer manuellement sur le téléphone les paramètres de la connexion IP.

Pour ce faire, commencez par installer le serveur dhcpd. Ensuite, paramétrez comme suit votre fichier (/etc/dhcp/dhcpd.conf) :

option domain-name-servers 8.8.4.4, 8.8.8.8;
default-lease-time 600;
max-lease-time 7200;
subnet 10.10.10.0 netmask 255.255.255.0 {
  range 10.10.10.10 10.10.10.20;
  option routers 10.10.10.1;
}

Vous pouvez télécharger un exemple de fichier de conf dhcpd.

Puis démarrez votre serveur : /etc/init.d/dhcpd start

4. Connexion

Si tout s’est bien passé, vous verrez votre réseau créé sur votre mobile, et vous pourrez vous connecter dessus sans problème.

5. Sniffer avec Wireshark

Je vous propose d’utiliser wireshark pour sniffer le trafic.

Quelques filtres :

  • http : affichera les requêtes HTTP, mais uniquement les paquets de questions (GET, POST, …) et ceux de réponses (HTTP/1.0 200 Ok, …)
  • dns : les requêtes DNS
  • dhcp : utile pour débugger le trafic DHCP

Problèmes fréquents

  • Mon réseau n’apparait pas : vérifiez que la carte wifi de votre linux est bien configurée avec iwconfig et que l’interface est up : ifconfig wlan0 up
  • Je me connecte mais je n’ai pas l’icône wifi, et pas d’adresse IP ou une adresse IP en 169.254.* : votre serveur DHCP ne fonctionne pas. Relancez-le et vérifiez sa configuration.
  • Je suis connecté mais je ne vois rien dans Wireshark : vérifiez que vous avez sélectionné la bonne interface à écouter ! Aussi, utilisez votre iPhone pour aller sur Internet un peu 🙂

Ceci n’est qu’une étape vers un prochain article : sniffer des connexion HTTPS !