中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣借助Python理解WPA四次握手過程

發布時間:2021-12-04 10:51:57 來源:億速云 閱讀:300 作者:柒染 欄目:網絡安全

本篇文章為大家展示了怎樣借助Python理解WPA四次握手過程,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

環境準備

在正式開始分析之前,先要準備一下軟件和分析對象。

系統環境

本次使用的操作系統是Windows10 1909,部分需要Linux的使用虛擬機安裝的Kali進行。

代碼部分,解釋器版本為Python 2.7。

數據包分析工具使用經典的Wireshark。

數據準備

由于不同的加密方法和參數對握手包的影響較大,因此分析對象使用了Wireshark官方給出的WPA數據包。

該數據包可以在https://wiki.wireshark.org/HowToDecrypt802.11頁面上進行下載:

怎樣借助Python理解WPA四次握手過程

手動捕獲握手包

額外說明一下,如果想自己捕獲設備的WPA握手包,則需要額外的軟件,并將網卡置為Monitor Mode。下面簡單介紹一下。

Windows平臺:在Windows平臺下想要捕獲802.11管理幀,需要使用微軟官方的軟件Microsoft Network Monitor。它的安裝和使用也相對比較方便,網上也有相當多的教程,如《windows下抓取802.11管理包》。有一點需要注意,該軟件在“掃描設置(Scanning Options)”中開啟Monitor Mode后,該窗口不能關閉,否則會退出:

怎樣借助Python理解WPA四次握手過程

Linux平臺:在Linux平臺下,可以借助我們熟悉的aircrack-ng套件來設置網卡的Monitor Mode,并使用Wireshrak來獲取和查看數據。此處以Kali為例,其他Linux系統可以自行安裝相關套件。

設置監聽模式的命令為:

root@kali:~# airmon-ng start wlan0

其中wlan0是網卡的名稱。若出現以下情況:

root@kali:~# airmon-ng start wlan0

Found 2 processes that could cause trouble.
If airodump-ng, aireplay-ng or airtun-ng stops working after
a short period of time, you may want to run 'airmon-ng check kill'

   PID Name
  1959 NetworkManager
  1989 wpa_supplicant

PHY Interface   Driver      Chipset

phy0    wlan0      rt2800usb   Ralink Technology, Corp. RT2870/RT3070

       (mac80211 monitor mode vif enabled for [phy0]wlan0 on [phy0]wlan0mon)
       (mac80211 station mode vif disabled for [phy0]wlan0)

說明網卡被占用,需要使用airmon-ng check kill命令來結束占用進程:

root@kali:~# airmon-ng check kill

Killing these processes:

   PID Name
  1989 wpa_supplicant

root@kali:~# airmon-ng start wlan0


PHY Interface   Driver      Chipset

phy0    wlan0mon    rt2800usb   Ralink Technology, Corp. RT2870/RT3070

這里網卡名稱會變成wlan0mon,需要注意。

但是,直接設置后抓包有時只能抓到部分,比如僅有AP側的數據,設備端的數據包都丟失了,原因是未指定信道。此時需要使用airodump-ng工具查看目標AP的信道:

root@kali:~# airodump-ng wlan0mon

怎樣借助Python理解WPA四次握手過程

上圖中第一行所示的信息中,CH表示信道,我們想對該AP進行四次握手的捕獲,則需要將網卡監聽的信道固定為11:

root@kali:~# airmon-ng start wlan0mon 11


PHY Interface   Driver      Chipset

phy0    wlan0mon    rt2800usb   Ralink Technology, Corp. RT2870/RT3070

       (mac80211 monitor mode already enabled for [phy0]wlan0mon on [phy0]11)

看到命令行中最后一行括號里的提示,表示已經設置為固定監聽信道11。

此時打開wireshark,選中網卡wlan0mon即可捕獲。

WPA四次握手

在上一篇文章《Wi-Fi攻擊方式簡述》中,已經對WPA的握手過程進行過簡單講解,總結起來WPA的四次握手完成了:

1)Wi-Fi密碼的驗證

2)后續通信加密的密碼的計算(注意這里是“計算”不是“傳輸”)

而在其握手過程中,會生成一些過程產物,如加密握手數據的密鑰、完整性校驗數據等。密鑰計算的總覽視圖如下:

怎樣借助Python理解WPA四次握手過程

四次握手的簡單示意圖:

怎樣借助Python理解WPA四次握手過程

接下來會逐步介紹每一步的計算過程。

握手前的準備:計算PMK

