2018年6月10日 星期日

運用 Raspberry Pi 學習 Wi-Fi (1)

因為最近的工作都與 Wi-Fi 有關,為了加深對 Wi-Fi 的認識,除了用力啃蝙蝠書外,就是想辦法搭建 Wi-Fi 實驗環境。


Wi-Fi 不像 Ethernet 那麼簡單,Ethernet 隨便用張網路卡 + Hub + Wireshark 就可以抓封包,Hub 買不到還可以 DIY

問題在於一般 Wi-Fi 網卡在 Wireshark 裡看不到真正的 802.11 frame,這個問題在於系統底層會把 Wi-Fi 封包轉成假 Ethernet 封包,如 Wireshark 官網所述:


要達成這個目的,Wi-Fi 網卡跟 OS 都必須支援 monitor mode,如官網所述:


不過很抱歉,Windows 版 Wireshark 不支援 monitor mode(因為 WinPcap 不支援),如果硬要在 Windows 上抓取 802.11 frame,筆者找了老半天,發現只能去買 AirPcap 這種直接支援 Wireshark 的特殊 Wi-Fi 網卡,不過價格非常貴(NT$8000-NT$30000),買了就要吃土了。

Windows 還有另外一個知名 Wi-Fi sniffer -  Omnipeek,這是 Wi-Fi 模組廠商推薦的,可以搭配的網卡相當多,淘寶可以找到一堆,不過這是商業軟體,價格也是吃土價。

既然 Windows 這條路行不通,筆者就把腦筋動到 Raspberry Pi 上,因為 rpi 上頭跑的是 Linux,只要網卡跟 driver 支援 monitor mode 就可以進行抓包。

沒想到找尋合適的 Wi-Fi 網卡就花了很多時間,最後發現最簡單的途徑就是去買 Kali Linux 最常用的那幾張網卡


上圖是筆者手邊的三隻 USB Wi-Fi dongle:
  1. TP-LINK TL-WN722N V2,然而 Kali Linux 建議採用 V1,一時不察買了這隻 V2 發現完全不能用(網卡廠商常常改版時 chip 也換廠牌)
  2. 是後來從淘寶上淘來的 V1(也不知道強國賣家哪來那麼多庫存,還是該說他們很有商業頭腦?)
  3. 是剛入門 rpi 時很多人推薦的 EDIMAX EW-7811Un,不過很抱歉這隻不支援 monitor mode
這邊要提醒大家一下,Kali Linux 最常用的前三名網卡: TP-LINK TL-WN722N V1, Alfa AWUS036NH, Alfa AWUS036NHA 都不是一般賣場能買到的產品,想玩的朋友只能請您自己去網拍找了。雖然這些 Wi-Fi 網卡比起市售常見 Wi-Fi 網卡貴了一倍左右,但比起 AirPcap 還是超划算的選擇。

Wi-Fi 監聽初體驗

Linux 下可以進行 Wi-Fi sniffer 的軟體筆者找到三套:
  • tcpdump
  • kismet
  • aircrack-ng
tcpdump 至少從 W. Richard Stevens 大師寫第一版 TCP/IP Illustrated, Volume 1 時就現身了,不過筆者測試了很久發現 tcpdump 儲存的 .pcap,即使在 Wireshark 內輸入正確的 WPA2 password 也無法解開(有哪位先進知道怎麼做請留言,感恩)

kismet 與 aircrack-ng 最後選擇了 aircrack-ng,原因無他,Google 出來的資料後者硬是比前者多一倍。現在就來看看怎麼使用 aircrack-ng 監聽 Station (STA) 與 Access Point (AP) 間的通訊。

1. 架設環境

材料清單
  • Windows 7 64bit
  • VirtualBox + Ubuntu 14.04 64bit
  • Raspberry Pi b+
  • TL-WN722N V1
前篇 USB 類似,系統組成如下圖


至於為什麼需要 ssh + serial console,不擇其一就好?這個後面會解釋。

1. 開啟 monitor mode

首先確認一下 Wi-Fi interface name,輸入 iwconfig (Putty A)


接著輸入 airmon-ng start wlan0 開啟監聽模式


輸入 airmon-ng 確認


據說這樣同一隻 Wi-Fi 網卡可以同時監聽跟一般上網,不過筆者沒這種需求,再說還有有線網路可用。

2. 掃描網路

輸入 airodump-ng mon0 看看有哪些 AP 在附近(也可以使用 iw dev wlan0 scan)


這邊我們會用到的資訊如上圖所示:
  • BSSID: AP MAC address
  • CH: AP 目前使用的 channel
  • ESSID: AP SSID
為了筆者與筆者鄰居的隱私,這邊 BSSID、ESSID 就馬賽克一下,這邊筆者打算監聽的 AP 就是 BSSID 80 開頭、CH 1 的那一個,這是筆者家中的 AP。

3. 開始監聽

目錄切換到 /tmp,輸入 airodump-ng -c 1 mon0 --bssid 80:XX:XX:XX:XX:XX --output-format pcap -w mon0.pcap (-c 1 代表 channel 1)


我們想要監聽 STA F4:XX:XX... 開頭的 STA 與 AP 間的通訊(此為筆者的筆電)。這時候重點來了,這時候如果你按下 ctrl+c,存下來的 .pcap 雖然可以用 Wireshark 打開,但你只會看到一堆 802.11 frames,而看不到任何有用的 TCP/IP 資料,即使是 ICMP 這樣簡單的東西。


還記得 Putty B 嗎?開啟 Putty B 透過 Ethernet 連上 rpi,接著輸入
aireplay-ng -0 5 -a 80:XX:XX:XX:XX:XX -c F4:XX:XX:XX:XX:XX mon0
( -0 5 意指 - -deauth count : deauthenticate 1 or all stations (-0) ),迫使筆電重連 AP


你可能會收到以下訊息


在命令補上 --ignore-negative-one 即可,例如:
aireplay-ng -0 1 -a 80:XX:XX:XX:XX:XX -c F4:XX:XX:XX:XX:XX --ignore-negative-one mon0

4. 解密 .pcap

輸入以下命令 (-l 代表不要移除 802.11 header):
airdecap-ng -l -e "ESSID" -p AP_PASSWORD xxx.cap


由上圖得知解出了 10214 個封包,我們透過 sshfs 傳到 PC 這邊,用 Wireshark 打開看看有沒有我們要的東西,筆者在監聽期間刻意 ping google.com.tw:


照理說這包解開的 .pcap,應該可以找到相同的 ICMP 封包,馬上來瞧瞧


成功了!當然這只能算 Wi-Fi 幼幼班,不過暫時足以應付工作所需,未來再有其他心得再與各位分享,Bye!

2 則留言: