wpa_supplicant - detectando que minha senha está incorreta?

4

Se eu especificar a senha errada para um SSID existe de qualquer maneira para detectar este é o problema ao mudar para uma rede?

Por exemplo aqui eu adiciono uma rede, mas especifico deliberadamente a senha errada. Se eu verificar o status, só vejo que é SCANNING

# 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

Se eu escrever um script para executar wpa_cli status repetidamente depois de selecionar a rede, posso ver que ela passa pelas fases:

SCANNING
ASSOCIATING
4WAY_HANDSHAKE
DISCONNECTED
SCANNING

Então, há alguma maneira de descobrir que a fase de associação / handshake falhou devido a uma senha incorreta? Por exemplo. o evento de desconexão relata algum motivo que está armazenado e que eu posso consultar?

    
por George Hawkins 19.04.2015 / 18:31

1 resposta

3

Se olharmos para wpa_supplicant/events.c:2326 , vemos:

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");
}

Então, quando essa lógica é atingida, ele registra WPA: 4-Way Handshake failed - pre-shared key may be incorrect .

Em seguida, ele continua para wpa_supplicant/wpa_supplicant.c:5136 e nós 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);

Então, aqui <3>CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="MyPlace" auth_failures=1 duration=10 reason=WRONG_KEY está logado.

Para que eu possa garantir que wpa_supplicant seja iniciado de forma que ele registre sua saída em um arquivo e, em seguida, grep para tais mensagens.

Ou posso executar wpa_cli no modo interativo - quando estiver nesse modo, ele assinará e emitirá as mensagens wpa_supplicant .

Então, a solução muito hacky que eu criei foi executar wpa_cli em um script e enganá-lo pensando que ele está no modo interativo:

#!/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_cli só emitirá quaisquer mensagens que tenha recebido após a entrada de algum usuário, então a função poke fornece isso.

Este script ativa a rede 0 th e analisa o que wpa_supplicant produz ao fazer isso.

Como eu disse, isso é bem hacky, mas funciona.

    
por 20.04.2015 / 19:40