PMK(Pairwise Master Key) 是整個WPA認證過程中非常核心的一個密鑰,是由Wi-Fi的SSIDPre-Shared-Key(即Wi-Fi密碼)計算而來,其算法被稱為Password-Based Key Derivation Function 2 (PBKDF2) ,是一種使用HMAC-SHA1,使用SSID作為鹽值來進行哈希的一種算法。

怎樣借助Python理解WPA四次握手過程

在默認的Python環境中,需要安裝pbkdf2庫來支持這種算法,可以使用pip install pbkdf2命令來安裝 。

   

 = 
 = 
 = (, , ).()

怎樣借助Python理解WPA四次握手過程

此外,可以利用Linux系統中的wpa_passphrase工具來計算PMK,其命令為:

pentest@DESKTOP-2AE07FJ:~$ wpa_passphrase Coherer Induction

怎樣借助Python理解WPA四次握手過程

這里可以看出來,計算出來的值是一致的。

第一次握手:傳遞ANonce,STA計算PTK

在WPA的第一次握手時,由AP向STA發送ANonce

怎樣借助Python理解WPA四次握手過程

在這個數據包中,除了 ANonce 以外,在頭部包含了雙方的MAC地址。此時STA本地生成SNonce,滿足了PTK計算的全部條件,因此進行PTK的計算

怎樣借助Python理解WPA四次握手過程

由于SNonce在第二次握手的數據包中,因此這部分計算的演示在下一節進行。

第二次握手:傳遞SNonce,AP計算PTK

第二次握手時,STA向AP發送SNonce:

怎樣借助Python理解WPA四次握手過程

PTK(Pairwise Transient Key)的計算需要使用PRF512算法,其實現是參照《Understanding WPA/WPA2 Hash (MIC) Cracking Process In Python》文章中給出的算法進行:

 (, , ):
     = 
     = 
     = 
      = ((    )  ):
         = .(,   ()    (), .)
         += 
         =   .()
     [:]

從前兩次握手包中提取的ANonceSNonce 以及雙方的MAC地址,拼接起來作為計算PTK的部分:

 = .()
 = .()
 = .()
 = .()
 = (, )  (, )  (,)  (,)

PRF512需要3個參數,PMKPKE 和上面計算出來的 key_data。其中PKE是一個固定字符串,PMK在前文中有過計算:

 = 
 = (, , ).()
 = (, , )

到這里,AP和STA各自都計算出了PTK(正常情況下雙方算出的PTK內容是一致的)。

PTK的構成

上一步驟中,計算出來的PTK是一個512bit的字符串(64字節),這是由于我們下載的Wireshark官方提供的樣例包中的WPA采用的是TKIP加密,如果是CCMP加密,這里的算法會有所區別,因為計算出的PTK應當為384bit。

此處以TKIP加密為例,512bit的字符串可以分割為3個部分:KCK、KEK 和 TK。

怎樣借助Python理解WPA四次握手過程

KCK (Key Confirmation Key):用于計算WPA EAPOL密鑰消息的MIC(完整性驗證)

KEK (Key Encryption Key):用于加密發送到客戶端的附加數據(在“密鑰數據”字段中)

TK (Temporal Key):用于后續通信數據加密

TKIP加密模式下,PTK共512bit,其中按順序為:KCK(128bit),KEK(128bit),TK(256bit)

CCMP加密模式下,PTK共384bit,其中按順序為:KCK(128bit),KEK(128bit),TK(128bit)

怎樣借助Python理解WPA四次握手過程

如上節中計算的PTK,按照長度劃分,應為:

KCK = b1cd792716762903f723424cd7d16511

KEK = 82a644133bfa4e0b75d96d2308358433

TK = 15798d511beae0028313c8ab32f12c7ecb71c893482669daaf0e9223fe1c0aed

驗證MIC

比較第一次和第二次握手,在數據包中會發現在WPA Key MIC字段中由原來的全0變成了一串字符:

怎樣借助Python理解WPA四次握手過程

MIC (Message Integrity Code):消息完整性代碼 是校驗數據是否被篡改,以及PSK是否正確(因為MIC是由PTK參與計算,PTK由是由PSK生成)。

怎樣借助Python理解WPA四次握手過程

MIC的計算是以KCK為密鑰(Key),整個802.1X報文為消息體(Message)進行HMAC運算得出的結果,共128bit。

順便一提,WPA的密碼離線破解也是利用PSK生成PMK,并根據握手包計算KCK,再生成MIC并對比原數據包中的MIC來確定密碼是否正確。

在我們手工驗證的時候,需要先將整個報文(這里以第二次握手為例)提取出來,并找到WPA Key MIC字段,將這部分內容替換成0,再計算。

怎樣借助Python理解WPA四次握手過程

這部分代碼如下:

 = .()
 = .([:], , .).()[:]

至此,大部分的計算和校驗任務已經結束。

