5 votes

wpa_supplicant - détecte que mon mot de passe est incorrect ?

Si je spécifie un mot de passe incorrect lorsque je me connecte à un réseau WiFi, existe-t-il un moyen de détecter que la raison pour laquelle je ne peux pas me connecter est le mot de passe incorrect (plutôt que l'une des nombreuses autres raisons possibles pour lesquelles on ne peut pas se connecter).

Par exemple, j'ajoute un réseau mais je spécifie délibérément un mauvais mot de passe. Si je vérifie le statut, je vois simplement que c'est 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

Si j'écris un script pour exécuter wpa_cli status Après avoir sélectionné le réseau, je vois qu'il passe par différentes phases :

SCANNING
ASSOCIATING
4WAY_HANDSHAKE
DISCONNECTED
SCANNING

Existe-t-il un moyen de savoir si la phase d'association/de prise de contact a échoué en raison d'un mot de passe incorrect ? Par exemple, l'événement de déconnexion signale-t-il une raison qui est stockée et que je peux ensuite interroger ?

5voto

Jyosua Points 113

Si l'on considère wpa_supplicant/events.c:2326 nous voyons :

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

Ainsi, lorsque cette logique est appliquée, elle enregistre WPA: 4-Way Handshake failed - pre-shared key may be incorrect .

Il se poursuit ensuite par wpa_supplicant/wpa_supplicant.c:5136 et nous voyons :

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

Voici donc <3>CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="MyPlace" auth_failures=1 duration=10 reason=WRONG_KEY est enregistrée.

Je peux donc m'assurer que wpa_supplicant est démarré de telle sorte qu'il enregistre sa sortie dans un fichier et ensuite grep pour de tels messages.

Ou je peux courir wpa_cli en mode interactif - lorsqu'il est dans ce mode, il s'abonne à et émet tout wpa_supplicant des messages.

La solution que j'ai trouvée a donc été de lancer wpa_cli dans un script et lui faire croire qu'il est en mode interactif :

#!/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 n'émettra les messages qu'elle a reçus qu'après une intervention de l'utilisateur, de sorte que la fonction poke permet de le faire.

Ce script active le 0 th réseau et examine ce que les wpa_supplicant pendant cette opération.

Comme je l'ai dit, il s'agit d'une méthode assez artisanale, mais qui fonctionne.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X