Wi-Fi Advanced Fuzzing - Ensiwiki

Transcription

Wi-Fi Advanced Fuzzing - Ensiwiki
Corentin DELPECH
Lucas FONTAINE
ENSIMAG 2A TELECOM
Mardi 13 Mars 2012
ENSIMAG - 4MMSR Network Security - Seminar
Wi-Fi Advanced Fuzzing
Laurent BUTTI
BlackHat Europe Conference 2007
Sommaire
1. Introduction, connaissances basiques Wi-Fi
a. Historique, les différentes normes, usages
b. Spécificités techniques
i. Modes de mise en réseau Wi-Fi
ii. Les trames WiFi
2. La sécurité des réseaux Wi-Fi
a. Quels enjeux ?
b. Quels moyens de test ?
3. Le ‘fuzzing’
a. Qu’est-ce que le fuzzing ?
b. Implémentation d’un fuzzer
4. Les vulnérabilités découvertes, cas concrets
5. Limitations des fuzzers, limitations des vulnérabilités, contre-mesures
6. Démonstration
7. Résumé, notions abordées, conclusion
8. Pour aller plus loin : présentation de Laurent Butti, anecdote
9. Annexe : références
Timing (17 minutes présentations + 3 minutes questions) :
[1 ; 2] : 4 minutes
[3 ; 6] : 10 minutes
[7 ; 9] : 3 minutes
Légende :
* Ce fond est relié directement au contenu du papier de recherche
* Responsables parties : Corentin / Lucas
=
17 minutes
1.Introduction, connaissances basiques Wi-Fi
a. Historique, les différentes normes, usages
Le terme “Wi-Fi” est apparu en 1999 et désigne un ensemble de protocole de communication
sans-fil régis par les normes du groupe IEEE 802.11.
Historique
Une seule norme était présente à l’origine et proposait un débit de 1 à 2 Mbps. Ce n’est
qu’après que sont apparues les différentes révisions de la norme, amenant à une augmentation
sensible du débit, mais supportant également de nouveaux critères de sécurité, de types de
connexions, et d’interopérabilité.
Les differentes normes
Citons rapidement entre autres les normes de connexion “connues” telles que le 802.11g et
802.11n présents sur les box des FAI actuels.
D’autres normes plus “originales” telles que le 802.11s permettent de créer un réseau maillée
type “mesh” avec des connexions ad-hoc dynamiques entres les usagers (n’importe quelle noeud est
récepteur et émetteur dans le réseau, dynamiquement, à différencier de l’architecture client <-> point
d’accès habituelle utilisée).
Les usages
Aéroports, hotels, dans nos foyers, en entreprise, le Wi-Fi est partout et utilisé par un nombre
de plus en plus conséquent de personnes via leurs laptop, téléphones mobiles, consoles de jeux,
tablettes, TV, appareils photos, frigo, chaines Hi-Fi, etc... ! A très court terme, le Wi-Fi servira de
délestage aux réseaux mobiles, telles que Free l’implémente sur son réseau mobile grace à ses
Freebox et le protocole EAP-SIM.
=> Le but ici n’était donc pas d’être exhaustif mais d’insister sur le fait que le “Wi-Fi” designe un
ensemble de normes riches en spécifications, entraînant une complexité potentiellement néfaste dans
le code des drivers qui supportent ces normes alors que ceux-ci sont de plus en plus présents dans
nos appareils !
b. Spécificités techniques, assumed background
b.1 Modes de mise en réseau Wi-Fi
Une carte WiFi peut passer entre plusieurs modes :
● le mode moniteur : la carte WiFi écoute passivement le trafic réseaux
: la carte WiFi agit comme un point d’acces
● le mode master
: la carte WiFi agit comme une station Adhoc (client connecté les
● le mode AdHoc
un aux autres sans point d’acces )
Il existe deux manière de découvrir un point d'accès pour une carte wifi : Soit elle
fait un scan actif du réseaux. C’est a dire qu’elle envoie des “probe requests” et attends les
réponses “probe responses”. Soit elle écoute passivement les informations que les autres
stations/points d’accès envoient périodiquement sur le réseaux. (les beacons)
Son comportement se décompose en trois états :
■ non authentifié, non associé
■ authentifié, non associé
■ authentifié, associé
Pour comprendre comment la carte wifi passe entre ces trois etats, il faut étudier ses trames.
b.2 Les trames WiFi
figure 1 : Architecture des trames WiFi :
Il existe plusieurs types de trames WiFi :
● les paquets de données
● les paquets de gestion
● les paquets de contrôles a station
Les paquets de gestions servent a gérer la connexion entre deux stations. Des
exemples de ce type de paquet : Authentification , desauthentification, association,
réassociation, ect...
Il existe trois classes de trames WiFi :
● Les trames de classe 1 : Les sondes, les Beacons, les trames d’authentification et de
desauthentification.
● Les trames de classe 2 : Les trames d’association, de désassociation.
● Les trames de classe 3 : Les trames de desauthentification.
Les liens entre les etats de la carte WiFi et se trames sont donc expliqués par cette machine a
états :
Figure 2 :
Machine a états d’un client WiFi
2. La sécurité des réseaux Wi-Fi
a. Quels enjeux ?
Laurent Butti a vu dans le Wi-Fi des enjeux en termes de sécurité tels que :
(coté point d’accès/infrastructure)
● Infrastructure réseau Wi-Fi friables (WEP, WPA mal utilisé/configuré -> cryptage WEP
cassé, WPA compromis)
● Infrastructure réseau avec points d’accès illégitimes ou mal configurés
(coté clients)
● Connexions à des points d’accès illégitimes dans les zones publiques (et si je créais un
faux points d’accès “wifi-campus” avec mon ordinateur hein ?!)
● De faux points d’accès attaquant les clients (automatiquement !)
● L’injection de trafic dans les communications clients, l’exploitation des systèmes clients
Le problème, comme le souligne Laurent Butti, est que tout cela est difficilement détectable car
complètement transparent sans des outils spécifiques (Wireless IDS...).
De plus, les drivers sont potentiellement l’objet de moins d’audit que les kernels, alors que
l’exploitation d’un drivers 802.11 pourrait permettre à n’importe qui dans la couverture réseau
d’une carte Wi-Fi cible de procéder à des exploitations ring0 ! Pretty big !
Il faut donc s’assurer en amont de l’utilisateur que les pilotes en charges des points d’accès
et autres cartes réseaux Wi-Fi “clients” soient sécurisés et se comportent correctement en
cas “d’anomalies” (et/ou en présence d’une attaque).
b. Quels moyens de test ?
- Avec des drivers “closed source”, comme c’est le cas en général, les tests se font en “boite
noire” (pas d’accès au code source du drivers) et par “reverse engineering”. Mais ce dernier
procédé est peu efficace (penible, couteux en temps, résultats mitigés)
- Avec des drivers open source (+ rare), on peut faire des tests en “boite blanche” (et ainsi
suivre quelle portion du code est sollicitée), et de l’audit de code source. Mais même dans ce
cas, il peut être utile de faire des tests en black box pour commencer.
- Un procedé, utilisé par M. Butti, est... (next part !)
3. Le fuzzing
a. Qu’est-ce que le fuzzing ?
Le ‘fuzzing’ est le nom donné à une méthode qui s’appuie sur des logiciels (les fuzzers) afin
d’automatiser la recherche de bugs ou de failles de sécurités dans des applications (Microsoft
en utilise pour tester son naviguateur Web Internet Explorer par exemple) ou encore, et c’est
là qu’on rejoint notre sujet, des protocoles, exemple : le Wi-Fi !
Basiquement, le ‘fuzzing’ consiste à tester toutes les entrées possibles, de toutes les manières
possibles, par l’injection de codes volontairement mal formés (+ ou - complètement aléatoires),
et à forcer certaines opérations en cas de réactions anormales, telle que l'exécution de codes
malveillants, etc...
Implémenter un fuzzer nécessite les bonnes connaissances, comme nous allons tout de suite le
voir, et bénéficie d’un des meilleurs rapports qualité/prix (résultat/temps)
b. Implémentation d’un fuzzer
La première étape pour Laurent Butti a été d’implémenter un fuzzer pour l’état 1. Le mode
moniteur (depuis le PC attaquant) est suffisant pour fuzzer cet état.
Comme expliqué par Corentin précèdemment, on peut trouver à l’état 1 des trames de
management. Un des champs de ces trames est le “Information Element”, de la forme très
simple :
- Type (un ID d’un octet)
- Longueur (longueur totale de la charge utile ‘Valeur’ sur un octet)
- Valeur (la charge utile du Information Element, de 0 à 255 octets).
Or, la norme 802.11 prevoit une longueur fixe ou maximale pour certains types d’Information
Element. On imagine bien alors les erreurs de programmations possibles, et on sent dès lors
tout l’intérêt de fuzzer l’Information Element :
• A la reception d’un IE, le drivers attribue un buffer statique d’une longueur fixe prédéfinie
(en fonction de ce qui est décrit dans la norme ou de façon arbitraire)
• Il lit sur la trame 802.11 le champ « length »
• Puis il copie le contenu de « value » dans le buffer statique
• Si (length > taille statique du buffer), alors on déborde sur la pile ou le tas
L’équipe de Laurent a selectionné une batterie de test
- En fonction de “l’état de l’art” des vulnérabilités découvertes
- En fonction des Information Element les plus importants (IE 0 : SSID (0 - 32 octets), IE 3 :
Channel (fixé 1 octet), etc ...)
- En fonction des bordures à tester {0, 1, MIN-1, MIN, MIN+1, MAX-1, MAX, MAX+1, 254, 255}
C’est bien beau tout cela, mais concrètement, comment s’y prendre pour tester ?! /!\
Laurent B. et son équipe ont employé la recette de cuisine suivante :
- Pré-calculer un ensemble d’Information Element à tester et à renvoyer à un client Wi-Fi cible
- Attendre de recevoir un “probe request” d’un client Wi-Fi avec un SSID “Null” sur le broadcast
(= active scanning du client Wi-Fi à la recherche de points d’accès !)
- Renvoyer un “probe response” approprié avec l’Information Element à tester à la victime
Difficultés !
- Certains Information Element proprietaires (802.11g turbo, apparu avant la ratification de
la 802.11n, etc... ) sont utilisées par les constructeurs et sont peu/mal documentés, difficile à
analyser / tester !
- Comme le client Wi-Fi scan activement le medium avec des probe request, il envoie ses
trames sur l’ensemble des channels Wi-Fi, un par un (= channel hopping). Il faut donc répondre
très rapidement à son “probe request” avant que celui-ci n’ai déjà changé de channel !
-> Très dur avec une implémentation du fuzzer en Python, encore + avec Scapy
- Difficile de savoir si le “probe response” renvoyé a été analysé par le client Wi-Fi fuzzé
-> Comment savoir alors si le drivers n’ai pas sensible à notre attaque ou s’il n’a juste pas lu le
paquet ?
- Comment detecter un bug de comportement sur les différents systèmes d’exploitation ?!
Solutions !
- Pour que le parser soit efficace, envoyer des données aléatoirement ne suffit pas, il faut être
plus intelligent. Exemple, avec un chiffrement WPA, il faut que le début de la trame soit valide
pour être acceptée par le parser WPA (WPA IE + WPA OUI + WPA TYPE + WPA VERSION).
- Flooder le medium radio avec des beacons sur le broadcast et des probe response sur une
victime en particulier, en permanence (ne pas attendre de probe request sinon on a pas le
temps de répondre, on “anticipe” en quelque sorte)
- Detection automatique de bug /!\ :
- Sous Windows BSOD et ne répond plus au ping
(il suffit de pinger sur Ethernet, arreter quand le ping ne répond plus)
- Sous Linux, on surveille les messages kernels {oops|unable to handle|assert|panic}
- La carte Wi-Fi peut devenir non fonctionnelle après un test : si la carte était en “active
scanning”, on détecte un bug quand celle-ci n’envoie plus de “probe request”
- Implémenter des fuzzers spécifiques à certains IE proprietaires, certaines implémentations
(WPA, RSN, WSP)
Un petit plus …
Développement par l’équipe de Laurent B de leur propre fuzzer (fuzzers et framework existants
non adaptés), test de plusieurs IE malformés dans la même trame, test avec des trames
tronquées ou vides.
4. Les vulnérabilités découvertes, cas concrets
●
NetGear MA521 Wireless Driver Long Rates Overflow
○ Utilisation d’une trame avec un IE “Rates” trop long
(longueur maximale de 8 octets normalement)
●
NetGear WG311v1 Wireless Driver Long SSID Overflow
○ Utilisation d’une trame avec un IE “SSID” trop long
(longueur maximale de 32 octets normalement)
●
D-Link DWL-G650+ (A1) Wireless Driver Long TIM Overflow
○ Utilisation d’une trame avec un IE “TIM” trop long
●
Madwifi Driver Remote Buffer Overflow Vulnerability
○ Utilisateur d’une trame avec IE WPA/RSN/VMM/ATH trop long
○ Exploitable uniquement lors d’un appel à SIOCGIWSCAN du client
■ Commande ‘iwlist’ par exemple
Cas concret : la faille MadWifi (= une trame WiFi 802.11 -> execution
de code arbitraire à distance en mode ring0 sous Linux !!!)
●
●
●
●
●
Trame Wi-Fi avec un IE WPA dont les champs OUI, TYPES et VERSION sont bien
formatés (necessité d’un “fuzzer” + intelligent avec connaissance du WPA qu’un simple
fuzzer “basique” totalement random, sinon le parser WPA rejette la trame)
Autres champs fuzzés -> oops du kernel Linux !
On observe : plusieurs registres sont impactés, dont le registre EIP (= offset de la
prochaine instruction a executer !) et EBP (= offset du sommet de la pile)
Le but du jeu avec le registre EIP = faire pointer la prochaine execution vers du code
injecté dans la trame vérolée.
L'exécution de code arbitraire a distance est réalisée
Analyse du bug exploité dans Madwifi (code source disponible)
● Allons voir dans le fichier ‘net80211/ieee80211_scan.c’ du code source,
fonction ‘giwscan_cb()’
● Dans les noyaux recents compilés, le wireless extension est supérieur à 14, on passe
dans le “if” -> un buffer de 64*2+30 = 158 octets est bien alloué
●
Un peu plus loin, on regarde où ce buffer est utilisé. Deux possibilités :
○ IWEVGENIE est utilisé (dans la plupart des noyaux recemment compilé c’est
le cas). On passe dans le “if”. BINGO. Vulnérabilité dans le ‘memcpy’, la taille
maximale de ‘se->se_wpa_ie[1] n’est jamais verifié ici ni ailleurs, nous avons un
debordement de pile !
○ IWEVGENIE n’est pas utilisé, la fonction encode_ie est alors appelé avec des
paramètres de taille du buffer incriminé non vérifié, allons voir ce le code de cette
fonction pour une possible seconde faille.
■ C’est la variable “ielen” et le pointeur “p” qui sont ici maitrisés par
l’attaquant.
■ La fonction ‘sprintf’ permet alors de réaliser un débordement de pile en
convertissant le contenu de l’IE en ASCII dans “buf”.
L’exploitation a proprement parlé (condensat)
L’Information Element verolé se retrouve en pile noyau (avec “buf”). La taille de celui-ci est,
rapellons-le, de 158 octets. Seuls les 6 premiers octets ne sont pas utilisables (car ce sont les
octets des champs OUI, TYPE et VERSION qui doivent être parsés correctement). Il reste donc
152 octets de shellcode : à nous les portes du code exécutable malveillant !
5. Limitations des fuzzers, limitations des
vulnérabilités, contre-mesures
Les limitations dans la recherche de vulnérabilité des fuzzers sont :
● Comprehension du protocole par le développeur (les normes Wi-Fi sont
nombreuses et complexes !)
● Le fuzzer n’est efficace que pour trouver les bugs les plus faciles d’accès
La complexité de la norme 802.11 entraîne des limitations lors de
l’implémentation du fuzzer. Par exemple un fuzzer ne trouvera pas de bugs
complexe due au fait que les test qu’il effectue sont simples et que son
implémentation ne doit pas devenir un casse tête (on perd en efficacité)
● Le fuzzer doit gérer des états, des synchronisations avec les points d'accès
Ce qui peut être dur pour gérer les test a fournir. Le fuzzer doit monter lui même
d’un état à un autre, complexité des ACKs à renvoyer, ...
● Paquets pas forcement analysés
Il n’est pas sur que les paquets envoyé soient analysés par le driver : ceci peut
entraîner des “false negatives” :
● La rapidité du fuzzer doit être à la hauteur client
Les echanges de trames de données doivent se faire assez rapidement pour
qu’elle soient prise en compte par la carte Wi-Fi cliente.
● En cas de découverte d’un bug par le fuzzer, encore faut-il pouvoir
l’identifier
● Cas de bugs n’entrainant pas le crash du systeme ( bug non critique )
exemple ( fuite d’information ) u il est possible de faire lire au driver des zones
memoires contigues au paquet 802.11 stock´e en m´emoire du processus, cependant,
comme ces zones memoires sont lisibles et generalement accessibles, cela n’entraine
pas de dysfonctionnement critique.
Les limitations dans l’exploitation de vulnérabilités sont :
● La gestion du système cible
La carte Wi-Fi cible peut tomber, on peut ne pas maitriser correctement l’injection
de l’exploit suivant le système d’exploitation visé, …
stack overflow -. pour les cibles generiques
en se specifiant a une cible on peut laisser la pile intacte, et ainsi executer du
code
Les contres mesures applicables faces a ces vulnérabilités :
● La faille a déjà été découverte et un package a été réalisé ! (ex : Madwifi )
-> patchez !
parfois effectué de maniere silencieuse d’une version d’un systeme d’exploitation a
un autre.
6. Démonstration
Objectif
Fuzzing du Information Element SSID et BSSID dans des beacons Wi-Fi
Plateforme attaquante :
●
●
●
●
Nettop Packard Bell Imax Mini C2600
OS : Backtrack 5 “Revolution” Rev. 4
Metasploit 3.8 + Lorcon2
Metasploit commands :
○ msfconsole # lancement de la console du framework Metasploit
○ use auxiliary/dos/wifi/fakeap # on indique quel module utilisé
○ set 3000000 # configuration du paramètre du module pour l’envoi de 3 millions
de fausses annonces point accès
○ exploit # lancement de l’exploit
Plateforme cible :
●
●
Tout device muni d’un chipset Wi-Fi pouvant scanner les points d’accès de manière
passive en écoutant les beacons sur le medium
Participation active de l’audience : “allez consulter la liste des points d’accès Wi-Fi que
vous detectez sur votre ordinateur / tablette / smartphone !”
Resultat attendu :
●
Sur MacBook Air 3,2 et Mac OS X 10.6.8, avec logiciel de scan Wi-Fi ‘KisMac’ (v. 0.3.3),
le scan des points d’accès alentours indique une pléthore de points d’accès dont les
champs SSID et BSSID sont totalement aléatoires.
●
Indeterminé sur autres devices
(un quelconque comportement inattendu dans l’audience ?! ;))
7. Résumé, notions abordées, conclusion
les points importants de cette conférence sont :
L’arrivée de la norme 802.11 entraine beaucoup de problématique de sécurité : attaques sur
des infrastructure réseaux friables, attaques de client a partir de faux points d’acces .
Le Fuzzing a une meilleur rentabilité dans la découverte de vulnérabilité par rapport aux autres
methode de test(ex: reverse engineering).
Pour tester la carte reseaux sans fils il s’appuie sur :
● ses etats
● les information portée par les trames wifi
Il permet des découvrir les failles les plus basiques pour les drivers Wi-Fi : il reste quand même
possible de découvrir des bugs plus complexe pour peu que son developeur ait une forte
connaissance du protocole 802.11.
Le fuzzing nous permet de trouver des bugs critiques.
Cependant le “WiFi” n’en est que a ses débuts :
● Il restes des bugs complexe a trouver.
● D’autre extentions de la norme 802.11 vont arriver et leurs fonctionalités ne seront pas
testées.
● D’autre support a connexions sans fils vont arriver : WUSB, bluetooth 3.0 …
● Access Point fuzzing ! (cf references)
8.Pour aller plus loin : présentation de Laurent BUTTI,
anecdote
Ce sujet est le fruit d’une recherche de Laurent Butti :
C’est un chercheur travaillant pour Orange spécialisé dans la sécurité réseaux. Il effectue aussi
des conférences pour présenter ses travaux sur la sécurité WI-FI.
Son travail sur le fuzzing lui a permis de découvrir de nombreuse failles, notamment une sur le
driver madwifi .
Il a prévenu l’équipe Madwifi et attendu sa mise a jours avant de l’annoncer publiquement, vu la
criticité de cette faille. Les developpeurs ont reagis rapidement et un patch etait implémenté le
lendemain pour corriger le bug.
Il faut préciser que malgrés leur annonces, les failles découvertes ne sont pas forcement
corrigé par les developeurs.
C’est une anecdote pour annoncer deux points sur Laurent BUTTI :
● Sa méthode du fuzzing est efficace ;
● C’est quelqu’un de consciencieux car il l’utilise que a bon escient (cela peut
sembler ‘normal’ mais il a attendu la correction de la faille avant de la dévoiler par
exemple)
9. Annexe : réfèrences
Document plus récent de Laurent Butti sur le Wifi Fuzzing + Access Point Wifi Fuzzing
(transmis Fabien D.) https://www.cr0.org/paper/hacklu2007-final.pdf
Article détaillé sur le Wifi Fuzzing de Laurent Butti :
https://www.sstic.org/media/SSTIC2007/SSTIC-actes/
Recherche_de_vulnerabilites_dans_les_drivers_par_t/SSTIC2007-ArticleRecherche_de_vulnerabilites_dans_les_drivers_par_techniques_de_fuzzing-tinnes_butti.pdf
Introduction :
http://fr.wikipedia.org/wiki/Wi-Fi
La sécurité des réseaux Wi-Fi :
(Laurent Butti & Julien Tinnes pour le SSTIC 2007) http://actes.sstic.org/SSTIC07/
WiFi_Fuzzing/SSTIC07-Butti_Tinnes-WiFi_Fuzzing.pdf
Démonstration - Module exploité du framework Metasploit
http://www.metasploit.com/modules/auxiliary/dos/wifi/fakeap
Vocabulaire
WSP
Abbréviation de “Wireless Session Protocol”, une couche “Session” pour
l’architecture WAP
Réponses à d’éventuelles questions
- Commencer forcer une carte Wi-Fi victime à analyser nos frames corrompues avec des IE ?
Il faut forcer la carte à scanner activement à la recherche de points d’accès. Sous
Windows, avec Netstumbler, sous Linux en utilisant la commande “iwlist”, avec mon Mac
j’ai utilisé KisMAC. Pour être sur que la frame malveillante a été analysée par le drivers,
il suffit de voir la liste des points d’accès rafraichie dans Netstumbler, KisMAC ou avec la
commande “iwconfig”.
- Depuis quel materiel est-il possible de mener ces attaques par Wi-Fi fuzzing ?
Le chipset Atheros et son driver Open Source madwifi sous Linux sont reputes pour etre
tres flexibles au niveau de la creation des trames 802.11. En e et, le fuzzing
impose le changement de champs specifiques des trames 802.11 qui peuvent dans
certains cas etre geres directement par le firmware. Si tel etait le cas, alors les tests
seraient fauss´es du fait de la non maiıtrise de certains champs 802.11. Les limitations
possibles `a cause du firmware du chipset sont generalement au niveau de :
– la valeur du numero de sequence des trames,
– la valeur du BSS Timestamp dans les trames beacon et probe response,
– la valeur du duration id des trames,
– la capacite a envoyer des trames fragmentees,
– la capacite a envoyer des trames de controle.
Le chipset Atheros supporte toutes les fonctionnalites precedentes sauf l’usurpation
du numero de sequence des trames qui n’est pas supporte en standard dans le driver
madwifi. Il est possible de patcher le driver pour supporter cette fonctionnalite, mais elle
impose alors d’avoir le champ (( retry )) positionne a 1 pour toutes les trames injectees,
ce qui est genant si l’attaquant veut se cacher de logiciels de d´etection d’intrusion
802.11 evolues.