第三次握手:傳遞加密的GTK,STA安裝TK

第三次握手,由AP向STA發送數據,其中MIC部分與上面的計算方式一致。STA接收到數據后,驗證MIC通過則說明AP是有效的,雙方PMK是一致的。

同時,在這個數據包中,包含了加密后的GTK。GTK (Group Temporal Key) 用于加密廣播和多播數據。GTK加密的密鑰為KEK,其解密和使用不在此詳述。

當STA接收到第三次握手包并驗證MIC通過后,會將計算出來的TK(PTK的最后一段)安裝到系統中,作為后續的通信加密密鑰。

第四次握手:AP安裝TK

最后一次握手僅為STA向AP發送的確認信息,表示密鑰已經安裝完畢,此時AP端也會進行密鑰安裝,至此,雙方的密鑰安裝全部結束,后續通信中按照前面步驟中的密鑰進行通信。

密鑰重裝攻擊 KRACK Attack

上文中簡單梳理了一下WPA四次握手的過程,其中省略了一些部分。由于主要是想幫助對KRACK漏洞的理解,因此重點放在第三次握手的密鑰安裝部分,安裝的密鑰來源上。

原理

關于這一漏洞,感興趣的可以參考《WPA2 密鑰重裝攻擊 KRACK Attacks 分析報告》,個人感覺這篇文章解釋的比較詳細,總結起來這個漏洞就是:

其中,wpa_supplicant 2.4及2.5版本實現了協議注釋內容“一旦安裝后,就可從內存中清除加密密鑰”,將導致客戶端會安裝值全為零的秘鑰。因此使用了這些wpa_supplicant版本的Linux及Android設備將遭受嚴重威脅。

這個漏洞是利用wpa_supplicant在第三次握手時對TK的處理來達到攻擊的目的的。由于TK是根據第一次和第二次握手包中的數據生成,因此STA會將該密鑰保存在本地的內存中。當收到第三次握手的數據包時,STA會將該密鑰安裝,并從內存中清除(“一旦安裝后,就可從內存中清除加密密鑰”),因此再次收到該握手包時,程序會再次加載這部分已被清零的內存,導致重新安裝的密鑰為全0。

利用

由于目前未找到直接的利用EXP/POC,在Github上有一個檢測工具:https://github.com/vanhoefm/krackattacks-scripts,其官網 https://www.krackattacks.com 上有對這個漏洞的演示。

從原理和演示來看,KRACK漏洞需要搭建Rogue AP做中間人,轉發握手數據幀。當發送第三次握手包時,進行重放。

由于多次接收到第三次握手包,STA會嘗試安裝全0的密鑰,并使用密鑰加密后續通信包。Rogue AP的通信密鑰預先就被置為0,這樣就可以正常的和STA通信。

目前沒有時間來實踐這個漏洞,僅從原理上對漏洞的利用方式進行分析,該漏洞更像是傳統的Evil Twin的攻擊方法,但Evil Twin需要知道目標AP的密碼,才能讓用戶的設備順利連入;而借助KRACK Attack,攻擊者無需知道目標AP的密碼即可實現中間人攻擊,監聽受害者流量。

總結

WPA的四次握手中,前兩次是在互相交換計算PTK的信息(ANonce、SNonce),AP驗證STA身份(利用MIC)并各自計算出PTK;第三次握手STA驗證了AP的身份,傳輸加密GTK,并將計算出的TK安裝;第四次握手確認密鑰安裝完成。

附:完整的計算MIC的 Python 代碼

   
 , , , , 

 (, , ):
     = 
     = 
     = 
      = ((    )  ):
         = .(,   ()    (), )
         += 
         =   .()
     [:]

 = 
 = 
 = (, , ).()

 = .()
 = .()
 = .()
 = .()

 = (, )  (, )  (,)  (,)
 = 
 = (, , )

 ,.()
 ,[:].()
 ,[:].()
 ,[:].()

 = .()

 = .([:], , .).()[:]
 ,

上述內容就是怎樣借助Python理解WPA四次握手過程,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蕉岭县| 东至县| 白河县| 潮安县| 安多县| 社旗县| 长兴县| 延庆县| 山阳县| 兰溪市| 大足县| 永昌县| 景洪市| 宽城| 海宁市| 汉寿县| 库车县| 娄底市| 井陉县| 新乐市| 寿阳县| 曲沃县| 时尚| 铜鼓县| 金山区| 慈溪市| 阳曲县| 延庆县| 淮滨县| 连江县| 库车县| 云霄县| 榆中县| 林州市| 舟曲县| 淮北市| 赤城县| 衡阳市| 错那县| 土默特左旗| 淅川县|