WiFI探針的實現與研究
基於802.11協議wifi探針的研究與學習
1.關於802.11協議幀的解析
Management frame(管理幀:Type=00)
- 0000 Association request(關聯請求)
- 0001 Association response(關聯響應)
- 0010 Reassociation request(重新關聯請求)
- 0011 Reassociation response(重新關聯響應)
- 0100 Probe request(探測請求)
- 0101 Probe response(探測響應)
- 1000 Beacon(信標)
- 1001 ATIM(通知傳輸指示訊息)
- 1010 Disassociation(取消關聯)
- 1011 Authentication(身份驗證)
- 1100 Deauthentication(解除身份驗證)
- 1101~1111 Reserved(保留,未使用)
Control frame(控制幀:Type=01)
- 1010 Power Save(PS)- Poll(省電-輪詢)
- 1011 RTS(請求傳送)
- 1100 CTS(清除傳送)
- 1101 ACK(確認)
- 1110 CF-End(無競爭週期結束)
- 1111 CF-End(無競爭週期結束)+CF-ACK(無競爭週期確認)
Data frame(資料幀:Type=10)
- 0000 Data(資料)
- 0001 Data+CF-ACK
- 0010 Data+CF-Poll
- 0011 Data+CF-ACK+CF-Poll
- 0100 Null data(無資料:未傳送資料)
- 0101 CF-ACK(未傳送資料)
- 0110 CF-Poll(未傳送資料)
- 0111 Data+CF-ACK+CF-Poll
- 1000 Qos Data c
- 1000~1111 Reserved(保留,未使用)
- 1001 Qos Data + CF-ACK c
- 1010 Qos Data + CF-Poll c
- 1011 Qos Data + CF-ACK+ CF-Poll c
- 1100 QoS Null(未傳送資料)c
- 1101 QoS CF-ACK(未傳送資料)c
- 1110 QoS CF-Poll(未傳送資料)c
- 1111 QoS CF-ACK+ CF-Poll(未傳送資料)c
2.關於網絡卡的監聽模式
網絡卡的監聽模式,很多網絡卡裝置並不支援。因此我們需要一張支援監聽模式的網絡卡裝置。
Linux下使用iw list命令檢視自己網絡卡是否支援監聽模式,如果不支援自行準備一張支援monitor模式的網絡卡
如果支援,使用ifconfig檢視當前裝置數,找到支援monitor模式的網絡卡使用命令:
1.關閉網絡卡 ifconfig wlan1 down
2.設定監聽模式 iwconfig wlan1 mode monitor
3.開啟網絡卡 ifconfig wlan1 up
至此網絡卡監聽模式開啟
3.關於如何用Python實現監聽並獲取到所需資訊
關於實現probe幀的監聽,需要用到一下模組。
1.scapy模組
2.Manuf模組 (通過Wireshark’s OUI database來進行mac地址匹配)
3.Pcapy模組
4.multiprocessing模組
其餘模組可有可無。
關於安裝模組就不細說了。有一點需要講一下,關於manuf模組的安裝。通過pip install manuf
安裝成功後,其實是無法呼叫成功的。
Import manuf.manuf
後會報錯(會說manuf沒有這個檔案或者資料夾),是模組自身的缺陷導致manuf的缺失,需要手動下載manuf模組並找到manuf OUI database檔案手動新增到python/site-packet/manuf
檔案下。
並在資料夾下的manuf.py的86行修改為io.open(path.join(path.dirname(_file_),manuf_name),’r’,encode(‘utf-8’))
即可成功呼叫manuf.macparser()
安裝完成後即可開始監聽。
根據前邊對幀的瞭解,我們知道probe request幀是手機,電腦,平板等裝置發出的請求幀,這個幀屬於管理幀的分組。
通過分析請求幀我們可知道,請求幀的subtype == 0x04
,其中包括mac地址資訊。裝置搜尋熱點時傳送的探求訊號,在一些新裝置中,為了隱藏自己的真實mac地址,採用的是傳送偽mac地址的探求訊號,所以在探求幀中是無法獲取真實的mac地址。一些老裝置中沒有此類功能,所以可以採集到真實的mac地址。
響應幀subtype==0x05
,同樣包含mac地址資訊。同樣如此,基站向偽mac地址迴應裝置,所以統一無法獲得真實的mac地址資訊。
Probe Request(探測請求)幀
在裝置接入基站的過程中,需要進行關聯請求也可稱為認證,在此過程中,裝置所發射的幀中所包含的mac頭地址中真實的mac地址,因此我們可以在此過程中獲取真實的mac資訊。
通過分析請求幀我們可知道,請求幀的subtype == 0x00
,其中包括mac地址資訊。同樣還存在一個關聯響應幀,subtype==0x01
.
Association Request(關聯請求)幀
到此為止我們可以獲取到的資訊有限mac為主
缺失RSSI
RSSI基本概念
RSSI:Received Signal Strength Indication接收的訊號強度指示,無線傳送層的可選部分,用來判定連結質量,以及是否增大廣播發送強度。RSSI經研究不屬於802.11g協議幀的內容。但是802.11給出了RSSI的描述。
RSSI是進過物理層是加入幀中的。
802.11將PHY進一步劃分為兩個組成元件:
1.物理層收斂程式(Physical Layer ConvergenceProcedure,簡稱PLCP)負責將MAC幀對映到傳輸介質;
2.實際搭配介質Physical Medium Dependent,簡稱PMD),負責傳送這些幀。
MSDU(MAC層業務資料單元。這是最原始的待發資料資訊)經過封裝變成MPDU(MAC層協議資料單元),MPDU傳到PLCP子層變成PSDU(PLCP子層業務資料單元),PSUD經過封裝變成PPDU(PLCP子層協議資料單元)。
可看出RadioTap幀中的成員資訊
附錄
參考資料
貼上部分原始碼
from scapy.all import *
import manuf.manuf as manuf
def PacketHandler(pkt):
addr,addrT,addrD,target=None,None,None,None
if pkt.haslayer(Dot11AssoReq): #Dot11AssoReq為關聯請求幀
addrT=pkt.getlayer(Dot11).addr1
addrD=pkt.getlayer(Dot11).addr2
target=pkt.getlayer(Dot11AssoReq).info or b'Unkonwn'
addr=[addrT,addrD]
manuf = parser.get_all(addr[1]) or 'Unkonwn' # 獲取mac地址的資訊
pass
elif pkt.haslayer(Dot11ProbeReq): #Dot11probeReq為探求幀
addrT=pkt.getlayer(Dot11).addr1
addrD=pkt.getlayer(Dot11).addr2
target=pkt.getlayer(Dot11ProbeReq).info or b'Unkonwn'
addr = [addrT, addrD]
if addr:
if addr not in ap_list:
ap_list.append(addr)
manuf = parser.get_all(addr[1]) or 'Unkonwn' # 獲取mac地址的資訊
pass
parser=manuf.MacParser()
sniff(iface="wlan0", prn=PacketHandler)