1. 程式人生 > >WiFI探針的實現與研究

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)