wpa_supplicant - обнаружение, что мой пароль неверный?

7526
George Hawkins

Если я укажу неправильный пароль для SSID, есть ли способ обнаружить эту проблему при переключении в сеть?

Например, здесь я добавляю сеть, но намеренно указываю неправильный пароль. Если я проверяю статус, я просто вижу, что это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 

Если я напишу сценарий для wpa_cli statusповторного запуска после выбора сети, я вижу, что он проходит через фазы:

SCANNING ASSOCIATING 4WAY_HANDSHAKE DISCONNECTED SCANNING 

Так есть ли способ обнаружить, что фаза ассоциации / рукопожатия не удалась из-за неверного пароля? Например, событие отключения сообщает о какой-то причине, которая сохранена и которую я могу затем запросить?

4

1 ответ на вопрос

4
George Hawkins

Если мы посмотрим на wpa_supplicant/events.c:2326мы видим:

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

Поэтому, когда эта логика нажата, она записывается WPA: 4-Way Handshake failed - pre-shared key may be incorrect.

Тогда это продолжается, wpa_supplicant/wpa_supplicant.c:5136и мы видим:

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

Так что здесь <3>CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="MyPlace" auth_failures=1 duration=10 reason=WRONG_KEYвошли.

Таким образом, я могу либо убедиться, что wpa_supplicantон запущен так, что он записывает свой вывод в файл, а затем grepдля таких сообщений.

Или я могу работать wpa_cliв интерактивном режиме - когда он находится в этом режиме, он будет подписываться и выводить любые wpa_supplicantсообщения.

Таким образом, очень хакерское решение, которое я придумал, состояло в том, чтобы запустить wpa_cliсценарий и заставить его думать, что он находится в интерактивном режиме:

#!/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выводит только те сообщения, которые он получил после некоторого пользовательского ввода, поэтому pokeфункция обеспечивает это.

Этот скрипт активирует 0- ую сеть и смотрит на то, что wpa_supplicantвыводит при этом.

Как я уже сказал, это довольно забавно, но работает.

Похожие вопросы