您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎樣借助Python理解WPA四次握手過程,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
環(huán)境準備
在正式開始分析之前,先要準備一下軟件和分析對象。
本次使用的操作系統(tǒng)是Windows10 1909,部分需要Linux的使用虛擬機安裝的Kali進行。
代碼部分,解釋器版本為Python 2.7。
數(shù)據(jù)包分析工具使用經(jīng)典的Wireshark。
由于不同的加密方法和參數(shù)對握手包的影響較大,因此分析對象使用了Wireshark官方給出的WPA數(shù)據(jù)包。
該數(shù)據(jù)包可以在https://wiki.wireshark.org/HowToDecrypt802.11頁面上進行下載:
額外說明一下,如果想自己捕獲設備的WPA握手包,則需要額外的軟件,并將網(wǎng)卡置為Monitor Mode
。下面簡單介紹一下。
Windows平臺:在Windows平臺下想要捕獲802.11管理幀,需要使用微軟官方的軟件Microsoft Network Monitor。它的安裝和使用也相對比較方便,網(wǎng)上也有相當多的教程,如《windows下抓取802.11管理包》。有一點需要注意,該軟件在“掃描設置(Scanning Options)”中開啟Monitor Mode
后,該窗口不能關閉,否則會退出:
Linux平臺:在Linux平臺下,可以借助我們熟悉的aircrack-ng
套件來設置網(wǎng)卡的Monitor Mode
,并使用Wireshrak
來獲取和查看數(shù)據(jù)。此處以Kali為例,其他Linux系統(tǒng)可以自行安裝相關套件。
設置監(jiān)聽模式的命令為:
root@kali:~# airmon-ng start wlan0
其中wlan0
是網(wǎng)卡的名稱。若出現(xiàn)以下情況:
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)
說明網(wǎng)卡被占用,需要使用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
這里網(wǎng)卡名稱會變成wlan0mon
,需要注意。
但是,直接設置后抓包有時只能抓到部分,比如僅有AP側(cè)的數(shù)據(jù),設備端的數(shù)據(jù)包都丟失了,原因是未指定信道。此時需要使用airodump-ng
工具查看目標AP的信道:
root@kali:~# airodump-ng wlan0mon
上圖中第一行所示的信息中,CH表示信道,我們想對該AP進行四次握手的捕獲,則需要將網(wǎng)卡監(jiān)聽的信道固定為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)
看到命令行中最后一行括號里的提示,表示已經(jīng)設置為固定監(jiān)聽信道11。
此時打開wireshark,選中網(wǎng)卡wlan0mon即可捕獲。
在上一篇文章《Wi-Fi攻擊方式簡述》中,已經(jīng)對WPA的握手過程進行過簡單講解,總結起來WPA的四次握手完成了:
1)Wi-Fi密碼的驗證
2)后續(xù)通信加密的密碼的計算(注意這里是“計算”不是“傳輸”)
而在其握手過程中,會生成一些過程產(chǎn)物,如加密握手數(shù)據(jù)的密鑰、完整性校驗數(shù)據(jù)等。密鑰計算的總覽視圖如下:
四次握手的簡單示意圖:
接下來會逐步介紹每一步的計算過程。
PMK(Pairwise Master Key) 是整個WPA認證過程中非常核心的一個密鑰,是由Wi-Fi的SSID
和Pre-Shared-Key
(即Wi-Fi密碼)計算而來,其算法被稱為Password-Based Key Derivation Function 2 (PBKDF2) ,是一種使用HMAC-SHA1,使用SSID作為鹽值來進行哈希的一種算法。
在默認的Python環(huán)境中,需要安裝pbkdf2
庫來支持這種算法,可以使用pip install pbkdf2
命令來安裝 。
= = = (, , ).()
此外,可以利用Linux系統(tǒng)中的wpa_passphrase
工具來計算PMK,其命令為:
pentest@DESKTOP-2AE07FJ:~$ wpa_passphrase Coherer Induction
這里可以看出來,計算出來的值是一致的。
在WPA的第一次握手時,由AP向STA發(fā)送ANonce
:
在這個數(shù)據(jù)包中,除了 ANonce
以外,在頭部包含了雙方的MAC地址。此時STA本地生成SNonce,滿足了PTK計算的全部條件,因此進行PTK的計算。
由于SNonce在第二次握手的數(shù)據(jù)包中,因此這部分計算的演示在下一節(jié)進行。
第二次握手時,STA向AP發(fā)送SNonce:
PTK(Pairwise Transient Key)的計算需要使用PRF512算法,其實現(xiàn)是參照《Understanding WPA/WPA2 Hash (MIC) Cracking Process In Python》文章中給出的算法進行:
(, , ): = = = = (( ) ): = .(, () (), .) += = .() [:]
從前兩次握手包中提取的ANonce
、SNonce
以及雙方的MAC地址,拼接起來作為計算PTK的部分:
= .() = .() = .() = .() = (, ) (, ) (,) (,)
PRF512
需要3個參數(shù),PMK
,PKE
和上面計算出來的 key_data
。其中PKE
是一個固定字符串,PMK
在前文中有過計算:
= = (, , ).() = (, , )
到這里,AP和STA各自都計算出了PTK(正常情況下雙方算出的PTK內(nèi)容是一致的)。
上一步驟中,計算出來的PTK是一個512bit的字符串(64字節(jié)),這是由于我們下載的Wireshark官方提供的樣例包中的WPA采用的是TKIP加密,如果是CCMP加密,這里的算法會有所區(qū)別,因為計算出的PTK應當為384bit。
此處以TKIP加密為例,512bit的字符串可以分割為3個部分:KCK、KEK 和 TK。
KCK (Key Confirmation Key):用于計算WPA EAPOL密鑰消息的MIC(完整性驗證)
KEK (Key Encryption Key):用于加密發(fā)送到客戶端的附加數(shù)據(jù)(在“密鑰數(shù)據(jù)”字段中)
TK (Temporal Key):用于后續(xù)通信數(shù)據(jù)加密
TKIP加密模式下,PTK共512bit,其中按順序為:KCK(128bit),KEK(128bit),TK(256bit)
CCMP加密模式下,PTK共384bit,其中按順序為:KCK(128bit),KEK(128bit),TK(128bit)
如上節(jié)中計算的PTK,按照長度劃分,應為:
KCK = b1cd792716762903f723424cd7d16511
KEK = 82a644133bfa4e0b75d96d2308358433
TK = 15798d511beae0028313c8ab32f12c7ecb71c893482669daaf0e9223fe1c0aed
比較第一次和第二次握手,在數(shù)據(jù)包中會發(fā)現(xiàn)在WPA Key MIC
字段中由原來的全0變成了一串字符:
MIC (Message Integrity Code):消息完整性代碼 是校驗數(shù)據(jù)是否被篡改,以及PSK是否正確(因為MIC是由PTK參與計算,PTK由是由PSK生成)。
MIC的計算是以KCK為密鑰(Key),整個802.1X報文為消息體(Message)進行HMAC運算得出的結果,共128bit。
順便一提,WPA的密碼離線破解也是利用PSK生成PMK,并根據(jù)握手包計算KCK,再生成MIC并對比原數(shù)據(jù)包中的MIC來確定密碼是否正確。
在我們手工驗證的時候,需要先將整個報文(這里以第二次握手為例)提取出來,并找到WPA Key MIC
字段,將這部分內(nèi)容替換成0,再計算。
這部分代碼如下:
= .() = .([:], , .).()[:]
至此,大部分的計算和校驗任務已經(jīng)結束。
第三次握手,由AP向STA發(fā)送數(shù)據(jù),其中MIC部分與上面的計算方式一致。STA接收到數(shù)據(jù)后,驗證MIC通過則說明AP是有效的,雙方PMK是一致的。
同時,在這個數(shù)據(jù)包中,包含了加密后的GTK。GTK (Group Temporal Key) 用于加密廣播和多播數(shù)據(jù)。GTK加密的密鑰為KEK,其解密和使用不在此詳述。
當STA接收到第三次握手包并驗證MIC通過后,會將計算出來的TK(PTK的最后一段)安裝到系統(tǒng)中,作為后續(xù)的通信加密密鑰。
最后一次握手僅為STA向AP發(fā)送的確認信息,表示密鑰已經(jīng)安裝完畢,此時AP端也會進行密鑰安裝,至此,雙方的密鑰安裝全部結束,后續(xù)通信中按照前面步驟中的密鑰進行通信。
上文中簡單梳理了一下WPA四次握手的過程,其中省略了一些部分。由于主要是想幫助對KRACK漏洞的理解,因此重點放在第三次握手的密鑰安裝部分,安裝的密鑰來源上。
關于這一漏洞,感興趣的可以參考《WPA2 密鑰重裝攻擊 KRACK Attacks 分析報告》,個人感覺這篇文章解釋的比較詳細,總結起來這個漏洞就是:
其中,wpa_supplicant 2.4及2.5版本實現(xiàn)了協(xié)議注釋內(nèi)容“一旦安裝后,就可從內(nèi)存中清除加密密鑰”,將導致客戶端會安裝值全為零的秘鑰。因此使用了這些wpa_supplicant版本的Linux及Android設備將遭受嚴重威脅。
這個漏洞是利用wpa_supplicant在第三次握手時對TK的處理來達到攻擊的目的的。由于TK是根據(jù)第一次和第二次握手包中的數(shù)據(jù)生成,因此STA會將該密鑰保存在本地的內(nèi)存中。當收到第三次握手的數(shù)據(jù)包時,STA會將該密鑰安裝,并從內(nèi)存中清除(“一旦安裝后,就可從內(nèi)存中清除加密密鑰”),因此再次收到該握手包時,程序會再次加載這部分已被清零的內(nèi)存,導致重新安裝的密鑰為全0。
由于目前未找到直接的利用EXP/POC,在Github上有一個檢測工具:https://github.com/vanhoefm/krackattacks-scripts,其官網(wǎng) https://www.krackattacks.com 上有對這個漏洞的演示。
從原理和演示來看,KRACK漏洞需要搭建Rogue AP做中間人,轉(zhuǎn)發(fā)握手數(shù)據(jù)幀。當發(fā)送第三次握手包時,進行重放。
由于多次接收到第三次握手包,STA會嘗試安裝全0的密鑰,并使用密鑰加密后續(xù)通信包。Rogue AP的通信密鑰預先就被置為0,這樣就可以正常的和STA通信。
目前沒有時間來實踐這個漏洞,僅從原理上對漏洞的利用方式進行分析,該漏洞更像是傳統(tǒng)的Evil Twin的攻擊方法,但Evil Twin需要知道目標AP的密碼,才能讓用戶的設備順利連入;而借助KRACK Attack,攻擊者無需知道目標AP的密碼即可實現(xiàn)中間人攻擊,監(jiān)聽受害者流量。
WPA的四次握手中,前兩次是在互相交換計算PTK的信息(ANonce、SNonce),AP驗證STA身份(利用MIC)并各自計算出PTK;第三次握手STA驗證了AP的身份,傳輸加密GTK,并將計算出的TK安裝;第四次握手確認密鑰安裝完成。
附:完整的計算MIC的 Python 代碼
, , , , (, , ): = = = = (( ) ): = .(, () (), ) += = .() [:] = = = (, , ).() = .() = .() = .() = .() = (, ) (, ) (,) (,) = = (, , ) ,.() ,[:].() ,[:].() ,[:].() = .() = .([:], , .).()[:] ,
上述內(nèi)容就是怎樣借助Python理解WPA四次握手過程,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。