第四章 WLAN 加密缺陷
作者:Vivek Ramachandran, Cameron Buchanan
譯者:飛龍
簡介
任何人對于內存的需求,都不會超過640K。
-- 比爾·蓋茨,微軟創始人
即使做了最充分的預測,未來始終是不可預測的。WLAN 委員會設計了了 WEP 和 WPA 作為最簡單的加密機制,但是,久而久之,這些機制擁有在現實世界中廣泛公布和利用的缺陷。
WLAN 加密機制易受密碼學攻擊,這有相當長的歷史了。這從 2000 年的 WEP 開始,它最后被完全破解。最近,攻擊慢慢轉向了 WPA。即使當前沒有公開攻擊方式用于在所有情況下破解 WPA,特殊情況下的攻擊還是可行的。
5.1 WLAN 加密
WLAN 在空氣中傳輸數據,所以保護數據的機密性是一種內在需求。使用加密是最佳方案。WLAN 委員會(IEEE 802.11)為數據加密指定了以下協議:
- 無線等效協議(WEP)
- 無線保護接入(WPA)
- 無線保護接入 v2(WPA2)
這一章中,我們會看一看每個加密協議,并演示針對它們的多種攻擊。
5.2 WEP 加密
WEP 協議在 2000 年發現漏洞,但是,詫異的是,它仍然被使用,并且接入點仍然自帶 WEP 功能。
WEP 中有許多密碼學缺陷,它們被 Walker,Arbaugh,Fluhrer,Martin,Shamir,KoreK,以及其它人發現。密碼學立場上的評估超出了這本書的范圍,并且涉及到復雜的數學。這一節中,我們會看一看如何使用 Kali 中便捷可用的工具來破解 WEP 加密。這包含整個aircrack-ng
工具套件 -- airmon-ng
,aireplay-ng
,airodump-ng
,aircrack-ng
,以及其它。
WEP 的基礎缺陷是使用 RC4 和短的 IV 值,每 224 幀復用。雖然這本身是個大數,但是每 5000 個封包中還是有 50% 的幾率重用四次。為了利用這個,我們嘗試大量流量,是我們增加重用 IV 的可能性,從而比較兩個使用相同密鑰和 IV 加密的密文。
讓我們首先在測試環境中建立 WEP,并且看看如何破解。
實戰時間
遵循以下指南來開始:
-
讓我們首先連接到接入點
Wireless Lab
,并且訪問設置區域來處理無線加密機制。 -
在我的接入點上,這可以通過將
Security Mode
設置為 WEP 來完成。我們也需要設置 WEP 密鑰長度。就像下面這樣,我將 WEP 設置為使用128bit
密鑰。我將默認密鑰設置為WEP Key 1
,值為abcdefabcdefabcdefabcdef12
。你可以隨便設置它。 一旦設置完成,接入點應該提供 WEP 作為加密機制。讓我們現在啟動攻擊者的主機。
-
讓我們啟動
wlan0
,通過鍵入下列命令:ifconfig wlan0 up
-
下面,我們執行下列命令:
airmon-ng start wlan0
-
這創建了
mon0
,監控器模式接口,像下面這樣。使用iwconfig
驗證mon0
接口已經創建。 -
讓我們執行
airodump-ng
,使用下列命令定位我們的無線接入點:airodump-ng mon0
-
你可以看到,我們能夠看到執行 WEP 接入點的
Wireless Lab
。 -
對于這個練習,我們僅僅對
Wireless Lab
感興趣,所以讓我們輸入下列命令來僅僅觀察這個網絡上的封包:airodump-ng –bssid 00:21:91:D2:8E:25 --channel 11 --write WEPCrackingDemo mon0
之前的命令行就像這樣:
-
我們使用
--write
命令讓airodump-ng
保存封包。 現在讓我們將無線客戶端連接到接入點,并使用 WEP 密鑰
abcdefabcdefabcdefabcdef12
。一旦客戶端成功連接,airodump-ng
會在屏幕上報告。-
如果你在相同目錄下執行
ls
,你會看到以WEPCrackingDemo-*
為前綴的文件,像這樣。這些是airodump-ng
創建的轉儲文件。 -
如果你注意
airodump-ng
界面,數據封包的數量在#Data
列下面列出,它還非常少(只有 68 個)。在 WEP 破解中,我們需要大量的數據風暴,使用相同密鑰加密來利用協議的缺陷。所以,我們需要強迫網絡來產生更多數據封包。為了完成它,我們使用aireplay-ng
工具。 -
我們使用
Aireplay-ng
捕獲 ARP 封包,并將它們注入會網絡來模擬 ARP 響應。我們在單獨的窗口中啟動 Aireplay-ng,像下面這樣。將這些封包重放數千次,我們會在網絡上生成大量流量。即使 Aireplay-ng 不知道 WEP 密鑰,也能夠通過觀察封包大小來識別 ARP 封包。ARP 是個固定頭部的協議,所以 ARP 封包的大小可以輕易判斷,并且用于在加密流量中識別。我們執行aireplay-ng
,參數會在后面討論。-3
選項用于 ARP 重放,-b
指定網絡的 BSSID,-h
指定我們打算欺騙的客戶端 MAC 地址。我們需要完成它,因為重放攻擊只對驗證和授權后的客戶端 MAC 地址生效。 -
不久你會看到
aireplay-ng
能夠嗅探 ARP 封包并在網絡上重放他們。如果你遇到了頻道相關的錯誤,在命令后附加–ignore-negative-one
,像這樣: -
這時,
airodump-ng
會開始收到一大堆數據封包。所以這些嗅探到的封包儲存在我們之前看到的WEPCrackingDemo-*
文件中: 現在開始真正的破解部分!我們以
WEPCRackingDemo-0*.cap
選項在新窗口啟動aircrack-ng
。它會開始使用文件中的數據風暴破解 WEP 密鑰。要注意 Airodump-ng 收集數據封包,aireplay-ng
進行重放攻擊,aircrack-ng
嘗試基于捕獲的封包來破解 WEP 密鑰,所有都同時進行。這個實驗中,它們都在單獨的窗口打開。-
當
aircrack-ng
開始破解封包之后,你的界面應該是這樣: -
用于破解密鑰的數據封包的數量是非確定的,但是通常至少需要成百上千個。在快速的網絡(或使用
aireplay-ng
)中,這最多花費 5~10 分鐘。如果當前文件中的數據封包的數量不夠,aircrack-ng
就會暫停,等待更多捕獲的封包,之后它會重新開始破解過程,像這樣: -
一旦捕獲到了足夠的數據,
aircrack-ng
就會開始破解密鑰。之后,它會在終端中展示并退出,像這樣: 要注意,WEP 是完全缺陷的,任何 WEP 密鑰(無論多復雜)都會被 Aircrack-ng 破解。唯一的需要就是大量數據封包,使用這個密鑰加密,并且對
aircrack-ng
可用。
剛剛發生了什么?
我們在環境中建立 WEP,并成功破解了 WEP 密鑰。為了完成它,我們首先等待正常客戶端連接到接入點。之后,我們使用 aireplay-ng 工具在網絡上重放 ARP 封包。這會導致網絡發送 ARP 重放封包,從而增加空中發送的數據封包數量。之后我們使用 aircrack-ng 工具,通過分析數據風暴的密碼學缺陷來破解 WEP 密鑰。
要注意我們也能夠使用共享密鑰驗證繞過機制,來偽造接入點的驗證,這會在后面的章節中學到。如果正常客戶端離開了網絡,這可以更方便一些。這會確保我們可以偽造驗證和關聯,并且繼續將重放封包發送到網絡。
試一試 -- 使用 WEP 破解偽造驗證
在之前的練習中,如果正常客戶端突然斷開了網絡,我們就不能重放封包,因為接入點會拒絕接受來自未關聯客戶端的封包。
你的挑戰就是,使用即將在后面學到的共享密鑰繞過偽造驗證和授權,使你仍然能夠將封包注入到網絡中,并驗證接入點是否接受和響應它們。
4.3 WPA/WPA2
WPA 或者 WPA v1 主要使用 TKIP 加密算法。TKIP 用于改進 WEP,不需要完全新的硬件來運行。反之,WPA2 必須使用 AES-CCMP 算法來加密,這比 TKIP 更加強大和健壯。
WPA 和 WPA2 允許 基于 WAP 的驗證,使用基于 RADIUS 服務器(企業)和預共享密鑰(PSK)(個人)的驗證模式。
WPA/WPA2 PSK 易受字典攻擊。攻擊所需的輸入是客戶端和接入點之間的四次 WPA 握手,以及包含常用口令的單詞列表。之后,使用例如 Aircrack-ng 的工具,我們可以嘗試破解 WPA/WPA2 PSK 口令。
四次握手的演示見下面:
WPA/WPA2 PSK 的原理是它導出了會話層面的密鑰,叫做成對臨時密鑰(PTK),使用預共享密鑰和五個其它參數 -- 網絡 SSID、驗證者 Nounce (ANounce)、申請者 Nounce (SNounce)、驗證著 MAC 地址(接入點 MAC)、申請者 MAC 地址(WIFI 客戶端 MAC)。密鑰之后用于加密接入點和客戶端之間的所有數據。
通過嗅探空氣來竊取整個對話的攻擊者,可以獲得前面提到的全部五個參數。它唯一不能得到的東西就是預共享密鑰。所以,預共享密鑰如何創建?它由用戶提供的 WPA-PSK 口令以及 SSID 導出。這些東西的組合通過基于密碼的密鑰推導函數(PBKDF2)來發送,它的輸出是 256 位的共享密鑰。
在典型的 WPA/WPA2 PSK 字典攻擊中,攻擊者會使用可能口令的大量字典以及攻擊工具。工具會從每個口令中導出 256 位的預共享密鑰,并和其它參數(之前提到過)一起使用來創建 PTK。PTK 用于在握手包之一中驗證信息完整性檢查(MIC)。如果匹配,從字典中猜測的口令就正確,反之就不正確。
最后,如果授權網絡的口令存在于字典中,它會被識別。這就是 WPA/WPA2 PSK 破解的工作原理。下面的圖展示涉及到的步驟:
下個練習中,我們會看一看如何破解 WPA PSK 無線網絡。使用 CCMP(AES)的WPA2-PSK 網絡的破解步驟與之相同。
實戰時間 -- 破解 WPA-PSK 弱口令
遵循以下指南來開始:
-
讓我們首先連接到我們的接入點
Wireless Lab
,并設置接入點使用 WPA-PSK。我們將 WPA-PSK 口令設為abcdefgh
,使其易于受字典攻擊。 -
我們以下列參數啟動
airodump-ng
,使其開始捕獲和儲存網絡上的所有封包:airodump-ng –bssid 00:21:91:D2:8E:25 –channel 11 –write WPACrackingDemo mon0"
輸出是這樣:
-
現在我們可以等待新的客戶端連接接入點,便于我們捕獲四次握手包。或者我們可以廣播解除驗證封包來強制客戶端重新連接。我們選擇后者來提升速度。相同的位置頻道錯誤可能自再次發生,同樣,使用
–-ignorenegative-one
。這也需要更多嘗試: 只要我們不活了 WPA 握手包,
airodump-ng
會在屏幕的右上角將其表示為 WPA 握手包,并帶有接入點的 BSSID。如果你使用了–ignore-negative-one
,工具可能將 WPA 握手包替換為固定的頻道信息。你需要觀察到一閃而過的 WPA 握手信息。我們現在可以停止
airodump-ng
了。讓我們在 Wireshark 中打開 cap 文件,并查看四次握手。你的 Wireshark 終端應該是這樣。我在屏幕的記錄文件中選擇了四次握手的第一個封包。握手封包就是協議為 EAPOL 的封包:-
現在我們開始實際的密鑰破解練習。我們需要常見單詞的字典。Kali 在
metasploit
文件夾中自帶了許多字典文件,位于截圖這里。要注意,在 WPA 破解中,你的水平就和你的字典一樣。Kali 自帶了一些字典,但是這些可能不夠。人們所選的密碼取決于很多因素。這包括所居住的國家、區域中的常見名稱和短語,用戶的安全意識,以及一些其它因素。收集國際和區域特定的單詞列表,在從事滲透測試的時候是個好主意。 -
我們現在以
pcap
文件作為輸入以及到字典文件的鏈接調用aircrack-ng
工具,像下面這樣。我使用了nmap.lst
,像這樣: -
aircrack-ng
使用字典文件來嘗試多種口令組合,并嘗試破解密鑰。如果口令出現在字典文件中,它會最后破解出來,并且你的屏幕會看起來像這樣: 要注意,因為這是字典攻擊,預置條件是口令必須出現在提供給
aircrack-ng
的字典文件中。如果口令沒有出現在字典中,攻擊就會失敗。
剛剛發生了什么?
我們在接入點上設置了 WPA-PSK,使用常見口令:abcdefgh
。之后我們使用解除驗證攻擊,讓正常客戶端重新連接到接入點。當我們重新連接時,我們捕獲了客戶端和接入點之間的 WPA 四次握手。
因為 WPA-PSK 易受字典攻擊,我們向Aircrack-ng
輸入了包含 WPA 四次握手的捕獲文件,以及常見口令的列表(以單詞列表形式)。因為口令abcdefgh
出現在單詞列表中,Aircrack-ng
就能夠破解 WPS-PSK 共享口令。要再次注意,在基于字典的 WPA 破解中,你的水平就等于你的字典。所以在你開始之前,編譯一個大型并且詳細的字典非常重要。通過 Kali 自帶的字典,有時候可能不夠,可能需要更多單詞,尤其是考慮位置因素。
試一試 -- 嘗試使用 Cowpatty 破解 WPA-PSK
Cowpatty 是個同樣使用字典攻擊來破解 WPA-PSK 口令的工具。這個工具在 Kali 中自帶。我將其留做練習,來讓你使用 Cowpatty 破解 WPA-PSK 口令。
同樣,設置不常見的口令,它不出現在你的字典中,并再次嘗試。你現在再破解口令就不會成功了,無論使用 Aircrack-ng 還是 Cowpatty。
要注意,可以對 WPA2-PSK 網絡執行相同攻擊。我推薦你自己驗證一下。
4.4 加速 WPA/WPA2 的破解
我們在上一節中看到,如果我們在字典中擁有正確的口令,破解個人 WPA 每次都會像魔法一樣。所以,為什么我們不創建一個大型的詳細字典,包含百萬個常見密碼和詞組呢?這會幫助我們很多,并且多數情況都會最終破解出口令。這聽起來不錯,但是我們錯過了一個核心組件 -- 所花費的時間。更多需要 CPU 和時間的計算之一就是使用 PSK 口令和 SSID 通過 PSKDF2 的預共享密鑰。這個函數在輸出 256 位的與共享密鑰之前,計算超過 4096 次二者組合的哈希。破解的下一步就是使用這個密鑰以及四次握手中的參數來驗證握手中的 MIC。這一步計算了非常大。同樣,握手中的參數每次都會變化,于是這一步不能預先計算。所以,為了加速破解進程,我們需要使來自口令的與共享密鑰的計算盡可能快。
我們可以通過預先計算與共享密鑰,在 802.11 標準術語中也叫作成對主密鑰(PMK)來加速。要注意,因為 SSID 也用于計算 PMK,使用相同口令和不同 SSID,我們會得到不同的 PMK。所以,PMK 取決于口令和 SSID。
下個練習中,我們會看看如何預先計算 PMK,并將其用于 WPA/WPA2 的破解。
實戰指南 -- 加速破解進程
我們可以遵循以下步驟來開始:
-
我們可以為給定的 SSID 和 單詞列表,使用
genpmk
工具預先計算 PMK,使用下列命令:genpmk –f <chosen wordlist>–d PMK-Wireless-Lab –s "Wireless Lab
這創建了包含預生成的 PMK 的 PMK-Wireless-Lab 文件。
-
我們現在可以使用口令
abcdefgh
(出現在我們所使用的字典中)創建 WPA-PSK 網絡,并捕獲該網絡的 WPA 握手。我們現在使用 Cowpatty 來破解 WPA 口令,像這樣:Cowpatty 花費大約 7.18 秒來破解密鑰,使用預先計算的 PMK。
我們現在以相同字典文件來使用
aircrack-ng
,破解過程需要花費 22 分鐘。這展示了我們由于預先計算節省了多少時間。為了讓
aircrack-ng
使用這些 PMK,我們需要使用叫做airolib-ng
的工具。我們向其提供選項airolib-ng
,PMK-Aircrack --import
和cowpatty PMK-Wireless-Lab
,其中PMK-Aircrack
是需要創建的aircrack-ng
兼容的數據庫, PMK-Wireless-Lab 是我們之前創建的genpmk
兼容的 PMK 數據庫。-
我們現在將數據提供給
aircrack-ng
,并且破解進程會極大加速。我們使用下列命令:aircrack-ng –r PMK-Aircrack WPACrackingDemo2-01.cap
Kali 上帶有額外的工具,例如 Pyrit,可以利用多個 CPU 的系統來加速破解。我們使用
-r
選項將文件名稱提供給pcap
,并使用-i
選項提供genpmk
兼容的 PMK 文件。Pyrit 花費大約 3 秒來破解密鑰,使用由genpmk
生成的相同 PMK 文件。
剛剛發生了什么?
我們查看了多種不同工具和技巧來加速 WPA/WPA2-PSK 破解。主要原理就是對給定的 SSID 和字典中的口令列表預計算 PMK。
4.5 解密 WEP 和 WPA 封包
在所有我們做過的聯系中,我們使用多種技巧破解了 WEP 和 WPA 密鑰。我們能拿這些信息做什么呢?第一步就是使用密鑰解密我們捕獲的數據封包。
下一個練習中,我們會在相同的我們所捕獲的記錄文件中解密 WEP 和 WPA 封包,使用我們破解得到的密鑰。
實戰時間 -- 解密 WEP 和 WPA 封包
遵循以下步驟來開始:
-
我們從之前創建的 WEP 捕獲文件來解密封包:
WEPCrackingDemo-01.cap
。為了這樣做,我們使用另一個 Aircrack-ng 套件中的工具,叫做airdecap-ng
。我們執行下面的命令,使用之前破解的 WEP 密鑰:airdecap-ng -w abcdefabcdefabcdefabcdef12 WEPCrackingDemo-02.cap
-
解密文件儲存在叫做
WEPCrackingDemo-02-dec.cap
的文件中。我們使用tshark
工具來查案看文集你的前十個封包。要注意基于捕獲的內容。你可能看到不同的東西。 -
WPA/WPA PSK 和 WEP 的工作方式完全相同,使用
airdecap-ng
工具執行下列命令,像這樣:airdecap-ng –p abdefg WPACrackingDemo-02.cap –e "Wireless Lab"
剛剛發生了什么?
我們剛剛看到了如何使用Airdecap-ng
解密 WEP 和 WPA/WPA2-PSK 加密封包。要注意,我們可以使用 Wireshark 做相同的事情。我們推薦你查閱 Wireshark 的文檔來探索如何用它來完成。
4.6 連接到 WEP 或 WPA 網絡
我們也可以在破解網絡密鑰之后連接到授權網絡。這在滲透測試過程中非常方便。使用破解的密鑰登錄授權網絡,是你可以提供給客戶的證明網絡不安全的證據。
實戰時間 -- 連接 WEP 網絡
遵循以下步驟來開始:
-
擁有密鑰之后,使用
iwconfig
工具來連接 WEP 網絡。在之前的聯系中,我們破解了 WEP 密鑰:abcdefabcdefabcdefabcdef12
。
剛剛發生了什么?
我們連接到了 WEP 網絡。
實戰時間 -- 連接 WPA 網絡
遵循以下步驟來開始:
-
在 WPA 的例子中,問題有些復雜。
iwconfig
工具不能用于個人級或企業級 WPA/WPA2,因為它并不支持它。我們會使用叫做WPA_supplicant
的新工具來完成這個實驗。為了對網絡使用WPA_supplicant
,我們需要創建配置文件,像下面這樣。我們將文件命名為wpa-supp.conf
。 之后我們使用以下選項調用
WPA_supplicant
工具:-D wext -i wlan0 –c wpa-supp.conf
,來連接到之前破解的 WPA 網絡。一旦連接成功, WPA_supplicant 會提示信息:Connection to XXXX completed
。對于 WEP 和 WPA 網絡,一旦連接簡歷,你可以通過鍵入
dhclient3 wlan0
,使用 dhcpclient 從網絡獲得 DHCP 地址。
剛剛發生了什么?
默認的 WIFI 工具iwconfig
不能用于連接 WPA/WPA2 網絡。實際上的工具是WPA_Supplicant
。這個實驗中,我們看到如何使用它來連接 WPA 網絡。
小測驗 -- WLAN 加密缺陷
Q1 哪種封包用于封包重放?
- 解除驗證封包
- 關聯封包
- 加密的 ARP 封包
- 以上都不是
Q2 WEP 什么時候能被破解?
- 始終
- 只要使用弱密鑰/口令
- 只在特殊的場景下
- 只要接入點運行舊的軟件
Q3 WPA 什么時候能被破解?
- 始終
- 只要使用弱密鑰/口令
- 如果客戶端包含舊的固件
- 即使沒有客戶端連接到無線網絡
總結
這一章中,我們了解了 WLAN 加密。WEP 含有缺陷,無論 WEP 密鑰是什么,使用足夠的數據封包就能破解 WEP。WPA/WPA2 在密碼學上不可破解;但是,在特殊的場景下,例如 WPA/WP2-PSK 中使用了弱口令,它就能夠通過字典攻擊來獲得口令。
下一章中我們會看一看 WLAN 設施上的不同工具,例如偽造接入點,邪惡雙生子,位反轉攻擊,以及其它。