Capturer les handshakes wifi WPA2 en langage C avec les Raw Sockets

Capturer les handshakes wifi WPA2 en langage C avec les Raw Sockets

Nous allons voir dans cet article comment capturer les handshakes wifi wpa en utilisant les RAW SOCKETS en langage C

Beaucoup de programmes de ce type existent en Python, mais il est assez difficile, et pour tout dire quasi impossible d’en trouver en C. Pourtant beaucoup de gens aiment programmer en C, il est donc dommage de ne pas pouvoir bénéficier de ces connaissances dans ce langage, et ce d’autant plus que, les raw sockets permettent de faire tout ce qu’on veut.

Le code source de mon programme est publié ci-dessous. Il compile sous linux sans problème avec la commande : gcc gethanshake.c -o gethandshake

Mais avant de parler de capturer les handshakes, voyons d’abord ce que c’est.

Un réseau wifi domestique est composé d’un point d’accès wifi, auquel on connecte des appareils clients. Le point d’accès (AP pour access point) émet plusieurs fois par seconde des trames appelées “beacons”, qui lui permettent d’être détecté par les appareils environnants. C’est grâce à ces trames que ce réseau wifi apparait dans la liste des réseaux wifi disponibles.

Si un des clients souhaite se connecter à ce réseau, il va contacter le point d’accès pour d’abord s’associer à celui-ci (échange de trames dites d’association), puis, et c’est ce qui nous intéresse ici, il va s’authentifier auprès de ce point d’accès. S’authentifier signifie que les deux entités (le point d’accès et le client) vont s’échanger 4 trames, qui ont pour but de faire en sorte que chacun des deux va prouver à l’autre qu’il connait le secret, sans pour autant jamais se l’échanger. Le secret, c’est typiquement le code de connexion au réseau wifi (celui qui figure sur votre livebox et que vous devez entrer sur votre machine pour vous connecter au réseau).

Je renvoie le lecteur à mon article précédent sur la faille Krack pour comprendre le détail de cette mécanique. L’idée générale est que le secret ne doit jamais être échangé sur les ondes car il pourrait être intercepté.

En résumé :

Etape 1 : le point d’accès envoie au client un nombre aléatoire appelé ANonce. Ce nombre est présent dans la première trame, qui est émise par le point d’accès.

Etape 2: Connaissant maintenant ANonce, le client choisit lui aussi un nombre aléatoire appelé SNonce, et il calcule une clé PTK qui est fonction : du secret, de ANonce, de SNonce, de l’adresse MAC du point d’accès, et de l’adresse MAC du client. Dans la deuxième trame, qui va cette fois du client vers le point d’accès, le client envoie au point d’accès SNonce, mais aussi une signature cryptographique de cette trame réalisée à partir d’un morceau de la clé PTK. Cette signature est appelée le MIC

Etape 3 : le point d’accès connait maintenant SNonce, et est donc en mesure de calculer la même clé PTK que celle du client. Il calcule une clé GTK, qu’il chiffre avec un bout de la clé PTK et l’envoie vers le client dans la trame numéro 3.

Etape 4 : le client déchiffre la clé GTK, l’installe et accuse réception au point d’accès dans la 4è et dernière trame de cette séquence d’authentification qu’on appelle le 4 way handshake

Mon programme en C scrute tout ce qui passe dans les airs et affiche à l’écran les valeurs des Nonces et des MIC contenus dans les trames qu’il voit passer.

A quoi cela sert-il ? A comprendre ce que ferait un pirate qui chercherait à pénétrer votre réseau wifi.

La démarche du pirate est la suivante : il va capturer les handshakes qui passent (donc il connait ANonce, SNonce, les adresses MAC du client et du point d’accès). Le seul élément qui lui manque pour calculer lui aussi la clé PTK et accéder au réseau, c’est le secret.

Il va donc prendre un secret “au hasard”, calculer la clé PTK qui va avec ce secret, calculer les MIC correspondant à ceux théoriquement contenus dans les trames du handshake, puis comparer les MIC qu’il calcule à ceux qu’il a capturés. S’il y a correspondance, c’est qu’il a trouvé le secret (donc la bonne clé PTK, et il accède au réseau), sinon, il choisit un autre secret “au hasard”.

“au hasard” est entre guillemets puisqu’en réalité, soit il va tester toutes les clés possibles (attaque par force brute), soit il va essayer sur des mots ciblés (attaque par dictionnaire), soit par d’autres moyens (attaque par rainbow tables par exemple)

Bon bref, vous voyez le principe.

Petit détail, comme généralement le pirate n’est pas patient, il ne va pas attendre des heures que quelqu’un se connecte au point d’accès pour récupérer les handshakes. Généralement ce qu’il fait c’est qu’il émet une trame dite de deauthication soit ciblée vers un client précis déjà connecté, soit vers tous les clients (broadcast) pour les obliger à se reconnecter au point d’accès. Ainsi tous les clients se mettent instantanément à refaire des handshakes avec le point d’accès et le pirate récolte ce qu’il veut de suite.

Je vous vois d’ici : “Comment ? Les clients ne vérifient même pas que les trames deauth proviennent bien du point d’accès ?”

En fait, si parfois, et non parfois. En fait, cela ne change rien puisque les fausses trames deauth sont construites comme les vraies, c’est à dire que dedans l’adresse MAC d’émission n’est pas celle du pirate mais celle du point d’accès. Le client n’a donc aucun moyen de séparer les fausses trames des vraies.

Ces trous de sécurité (le fait qu’on puisse lire les handshakes aussi facilement, et qu’on puisse balancer des trames deauth qui fonctionnent aussi facilement) seront normalement comblés avec la norme WPA3 qui s’annonce.

Inutile de dire que mon programme n’envoie aucune trame deauth.

Voici mon programme en action sur un test constitué de mon smartphone Android partageant un réseau wifi nommé “Honor 8”, et de mon iPad qui se connecte dessus. L’iPad et le smartphone font un handshake en 4 temps capturé par mon PC sous Linux et faisant tourner gethandshake.

Le code source du programme figure ici.

/*
This software demonstrates how to catch wifi WPA2 handshakes in C using Raw sockets
It turns your wifi adapter into monitor mode and then show the 802.11 wifi traffic
When a handshake is detected, handshake data are displayed : ANonce, SNonce, and MIC
No cracking is performed, the tool only reads public data
No deauth frame sent, the tool is completely passive
Instructions :
Declare the name of your wifi adapter in the INTERFACE variable below (often “wlan 0”, but you can use iwconfig to check)
then compile :
gcc gethandshake.c -o gethandshake
and run with root privileges :
sudo ./gethandshake
Terminate with Ctrl-C when done. The wifi adapter goes back to managed mode
Enjoy
Code by alain.quemeneur@gmail.com
*/