---
title: "Sécurité des réseaux : les réseaux Wifi"
date: 2022-11-15
tags: ["authetification", "WPA", "wifi"]
categories: ["Sécurité des réseaux", "Cours"]
matjax: true
---

Contrairement à un réseau filaire, tout le monde (avec une carte réseau Wifi)
peut observer le trafic réseau. Il faut donc chiffrer les communication c'est le
rôle des différents protocoles: WEP, WPA, WPA2 etc.

La contrainte énergétique est importante et guide les chois techniques.

## WEP -- Wired Equivalent Privacy

(Non! Non! ce n'est pas une blague)

Les clients et la borne partagent une clé statique de 64 ou 128 bits. Le
chiffrement est basé sur *RC4* et la détection d'erreur sur CRC. C'est un
protocole **cassé depuis longtemps**

Au niveau de l'émetteur:

 1. Calculer la somme de contrôle du paquet et les ajouter à ce dernier
 2. Calculer un nouvel *Initialisation Vector* et l'ajouter à la clé pour former
  une clé
 3. Utiliser l'algorithme RC4 pour former une clé de flux donc la longueur est
  égale à celle de la trame (données + CRC)
 4. obtenir la trame chiffrée : \\(trame \xor cle_flux \\)
 5. Ajouter l'IV dans l'entête de la trame chiffrée. 

Le récepteur récupère l'IV de l'entête pour reconstituer la clé de flux puis
réalise les opération de l'émetteur dans le sens inverse.

La seule variable ici est l'*IV* d'une taille de 24 bits seulement. Un attaquant
peut alors récupérer des trames et tester des collisions pour faire baisser
l'entropie (attaque passive).

## WPA

Le changement est simple : on passe d'un *IV* statique à un *IV* dynamique et
un meilleur algorithme de somme de contrôle (pour l'intégrité). Ce protocole est
dérivé de la norme 802.1x.

Deux modes existes :

 * **personnel**: la même clé est utilisé pour tous les protagoniste;
 * **entreprise**: établissement d'une connexion TLS puis identification.

### Poignée de main

Dans le cadre d'une connexion par **phrase de passe**, celle-ci est transformée
en PSK (*Pre-Shared Key*). Ensuite le système génère une clé temporelle: la
*PTK* :

\\(PTK = PSK, @MAC_{client}, @MAC_{borne}, N_{client}, N_{borne}\\)

L'*IV* est remplacé par le TSC, un compteur sur 128 bits

\\( keystream = f(TSC, PTK)\\)

*PTK* est renégociée lorsque *TSC* est au bout ou presque.

Pour garantir l'intégrité des messages, *WPA* utilise MIC don l'implémentation
(*MIChael) est dérivée de *HMAC-SHA1*. Le MIC est calculé sur le paquet
**avant** fragmentation.

## WPA2

C'est le même protocole que WPA mais avec des algorithme de cryptographie à
jour: `AES` et `SHA-256`.

## Les attaques sur WPA 1/2

Le rejeu est casi-impossible à cause de *TSC*. Cependant en 2014, `Chop-Chop`
est adaptée à WPA.

Avec l'arrivée des bornes multi-canaux, les constructeurs ont implémentés un
*TSC* par compteur. Il est donc possible de rejouer un paquet provenant d'un
canal avec un gros TSC sur un canal avec un TSC plus petit. Il suffit de choisir
un petit paquet pour éviter la fragmentation et observer ensuite ce qui se 
passe.

### KRACK!

Ici l'attaquant se position en MitM sur un canal de la borne. Il commence à
rejouer les paquets tel quel entre la borne et le client. Lors de l'installation
de la *PTK* puis son envoi, l'attaquant de transmet pas les paquets au client.

Le serveur va redemander les paquets au client qu'il va lui envoyer **en
clair**. L'attaquant dispose alors d'une version chiffrée et en clair d'un même
paquet. Il est possible **d'en déduire la keystream*.

### WPA3

C'est globalement la même base que *WPA2*' mis à part la poignée de main.

Dans WPA2 nous avons \\(PSK \to PMK \to PTK\\), la PMK est commune à tous les
clients (la *PTK* est propre à chacun d'eux). Dans WPA3 nous voulons que la
*PMK* soit **différente** pour chaque client et aussi **se débarrasser de la
phrase de passe dans la poignée** de main. Un peu la manière de *Kerberos*.

### poignée de main

3 modes de fonctionnement:

 1. ouvert (chiffrement opportuniste);
 2. personnel SAE (dragonfly)
 3. entreprise

Avant le dq'ebut de la poignée de main, il y a un échange de clé *Diffie
-Hellman*. Puis vien ensuite la poigné de main du type *4 way hanhshake*

Pour générer \\(g_{client}\\) et \\(g_{borne}\\) on applique fonction pour
dériver la phrase de passe. La poignée de main est **maintenant chiffrée**.

L'inconvénient est la puissance de calcul nécessaire pour mettre en place le
canal sécurisé est importante, surtout pour du matériel emparqué. Un attaque
possible serait de bonbarder la borne de demande de poignée de main pour la
saturer: une attaque par déni de service.

WPA3 reste tout de même compatible avec WPA2, une attaque **par downgrade** est
donc possible.
