<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址:http://drops.wooyun.org/wireless/13968

                    0x00 前言


                    目前WIFI WPA破解主要 以“aircrack-ng”為代表,運行于Linux系統(?如Kali Linux?),Windows系統比較少見,主要是Windows系統下WIFI網卡收發原始包比較困難,且缺少有主流WIFI網卡開源代碼可參考。因此WPA破解通常流程是先在Linux機器(或Linux虛擬機)在抓取WPA 四次握手包,然后再通過以“Elcomsoft Wireless Security Auditor”為代表的密碼字典爆破軟件在Windows下進行破解。

                    0x01 WIFI協議基礎


                    由具體硬件處理,實際只需要考慮MAC(Media Access Control)和LLC(邏輯鏈路控制),具體數據幀如下:

                    p1

                    MPDU是MAC層的協議頭,其中常用的是FrameControl字段和Addr1、Addr2、Addr3等。

                    p2

                    WIFI協議的MPDU頭長度不是固定的,是可變的。

                    Type/SubType:共同指明了接下來的數據幀的格式,其中Type 2bits,指明了幀類型,SubType 4bits,進一步指定了數據的具體格式。

                    Type 00/管理幀 01/控制幀 10/數據幀 11/保留

                    WPA破解時用到的主要有WIFI管理幀和數據幀,其中管理幀對應的SubType情況見下表:

                    p3

                    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用戶認證。

                    0x02 WPA密碼破解原理


                    WPA-PSK(WPA個人版)在STA和AP建立數傳后,使用了EAPOL(Extensible Authentication Protocol OVER LAN)協議處理用戶的登錄認證,具體由四次握手組成,如下圖。

                    p4

                    AP首先向STA發送一個32字節的ANonce隨機數(實際上一般是累加計數器),STA收到該隨機數后,自己也產生一個32字節的SNonce隨機數,同時根據這兩個隨機數以及登錄密碼計算出一個PTK(Pairwise Transient Key),具體計算過程如下:

                    1、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,導致很難使用彩虹表進行預計算。

                    2、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。

                    p5

                    PTK由5部分組成,如下:

                    p6

                    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、MAC1、MAC2計算PTK
                    4 通過PTK得到KCK,計算第2次EAPOL報文對應的MIC
                    5 同第2次EAPOL報文中MIC比較,匹配則密碼正確

                    0x03 Window WIFI數據包收發


                    目前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網卡驅動源碼的情況下,可以大致了解底層網卡的一些實現細節。

                    WIFI數據嗅探

                    NDIS6框架下底層網卡最終通過調用NdisMIndicateReceiveNetBufferLists指示上層NDIS驅動接受數據包,查看該函數調用情況如下:

                    p7

                    主要有三個地方調用了該函數,分別是MpHandleRawReceiveInterrupt、MpHandleDefaultReceiveInterrupt、MpHandleSafeModeReceiveInterrupt,重點看前兩個函數,在MpAdjustReceiveHandler函數中有如下初始化代碼:

                    p8

                    很明顯,這兩個函數對應了不同網卡模式下WIFI網卡的數據接受函數,在WIFI破解時需要將網卡設置成monitoring mode。

                    MpAdjustReceiveHandlerMpSetCurrentOperationMode時被調用,在MpSetInformation函數中:

                    p9

                    OID_DOT11_CURRENT_OPERATION_MODE是NDIS 標準WIFI OID請求,用來設置WIFI網卡的工作模式,定義的模式有:

                    p10

                    總結一下WIFI破解時,數據接受的處理流程就是:首先設置網卡為監控模式(混雜模式),然后在網卡驅動之上的Filter驅動里,處理原始數據包接受,通常可以先接受到臨時隊列里,再在應用層使用IoControl讀取該隊列,實現WIFI數據包嗅探。

                    WIFI數據發送

                    NDIS小端口驅動通過NdisMRegisterMiniportDriver注冊驅動程序,注冊的同時需指明Ndis數據發送函數。

                    p11

                    該函數中會首先檢查網卡的狀態,如果狀態不合適就不會繼續發送數據包,具體檢查代碼如下:

                    p12

                    MP_ADAPTER_CANNOT_SEND_PACKETS宏定義如下:

                    p13

                    MP_ADAPTER_CANNOT_SEND_MASK掩碼定義如下:

                    p14

                    注意其中高亮的部分,很明顯,微軟的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網卡驅動。

                    0x04 WPA破解流程


                    WPA破解主要分為如下幾個具體步驟,一是開啟網卡嗅探模式,對周圍WIFI數據包進行捕獲,二是分析周圍AP和STA的分布情況,為Deauth攻擊做好準備,三是實施Deauth攻擊,四是捕獲EAPOL握手數據包。

                    開啟網卡嗅探

                    NDIS6通過OID_DOT11_CURRENT_OPERATION_MODE設置網卡的工作模式,因此直接通過驅動發送OID設置網卡模式即可,該OID對應的參數數據結構為DOT11_CURRENT_OPERATION_MODE,具體如下:

                    p15

                    通過內核直接發送OID會出現一些問題,主要是Windows WIFI應用層不能即時獲取通知,導致Windows應用層在嗅探模式設置功能后,嘗試連接網絡,出現模式干擾,但CommView就不會出現該情況。

                    分析CommView驅動后發現,CommView并沒有在驅動里面進行具體模式的設置,而是在應用層ca2k.dll調用了Wlan API設置監控模式。

                    p16

                    WlanSetInterface的OpCode碼為12,對應:

                    wlan_intf_opcode_current_operation_mode(12),具體代碼如下:

                    p17

                    AP/STA探測

                    WPA破解時需要用到AP的SSID以及MAC地址,AP探測主要通過信標幀以及探測應答幀來實現,具體如下:

                    p18

                    WIFI信標幀格式如下

                    DOT11_MGMT_HEADER DOT11_BEACON_FRAME DOT11_INFO_ELEMENT INFO...

                    其中DOT11_MGMT_HEADERDOT11_BEACON_FRAME是固定的,AP的MAC地址可以從DOT11_MGMT_HEADER中獲取,固定頭后跟了一個DOT11_INFO_ELEMENT的列表,定義如下:

                    p19

                    需要依次遍歷其中ElementID,獲取AP的一系列屬性,一些常用的ID定義如下:

                    p20

                    分別對應AP的SSID、當前頻道、WPA2參數等。

                    STA的探測主要通過數據幀來實現,WPA破解目前只用到了STA的MAC地址,根據每個數據幀的FromDS、ToDS情況,解析數據包MAC地址,即可實現抓取在線通信的STA地址,具體如下:

                    p21

                    Deauth攻擊

                    根據WIFI協議規定,客戶端在接受到Deauth管理幀后,應該主動斷開同AP的連接,一旦斷開后,STA會自動嘗試重連,這時就方便抓取EAPOL四次握手包了,因此成功實施Deauth攻擊可以極大提高WPA破解的效率。

                    Aircrack里面的Deauth攻擊模版如下:

                    p22

                    其中\xC0\x00指明了該幀是Deauth管理幀,最后的\x02\00指定了本次Deauth的Code碼,Aircrack里是\x06\x00,區別起見,修改了下。

                    發送Deauth攻擊時,將DA替換成目標STA的MAC地址(或廣播),SA、BSSID填上AP的MAC即可。

                    p23

                    EAPOL捕獲

                    EAPOL幀的識別比較簡單,因為802.1x數據幀前,LLC(邏輯鏈路控制)頭會有一個標識0x888e,直接內存搜索即可定位EAPOL幀,稍微麻煩一點的是要確定當前EAPOL包在四次握手中次序,因為在實際網絡嗅探時,有很大可能出現漏抓的情況。

                    EAPOL數據包格式如下:

                    p24

                    其中ProType=3表示是Key,Key描述數據結構如下:

                    p25

                    其中KEY_INFO數據定義了一系列的標志位,EAPOL四次握手時,各個階段的標志位會不盡相同,通過分析這些標志位情況,可以獲取其在四次握手時的次序。一旦監控到一次的完整四次握手,即可認為當前AP握手包抓取成功。

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频