web-dev-qa-db-ja.com

wpa_supplicant-パスワードが間違っていることを検出しましたか?

WiFiネットワークに接続するときに間違ったパスワードを指定した場合、接続できない理由が間違ったパスワードであることが検出されます(接続できない可能性のある他の多くの理由の1つではありません)。

例えば。ここでネットワークを追加しましたが、意図的に間違ったパスワードを指定しました。ステータスを確認すると、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
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を有効にしますth ネットワークを構築し、これを実行しているときにwpa_supplicantが出力する内容を確認します。

私が言ったように、これはかなりハッキーですが、それは機能します。

5
George Hawkins