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