您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎樣借助Python理解WPA四次握手過程,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
環境準備
在正式開始分析之前,先要準備一下軟件和分析對象。
本次使用的操作系統是Windows10 1909,部分需要Linux的使用虛擬機安裝的Kali進行。
代碼部分,解釋器版本為Python 2.7。
數據包分析工具使用經典的Wireshark。
由于不同的加密方法和參數對握手包的影響較大,因此分析對象使用了Wireshark官方給出的WPA數據包。
該數據包可以在https://wiki.wireshark.org/HowToDecrypt802.11頁面上進行下載:
額外說明一下,如果想自己捕獲設備的WPA握手包,則需要額外的軟件,并將網卡置為Monitor Mode
。下面簡單介紹一下。
Windows平臺:在Windows平臺下想要捕獲802.11管理幀,需要使用微軟官方的軟件Microsoft Network Monitor。它的安裝和使用也相對比較方便,網上也有相當多的教程,如《windows下抓取802.11管理包》。有一點需要注意,該軟件在“掃描設置(Scanning Options)”中開啟Monitor Mode
后,該窗口不能關閉,否則會退出:
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
上圖中第一行所示的信息中,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即可捕獲。
在上一篇文章《Wi-Fi攻擊方式簡述》中,已經對WPA的握手過程進行過簡單講解,總結起來WPA的四次握手完成了:
1)Wi-Fi密碼的驗證
2)后續通信加密的密碼的計算(注意這里是“計算”不是“傳輸”)
而在其握手過程中,會生成一些過程產物,如加密握手數據的密鑰、完整性校驗數據等。密鑰計算的總覽視圖如下:
四次握手的簡單示意圖:
接下來會逐步介紹每一步的計算過程。
PMK(Pairwise Master Key) 是整個WPA認證過程中非常核心的一個密鑰,是由Wi-Fi的SSID
和Pre-Shared-Key
(即Wi-Fi密碼)計算而來,其算法被稱為Password-Based Key Derivation Function 2 (PBKDF2) ,是一種使用HMAC-SHA1,使用SSID作為鹽值來進行哈希的一種算法。
在默認的Python環境中,需要安裝pbkdf2
庫來支持這種算法,可以使用pip install pbkdf2
命令來安裝 。
= = = (, , ).()
此外,可以利用Linux系統中的wpa_passphrase
工具來計算PMK,其命令為:
pentest@DESKTOP-2AE07FJ:~$ wpa_passphrase Coherer Induction
這里可以看出來,計算出來的值是一致的。
在WPA的第一次握手時,由AP向STA發送ANonce
:
在這個數據包中,除了 ANonce
以外,在頭部包含了雙方的MAC地址。此時STA本地生成SNonce,滿足了PTK計算的全部條件,因此進行PTK的計算。
由于SNonce在第二次握手的數據包中,因此這部分計算的演示在下一節進行。
第二次握手時,STA向AP發送SNonce:
PTK(Pairwise Transient Key)的計算需要使用PRF512算法,其實現是參照《Understanding WPA/WPA2 Hash (MIC) Cracking Process In Python》文章中給出的算法進行:
(, , ): = = = = (( ) ): = .(, () (), .) += = .() [:]
從前兩次握手包中提取的ANonce
、SNonce
以及雙方的MAC地址,拼接起來作為計算PTK的部分:
= .() = .() = .() = .() = (, ) (, ) (,) (,)
PRF512
需要3個參數,PMK
,PKE
和上面計算出來的 key_data
。其中PKE
是一個固定字符串,PMK
在前文中有過計算:
= = (, , ).() = (, , )
到這里,AP和STA各自都計算出了PTK(正常情況下雙方算出的PTK內容是一致的)。
上一步驟中,計算出來的PTK是一個512bit的字符串(64字節),這是由于我們下載的Wireshark官方提供的樣例包中的WPA采用的是TKIP加密,如果是CCMP加密,這里的算法會有所區別,因為計算出的PTK應當為384bit。
此處以TKIP加密為例,512bit的字符串可以分割為3個部分:KCK、KEK 和 TK。
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)
如上節中計算的PTK,按照長度劃分,應為:
KCK = b1cd792716762903f723424cd7d16511
KEK = 82a644133bfa4e0b75d96d2308358433
TK = 15798d511beae0028313c8ab32f12c7ecb71c893482669daaf0e9223fe1c0aed
比較第一次和第二次握手,在數據包中會發現在WPA Key MIC
字段中由原來的全0變成了一串字符:
MIC (Message Integrity Code):消息完整性代碼 是校驗數據是否被篡改,以及PSK是否正確(因為MIC是由PTK參與計算,PTK由是由PSK生成)。
MIC的計算是以KCK為密鑰(Key),整個802.1X報文為消息體(Message)進行HMAC運算得出的結果,共128bit。
順便一提,WPA的密碼離線破解也是利用PSK生成PMK,并根據握手包計算KCK,再生成MIC并對比原數據包中的MIC來確定密碼是否正確。
在我們手工驗證的時候,需要先將整個報文(這里以第二次握手為例)提取出來,并找到WPA Key MIC
字段,將這部分內容替換成0,再計算。
這部分代碼如下:
= .() = .([:], , .).()[:]
至此,大部分的計算和校驗任務已經結束。
第三次握手,由AP向STA發送數據,其中MIC部分與上面的計算方式一致。STA接收到數據后,驗證MIC通過則說明AP是有效的,雙方PMK是一致的。
同時,在這個數據包中,包含了加密后的GTK。GTK (Group Temporal Key) 用于加密廣播和多播數據。GTK加密的密鑰為KEK,其解密和使用不在此詳述。
當STA接收到第三次握手包并驗證MIC通過后,會將計算出來的TK(PTK的最后一段)安裝到系統中,作為后續的通信加密密鑰。
最后一次握手僅為STA向AP發送的確認信息,表示密鑰已經安裝完畢,此時AP端也會進行密鑰安裝,至此,雙方的密鑰安裝全部結束,后續通信中按照前面步驟中的密鑰進行通信。
上文中簡單梳理了一下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四次握手過程,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。