wpa_supplicant: ¿detectando que mi contraseña es incorrecta?

wpa_supplicant: ¿detectando que mi contraseña es incorrecta?

Si especifico una contraseña incorrecta cuando me conecto a una red WiFi, hay alguna forma de detectar que la razón por la que no puedo conectarme es la contraseña incorrecta (en lugar de una de las muchas otras razones posibles por las que uno podría no poder conectarse).

Por ejemplo, aquí agrego una red pero especifico deliberadamente una contraseña incorrecta. Si reviso el estado solo veo que esSCANNING

# wpa_cli add_network
Selected interface 'wlan0'
1
# wpa_cli set_network 1 ssid \"MyPlace\"
Selected interface 'wlan0'
OK
# wpa_cli set_network 1 psk \"SuperSecret\"
Selected interface 'wlan0'
OK
# wpa_cli select_network 1
Selected interface 'wlan0'
OK
# wpa_cli status
Selected interface 'wlan0'
wpa_state=SCANNING
p2p_device_address=fe:c2:de:37:93:11
address=fc:c2:de:37:93:11

Si escribo un script para ejecutarlo wpa_cli statusrepetidamente después de seleccionar la red, puedo ver que pasa por las fases:

SCANNING
ASSOCIATING
4WAY_HANDSHAKE
DISCONNECTED
SCANNING

Entonces, ¿hay alguna manera de descubrir que la fase de asociación/apretón de enlace falló debido a una contraseña incorrecta? Por ejemplo, ¿el evento de desconexión informa algún motivo que está almacenado y que luego puedo consultar?

Respuesta1

si miramoswpa_supplicant/events.c:2326vemos:

if (could_be_psk_mismatch(wpa_s, reason_code, locally_generated)) {
    wpa_msg(wpa_s, MSG_INFO, "WPA: 4-Way Handshake failed - "
        "pre-shared key may be incorrect");
    if (wpas_p2p_4way_hs_failed(wpa_s) > 0)
        return; /* P2P group removed */
    wpas_auth_failed(wpa_s, "WRONG_KEY");
}

Entonces, cuando se alcanza esta lógica, se registra WPA: 4-Way Handshake failed - pre-shared key may be incorrect.

Luego continúa haciawpa_supplicant/wpa_supplicant.c:5136y vemos:

wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
    "id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
    ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
    ssid->auth_failures, dur, reason);

Así que aquí <3>CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="MyPlace" auth_failures=1 duration=10 reason=WRONG_KEYestá registrado.

Entonces puedo asegurarme de que wpa_supplicantse inicie de manera que registre su salida en un archivo y luego greppara dichos mensajes.

O puedo ejecutarlo wpa_clien modo interactivo; cuando esté en este modo, se suscribirá y enviará cualquier wpa_supplicantmensaje.

Entonces, la solución muy ingeniosa que se me ocurrió fue ejecutar wpa_cliun script y engañarlo haciéndole creer que está en modo interactivo:

#!/bin/bash

function poke {
    while true
    do
        printf '\n'
        sleep 1
    done
}

function watch {
    (poke) | wpa_cli | while read line
    do
        case "$line" in
            *'4-Way Handshake failed'*)
                echo "incorrect key"
                return
            ;;
            *'CTRL-EVENT-CONNECTED'*)
                echo "connected"
                return
            ;;
        esac
    done
}

wpa_cli disable_network 0 > /dev/null
wpa_cli enable_network 0 > /dev/null

watch

wpa_clisolo generará cualquier mensaje que haya recibido después de que se haya producido alguna entrada del usuario, por lo que la pokefunción proporciona esto.

Este script habilita la red 0 y analiza qué wpa_supplicantresultados se obtienen mientras se hace esto.

Como dije, esto es bastante complicado pero funciona.

información relacionada