目前WIFI WPA破解主要 以「aircrack-ng」爲表明,運行於Linux系統( 如Kali Linux ),Windows系統比較少見,主要是Windows系統下WIFI網卡收發原始包比較困難,且缺乏有主流WIFI網卡開源代碼可參考。因 此WPA破解一般流程是先在Linux機器(或Linux虛擬機)在抓取WPA 四次握手包,而後再經過以「Elcomsoft Wireless Security Auditor」爲表明的密碼字典爆破軟件在Windows下進行破解。算法
由具體硬件處理,實際只須要考慮MAC(Media Access Control)和LLC(邏輯鏈路控制),具體數據幀以下:網絡
MPDU是MAC層的協議頭,其中經常使用的是FrameControl字段和Addr一、Addr二、Addr3等。數據結構
WIFI協議的MPDU頭長度不是固定的,是可變的。框架
Type/SubType:共同指明瞭接下來的數據幀的格式,其中Type 2bits,指明瞭幀類型,SubType 4bits,進一步指定了數據的具體格式。less
Type | 00/管理幀 | 01/控制幀 | 10/數據幀 | 11/保留 |
WPA破解時用到的主要有WIFI管理幀和數據幀,其中管理幀對應的SubType狀況見下表:dom
STA在登陸AP前,首先須要經過一系列的管理幀,創建同AP的數據聯繫,而後才能實施登陸並啓用加密數傳,同時WIFI管理幀是不加密的,具體流程以下:分佈式
序號 | SubType | 說明 |
---|---|---|
1 | 8 | Beacon,STA接受AP信標幀,感知到AP,獲取SSID及AP參數 |
2 | 4 | STA主動發送Probe探測請求 |
3 | 5 | AP應答STA Prob Response |
4 | 11 | STA發送Authentication請求認證 |
5 | 11 | AP應答Authentication請求,指示STA認證成功或失敗 |
6 | STA發送Association請求 | |
7 | 1 | AP應答Association Response |
一旦STA完成上述流程後,STA和AP之間便可進行數據幀傳輸,以便接下來的WPA用戶認證。函數
WPA-PSK(WPA我的版)在STA和AP創建數傳後,使用了EAPOL(Extensible Authentication Protocol OVER LAN)協議處理用戶的登陸認證,具體由四次握手組成,以下圖。測試
AP首先向STA發送一個32字節的ANonce隨機數(實際上通常是累加計數器),STA收到該隨機數後,本身也產生一個32字節的SNonce 隨機數,同時根據這兩個隨機數以及登陸密碼計算出一個PTK(Pairwise Transient Key),具體計算過程以下:加密
一、PMK = PBKDF2(HMAC−SHA1, pwd, ssid, 4096, 256)
首先使用PBKDF2(Password-Based Key Derivation Function 2)算法生成一個32字節的PMK key,該算法須要執行4096*2輪,WPA破解時運算量主要集中在該key的計算,同時因爲使用了SSID(0-32字符)進行salt,致使很難使 用彩虹表進行預計算。
二、PTK = PRF-512(PMK, 「Pairwise key expansion」, Min(AP_Mac, Sta_Mac) ||Max(AP_Mac, Sta_Mac) || Min(ANonce, SNonce) || Max(ANonce, SNonce))
PTK使用PRF-512(pseudo random functions 512bits)算法產生,經過PMK、固定字符串、AP_Mac、Sta_Mac、ANonce、SNonce六個輸入參數獲得一個64字節PTK。
PTK由5部分組成,以下:
WPA1 TKIP的PTK長度512bits,WPA2 CCMP的PTK長度爲384bits,其中KCK用來計算WPA EAPOL KEY消息的MIC;AP使用KEK加密WPA EAPOL KEY消息的額外Key Data數據;TEK用於單播數據加密。
WPA破解最關鍵的部分就是經過KCK計算MIC,其算法以下:
WAP MIC = HMAC(EVP_sha1(), KCK
, 16, eapol_data,eapol_size) WAP2 MIC = HMAC(EVP_md5(), KCK
, 16, eapol_data,eapol_size)
總結一下WPA具體破解流程以下:
序號 | 說明 |
---|---|
1 | 抓取4-way握手包,實際上只須要前兩次便可 |
2 | 經過密碼字典計算PMK |
3 | 經過PMK、ANONCE、SNONCE、MAC一、MAC2計算PTK |
4 | 經過PTK獲得KCK,計算第2次EAPOL報文對應的MIC |
5 | 同第2次EAPOL報文中MIC比較,匹配則密碼正確 |
目前Windows下比較成熟的WIFI數據包收發軟件是CommView for WiFi,該軟件是一款商業軟件,兼容的網卡較多,功能也比較強大。該軟件的BMD目錄下有一個比較通用的WiFi Capture Driver,結合互聯網蒐集整理的資料發現,Windows NDIS6框架下可以實現WIFI數據包收發功能,決定使用NDIS6 Filter Driver進行WIFI數據包收發。
使用VirtualBox + VirtualKD + Windbg + RTL8187 USB WIFI網卡,目標系統Window7 x86,注意VirtualBox須要安裝VirtualBox擴展包,不然沒法將主機USB網卡切換到虛擬機中調試。 Windows WDK 7600編譯環境,WDK中的filter、usbnwifi示例源碼極具參考價值,filter是NDIS 6 NDIS Filter示例代碼,usbnwifi是usb wifi網卡驅動的一個參考代碼,在沒有實際USB網卡驅動源碼的狀況下,能夠大體瞭解底層網卡的一些實現細節。
NDIS6框架下底層網卡最終經過調用NdisMIndicateReceiveNetBufferLists指示上層NDIS驅動接受數據包,查看該函數調用狀況以下:
主要有三個地方調用了該函數,分別是MpHandleRawReceiveInterrupt、MpHandleDefaultReceiveInterrupt、MpHandleSafeModeReceiveInterrupt,重點看前兩個函數,在MpAdjustReceiveHandler函數中有以下初始化代碼:
很明顯,這兩個函數對應了不一樣網卡模式下WIFI網卡的數據接受函數,在WIFI破解時須要將網卡設置成monitoring mode。
MpAdjustReceiveHandler在MpSetCurrentOperationMode時被調用,在MpSetInformation函數中:
OID_DOT11_CURRENT_OPERATION_MODE
是NDIS 標準WIFI OID請求,用來設置WIFI網卡的工做模式,定義的模式有:
總結一下WIFI破解時,數據接受的處理流程就是:首先設置網卡爲監控模式(混雜模式),而後在網卡驅動之上的Filter驅動裏,處理原始數據包接受,一般能夠先接受到臨時隊列裏,再在應用層使用IoControl讀取該隊列,實現WIFI數據包嗅探。
NDIS小端口驅動經過NdisMRegisterMiniportDriver註冊驅動程序,註冊的同時需指明Ndis數據發送函數。
該函數中會首先檢查網卡的狀態,若是狀態不合適就不會繼續發送數據包,具體檢查代碼以下:
MP_ADAPTER_CANNOT_SEND_PACKETS
宏定義以下:
MP_ADAPTER_CANNOT_SEND_MASK
掩碼定義以下:
注意其中高亮的部分,很明顯,微軟的NDIS USB WIFI驅動示例代碼默認是不容許在監控模式下發包的,鑑於WDK示例代碼的權威性,有理由相信,採用該WDK模版代碼修改的USB WIF驅動都不能在監控模式下發包,這也是Windows WIFI破解須要面臨的一個大問題。
既然官方驅動不能在監控模式下發包,那麼就只能本身動手了,直接給官方驅動打個簡單的Patch,找到關鍵的檢測位置,而後手動patch一下好了。固然實際廠商的驅動可能會有所不一樣,須要多調試和測試好。
總結下WIFI破解時,數據發送的處理流程以下:首先找一款支持監控模式下能發包的網卡和驅動(CommView for WIFI自帶的驅動應該均可以),或者手動Patch好官方驅動,而後在應用層IoControl寫Raw WIFI數據到Filter驅動,Filter構造NET_BUFFER_LIST,最後使用NdisFSendNetBufferLists將數據發送 給底層WIFI網卡驅動。
WPA破解主要分爲以下幾個具體步驟,一是開啓網卡嗅探模式,對周圍WIFI數據包進行捕獲,二是分析周圍AP和STA的分佈狀況,爲Deauth攻擊作好準備,三是實施Deauth攻擊,四是捕獲EAPOL握手數據包。
NDIS6經過OID_DOT11_CURRENT_OPERATION_MODE
設置網卡的工做模式,所以直接經過驅動發送OID設置網卡模式便可,該OID對應的參數數據結構爲DOT11_CURRENT_OPERATION_MODE
,具體以下:
經過內核直接發送OID會出現一些問題,主要是Windows WIFI應用層不能即時獲取通知,致使Windows應用層在嗅探模式設置功能後,嘗試鏈接網絡,出現模式干擾,但CommView就不會出現該狀況。
分析CommView驅動後發現,CommView並無在驅動裏面進行具體模式的設置,而是在應用層ca2k.dll調用了Wlan API設置監控模式。
WlanSetInterface的OpCode碼爲12,對應:
wlan_intf_opcode_current_operation_mode
(12),具體代碼以下:
WPA破解時須要用到AP的SSID以及MAC地址,AP探測主要經過信標幀以及探測應答幀來實現,具體以下:
WIFI信標幀格式以下
DOT11_MGMT_HEADER | DOT11_BEACON_FRAME | DOT11_INFO_ELEMENT | INFO... |
其中DOT11_MGMT_HEADER
、DOT11_BEACON_FRAME
是固定的,AP的MAC地址能夠從DOT11_MGMT_HEADER
中獲取,固定頭後跟了一個DOT11_INFO_ELEMENT
的列表,定義以下:
須要依次遍歷其中ElementID,獲取AP的一系列屬性,一些經常使用的ID定義以下:
分別對應AP的SSID、當前頻道、WPA2參數等。
STA的探測主要經過數據幀來實現,WPA破解目前只用到了STA的MAC地址,根據每一個數據幀的FromDS、ToDS狀況,解析數據包MAC地址,便可實現抓取在線通訊的STA地址,具體以下:
根據WIFI協議規定,客戶端在接受到Deauth管理幀後,應該主動斷開同AP的鏈接,一旦斷開後,STA會自動嘗試重連,這時就方便抓取EAPOL四次握手包了,所以成功實施Deauth攻擊能夠極大提升WPA破解的效率。
Aircrack裏面的Deauth攻擊模版以下:
其中\xC0\x00
指明瞭該幀是Deauth管理幀,最後的\x02\00
指定了本次Deauth的Code碼,Aircrack裏是\x06\x00
,區別起見,修改了下。
發送Deauth攻擊時,將DA替換成目標STA的MAC地址(或廣播),SA、BSSID填上AP的MAC便可。
EAPOL幀的識別比較簡單,由於802.1x數據幀前,LLC(邏輯鏈路控制)頭會有一個標識0x888e,直接內存搜索便可定位EAPOL幀,稍微麻煩一點的是要肯定當前EAPOL包在四次握手中次序,由於在實際網絡嗅探時,有很大可能出現漏抓的狀況。
EAPOL數據包格式以下:
其中ProType=3表示是Key,Key描述數據結構以下:
其中KEY_INFO
數據定義了一系列的標誌位,EAPOL四次握手時,各個階段的標誌位會不盡相同,經過分析這些標誌位狀況,能夠獲取其在四次握手時的次序。一旦監控到一次的完整四次握手,便可認爲當前AP握手包抓取成功。