第二章 WLAN 和固有的不安全性
作者:Vivek Ramachandran, Cameron Buchanan
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
簡介
建筑越高,地基就要打得越深。
-- 托馬斯·坎佩斯
沒有什么偉大的東西能在脆弱的基礎(chǔ)上構(gòu)建。在我們的語境中,固有的不安全性之上不能構(gòu)建出安全。
WLAN 在設(shè)計上擁有特定的不安全性,它們可被輕易利用,例如,通過封包注入,以及嗅探(能夠在很遠處進行)。我們會在這一章利用這些缺陷。
2.1 回顧 WLAN 幀
由于這本書處理無線方面的安全,我們假設(shè)你已經(jīng)對協(xié)議和封包的頭部有了基本的了解。沒有的話,或者你離開無線有很長時間了,現(xiàn)在是個好機會來回顧這個話題。
讓我們現(xiàn)在快速復習一些 WLAN 的基本概念,大多數(shù)你可能已經(jīng)知道了。在 WLAN 中,通信以幀的方式進行,一幀會擁有下列頭部結(jié)構(gòu):
Frame Control
字段本身擁有更復雜的結(jié)構(gòu):
類型字段定義了下列三種 WLAN 幀:
-
管理幀:管理幀負責維護接入點和無線客戶端之間的通信。管理幀擁有下列子類型:
- 驗證
- 解除驗證
- 關(guān)聯(lián)請求
- 關(guān)聯(lián)響應
- 重關(guān)聯(lián)請求
- 重關(guān)聯(lián)響應
- 解除關(guān)聯(lián)
- 信標
- 探測請求
- 探測響應
-
控制幀:控制幀負責確保數(shù)據(jù)在接入點和無線客戶端之間合理交換。控制幀擁有下列子類型:
- 請求發(fā)送(RTS)
- 清除發(fā)送(CTS)
- 確認(ACK)
數(shù)據(jù)幀:數(shù)據(jù)幀攜帶在無線網(wǎng)絡(luò)上發(fā)送的真實數(shù)據(jù)。它沒有子類型。
我們在之后的章節(jié)中討論不同攻擊的時候,會討論這些幀中每一種的安全隱患。
我們現(xiàn)在看一看如何使用 Wireshark 嗅探無線網(wǎng)絡(luò)上的這些幀。也有其他工具 -- 例如 Airodump-NG,Tcpdump,或者 Tshark -- 你同樣可以用于嗅探。我們在這本書中多數(shù)情況會使用 Wireshark,但是我們推薦你探索其它工具。第一步是創(chuàng)建監(jiān)控模式的接口。這會為你的適配器創(chuàng)建接口,使我們可以讀取空域中的所有無線幀,無論它們的目標是不是我們。在有線的世界中,這通常叫做混合模式。
實戰(zhàn)時間 -- 創(chuàng)建監(jiān)控模式的接口
讓我們現(xiàn)在將無線網(wǎng)卡設(shè)為監(jiān)控模式。
遵循下列指南來開始:
-
啟動 Kali 并使適配器保持連接。一旦你打開了控制臺,輸入
iwconfig
并確保網(wǎng)卡被檢測到,驅(qū)動被正確加載。 -
使用
ifconfig wlan1 up
命令啟動網(wǎng)卡(其中wlan1
是你的適配器)。通過運行ifconfig wlan1
驗證網(wǎng)卡是否正在運行。你應該在輸出的第二行看到單詞UP
,像這樣: -
為了將網(wǎng)卡設(shè)為監(jiān)控模式,我們使用
airmon-ng
,它在 Kali 中自帶。首先執(zhí)行airmon-ng
命令來確認它檢測到了可用的網(wǎng)卡。你應該能看到輸出中列出的wlan1
接口: -
現(xiàn)在輸入
airmon-ng start wlan1
命令來創(chuàng)建對應wlan1
設(shè)備的監(jiān)控模式接口。新的監(jiān)控模式接口名為mon0
。(你可以再次不帶參數(shù)使用airmon-ng
來驗證。) -
同樣,運行
ifconfig mon0
會展示叫做mon0
的新接口。
剛剛發(fā)生了什么?
我們成功創(chuàng)建了叫做mon0
的監(jiān)控模式接口。這個接口用于嗅探空域中的無線封包。這個接口已經(jīng)在我們的無線適配器中創(chuàng)建了。
試一試 -- 創(chuàng)建多個監(jiān)控模式接口
可以創(chuàng)建多個監(jiān)控模式的接口,使用相同的物理網(wǎng)卡。使用 airmon-ng 工具來看看如何完成。
太棒了!我們擁有了監(jiān)控模式接口,等待從空域中讀取一些封包。所以讓我們開始吧。
下一個練習中,我們會使用 Wireshark 和剛剛創(chuàng)建的mon0
監(jiān)控器模式接口,從空域中嗅探封包。
實戰(zhàn)時間 -- 嗅探無線封包
遵循下列指南來開始:
啟動我們在第一章中配置好的接入點
Wireless Lab
。-
通過在控制臺中鍵入
Wireshark &
來啟動 Wireshark,一旦 Wireshark 運行,訪問Capture | Interfaces
。 -
通過點擊
Start
按鈕從mon0
接口選擇封包捕獲,像截圖中那樣。Wireshark 會開始捕獲,現(xiàn)在你可以在 Wireshark 窗口中看到封包。 -
這些就是你的無線適配器從空域中嗅探到的封包。為了查看任何封包,在上面的窗口中選擇它,中間的窗口中會展示整個封包:
點擊
IEEE 802.11 Wireless LAN management frame
前面的三角形來展開并查看詳細信息。
觀察封包中不同的頭部字段,并將它們和之前了解的 WLAN 幀類型以及子類型關(guān)聯(lián)。
剛剛發(fā)生了什么?
我們剛剛從空域中嗅探了第一組封包。我們啟動了 Wireshark,它使用我們之前創(chuàng)建的監(jiān)控模式接口mon0
。通過查看 Wireshark 的底部區(qū)域,你應該注意到封包捕獲的速度以及目前為止捕獲的封包數(shù)量。
試一試 -- 發(fā)現(xiàn)不同設(shè)備
Wireshark 的記錄有時會令人生畏,即使在構(gòu)成合理的無線網(wǎng)絡(luò)中,你也會嗅探到數(shù)千個封包。所以深入到我們感興趣的封包十分重要。這可以通過使用 Wireshark 中的過濾器來完成。探索如何使用這些過濾器來識別記錄中唯一的無線設(shè)備 -- 接入點和無線客戶端。
如果你不能做到它,不要著急,它是我們下一個要學的東西。
實戰(zhàn)時間 -- 查看管理、控制和數(shù)據(jù)幀
現(xiàn)在我們學習如何使用 WIreshark 中的過濾器來查看管理、控制和數(shù)據(jù)幀。
請逐步遵循下列指南:
-
為了查看捕獲的封包中的所有管理幀,在過濾器窗口中輸入過濾器
wlan.fc.type
,并點擊Apply
。如果你打算防止封包向下滾動過快,你可以停止封包捕獲。 -
為了查看控制幀,將過濾器表達式修改為
wlan.fc.type == 1
。 -
為了查看數(shù)據(jù)幀,將過濾器表達式修改為
wlan.fc.type == 2
。 -
為了額外選擇子類型,使用
wlan.fc.subtype
過濾器。例如,要查看所有管理幀中的信標幀,使用下列過濾器:(wlan.fc.type == 0) && (wlan.fc.subtype == 8)
-
作為替代,你可以在中間的窗口中右擊任何頭部字段,之后選擇
Apply as Filter | Selected
來使用過濾器。 這會自動為你在
Filter
字段中添加正確的過濾器表達式。
剛剛發(fā)生了什么?
我們剛剛學習了如何在 Wireshark 中,使用多種過濾器表達式來過濾封包。這有助于監(jiān)控來自我們感興趣的設(shè)備的所選封包,而不是嘗試分析空域中的所有封包。
同樣,我們也可以以純文本查看管理、控制和數(shù)據(jù)幀的封包頭部,它們并沒有加密。任何可以嗅探封包的人都可以閱讀這些頭部。要注意,黑客也可能修改任何這些封包并重新發(fā)送它們。協(xié)議并不能防止完整性或重放攻擊,這非常易于做到。我們會在之后的章節(jié)中看到一些這類攻擊。
試一試 -- 玩轉(zhuǎn)過濾器
你可以查閱 Wireshark 的手冊來了解更多可用的過濾器表達式,以及如何使用。嘗試玩轉(zhuǎn)多種過濾器組合,直到你對于深入到任何細節(jié)層級都擁有自信,即使在很多封包記錄中。
下個練習中,我們會勘察如何嗅探我們的接入點和無線客戶端之間傳輸?shù)臄?shù)
據(jù)封包。
實戰(zhàn)時間 -- 嗅探我們網(wǎng)絡(luò)上的封包
這個練習中,我們會了解如何嗅探指定無線網(wǎng)絡(luò)上的封包。出于簡單性的原因,我們會查看任何沒有加密的封包。
遵循下列指南來開始:
啟動我們命名為
Wireless Lab
的無線接入點。讓我們將其配置為不加密。我們首先需要尋找
Wireless Lab
運行在哪個頻道上。為了完成它,打開終端并執(zhí)行airodump-ng --bssid <mac> mon0
,其中<mac>
是接入點的 MAC 地址。運行程序,不就你就會看到你的接入點顯示在屏幕上,并帶有所運行的頻道。-
我們可以從之前的截圖中看到,我們的接入點
Wireless Lab
運行在頻道 11 上。要注意這可能和你的接入點不同。為了嗅探發(fā)往和來自這個接入點的封包,我們需要將無線網(wǎng)卡鎖定在同一頻道上,也就是頻道 11。為了實現(xiàn)它,執(zhí)行
iwconfig mon0 channel 11
之后執(zhí)行iwconfig mon0
來驗證。你會看到輸出中的Frequency: 2.462 GHz
。這相當于頻道 11。 -
現(xiàn)在啟動 Wireshark,開始嗅探
mon0
接口。在 WIreshark 開始嗅探之后,在過濾器區(qū)域輸入wlan.bssid == <mac>
來使用接入點 BSSID 的過濾器,像下面的截圖這樣。為你的接入點填寫合適的 MAC 地址。 為了查看接入點的數(shù)據(jù)封包,添加下列過濾器:
(wlan.bssid == <mac>) && (wlan.fc.type_subtype == 0x20)
。在客戶端筆記本打開你的瀏覽器,并輸入接入點管理界面的 URL。我這里,像第一章那樣,它是http://192.168.0.1
。這會生成數(shù)據(jù)封包,WIreshark 會捕獲它。封包嗅探允許我們輕易分析未加密的數(shù)據(jù)。這就是為什么我們需要在無限種使用加密的原因。
剛剛發(fā)生了什么?
我們剛剛使用 WIreshark 和多種過濾器嗅探了空域中的數(shù)據(jù)。由于我們的接入點并沒有使用任何加密,我們能夠以純文本看到所有數(shù)據(jù)。這是重大的安全問題,因為如果使用了類似 WIreshark 的嗅探器,任何在接入點 RF 范圍內(nèi)的人都可以看到所有封包。
試一試 -- 分析數(shù)據(jù)封包
使用 WIreshark 進一步分析數(shù)據(jù)封包。你會注意 DHCP 請求由客戶端生成,并且如果 DHCP 服務器可用,它會返回地址。之后你會發(fā)現(xiàn) ARP 封包和其它協(xié)議的封包。這樣來被動發(fā)現(xiàn)無線網(wǎng)絡(luò)上的主機十分簡單。能夠看到封包記錄,并重構(gòu)出無線主機上的應用如何和網(wǎng)絡(luò)的其余部分通信十分重要。Wireshark 所提供的有趣的特性之一,就是跟蹤流的能力。這允許你一起查看多個封包,它們是相同連接中的 TCP 數(shù)據(jù)交換。
此外,嘗試登陸www.gmail.com
和其它流行站點并分析生成的數(shù)據(jù)流量。
我們會演示如何向無線網(wǎng)絡(luò)中注入封包。
實戰(zhàn)時間 -- 封包注入
我們使用 aireplay-ng 工具來進行這個練習,它在 Kali 中自帶。
遵循下列指南來開始:
為了執(zhí)行注入測試,首先啟動 Wireshark,并使用過濾器表達式
(wlan.bssid == <mac>) && !(wlan.fc.type_subtype == 0x08)
。這會確保我們只能看到我們無線網(wǎng)絡(luò)的非信標幀。現(xiàn)在在終端中執(zhí)行命令
aireplay-ng -9 -e Wireless Lab -a <mac> mon0
。返回 Wireshark,你會看到屏幕上會顯示大量封包。一些封包已經(jīng)由
aireplay-ng
發(fā)送,它們是我們發(fā)送的,其它的是Wireless Lab
接入點用于響應注入的封包。
剛剛發(fā)生了什么?
我們剛剛使用 aireplay-ng,成功向我們的測試環(huán)境網(wǎng)絡(luò)注入了封包。要注意我們的網(wǎng)卡將這些任意的封包注入到網(wǎng)絡(luò)中,而不需要真正連接到無線接入點Wireless Lab
。
試一試 -- 探索 Aireplay-ng 工具
我們會在之后的章節(jié)中詳細了解封包注入。現(xiàn)在請?zhí)剿饕幌?Aireplay-ng 工具用于注入封包的其它選項。你可以使用 Wireshark 監(jiān)控空域來驗證注入是否成功。
2.2 WLAN 嗅探和注入的重點筆記
WLAN 通常在三種不同頻率范圍內(nèi)工作:2.4 GHz,3.6 GHz 和 4.9/5.0 GHz。并不是所有 WIFI 網(wǎng)卡都全部支持這三種范圍和相關(guān)的波段。例如,Alfa 網(wǎng)卡只支持 IEEE 802.11b/g。這就是說,這個網(wǎng)卡不能處理 802.11a/n。這里的關(guān)鍵是嗅探或注入特定波段的封包。你的 WIFI 網(wǎng)卡需要支持它。
另一個 WIFI 的有趣方面是,在每個這些波段中,都有多個頻道。要注意你的 WIFI 網(wǎng)卡在每個時間點上只能位于一個頻道。不能將網(wǎng)卡在同一時間調(diào)整為多個頻道。這就好比車上的收音機。任何給定時間你只能將其調(diào)整為一個可用的頻道。如果你打算聽到其它的東西,你需要修改頻道。WLAN 嗅探的原則相同。這會產(chǎn)生一個很重要的結(jié)論 -- 我們不能同時嗅探所有頻道,我們只能選擇我們感興趣的頻道。這就是說,如果我們感興趣的接入點的頻道是 1,我們需要將網(wǎng)卡設(shè)置為頻道 1。
雖然我們在上面強調(diào)了 WLAN 嗅探,注入的原則也相同。為了向特定頻道注入封包,我們需要將網(wǎng)卡調(diào)整為特定頻道。
讓我們現(xiàn)在做一些練習,設(shè)置網(wǎng)卡來制定頻道或進行頻道跳躍,設(shè)置規(guī)范域以及功率等級,以及其它。
實戰(zhàn)時間 -- 使用適配器做實驗
仔細遵循以下步驟:
-
輸入
iwconfig wlan0
命令來查看網(wǎng)卡的功能。你可以看到,我們的適配器可以工作在 b、g 和 n 波段中。 -
為了將網(wǎng)卡設(shè)置為特定頻道,我們使用
iwconfig mon0 channel X
命令。 -
iwconfig
命令集并沒有頻道跳躍模式。你可以在它上面編寫簡單的腳本來實現(xiàn)。一個簡單的方式就是帶選項使用 Airodump-NG 來跳躍任何頻道,或者是某個子集,或者使用所選的波段。當我們執(zhí)行airodump-ng --help
的時候,所有這些選項展示在下面。
剛剛發(fā)生了什么?
我們知道了,無線嗅探和封包注入依賴于硬件的支持。這即是說我們只能處理網(wǎng)卡支持的波段和頻道。此外,無線網(wǎng)卡每次只能位于一個頻道。這說明了我們只能一次嗅探或注入一個頻道。
試一試 -- 嗅探多個頻道。如果你需要同時嗅探多個頻道,你需要多個物理 WIFI 網(wǎng)卡。如果你可以獲得額外的網(wǎng)卡,嘗試同時嗅探多個頻道。
4.3 無線網(wǎng)絡(luò)中規(guī)范域的作用
WIFI 的復雜性到這里并沒有結(jié)束。每個國家都有自己的未授權(quán)的頻譜分配策略。這規(guī)定了允許的功率等級和頻譜的用戶。例如,F(xiàn)CC 規(guī)定,如果你在美國使用 WLAN,你就必須遵守這些規(guī)定。在一些國家,不遵守相關(guān)規(guī)定會收到懲罰。
現(xiàn)在讓我們看看如何尋找默認的規(guī)范設(shè)置,以及如何按需修改它們。
實戰(zhàn)時間 -- 使用適配器做實驗
仔細遵循以下步驟:
重啟的計算機并不要連接到適配器。
-
登錄之后,使用
tail
命令監(jiān)控內(nèi)核信息:插入適配器,你會看到像這樣的一些東西。這展示了網(wǎng)卡所使用的默認規(guī)范設(shè)置。
-
讓我們假設(shè)你在美國。為了將規(guī)范域修改為 US,我們在新的終端中輸入下列命令
iw reg set US
。
如果命令執(zhí)行成功,我們會在終端得到這樣的輸出,其中我們正在監(jiān)控/var/log/messages
: -
現(xiàn)在嘗試把網(wǎng)卡設(shè)置為頻道 11,它生效了。但是當你嘗試設(shè)置為頻道 12 時候,你會得到錯誤。這是因為在美國不能使用頻道 12。
-
功率等級也使用相同的原則。US 只允許最大 27 dBm(500 毫瓦)。所以即使我們的適配器的功率為 1 瓦(30 dBm),我們也不能將其設(shè)置為最大傳輸功率:
-
但是,如果我們在玻利維亞,我們就能夠使用 1 瓦的傳輸功率,因為這里允許。你可以看到,我們將規(guī)范域設(shè)為玻利維亞 --
iw reg set BO
-- 我們就能將網(wǎng)卡功率設(shè)置為 30DMB 或 1 瓦。我們在玻利維亞使用頻道 12,這在美國是禁止的。
剛剛發(fā)生了什么?
每個國家都有用于未授權(quán)無線波段的自己的規(guī)范。當我們將規(guī)范域設(shè)置為特定國家時,我們的網(wǎng)卡會遵循允許的頻道和指定的功率等級。但是,嗅探網(wǎng)卡的規(guī)范域,來強制它工作在不允許的頻道上,以及在高于允許值的功率等級上傳輸數(shù)據(jù)相當容易。
試一試 -- 探索規(guī)范域
查看你可以設(shè)置的多種參數(shù),例如頻道、功率、規(guī)范域,以及其它。在 Kali 上使用iw
命令集。這會讓你深刻了解在不同國家的時候如何配置網(wǎng)卡,以及修改網(wǎng)卡設(shè)置。
小測驗 -- WLAN 封包嗅探和注入
Q1 哪種幀類型負責在 WLAN 中的驗證?
- 控制
- 管理
- 數(shù)據(jù)
- QoS
Q2 使用 airmon-mg 在 wlan0
上創(chuàng)建的第二個監(jiān)控器模式接口的名字是什么?
mon0
mon1
1mon
monb
Q3 用于在 Wireshark 中查看非信標的過濾器表達式是什么?
!(wlan.fc.type_subtype == 0x08)
wlan.fc.type_subtype == 0x08
(no beacon)
Wlan.fc.type == 0x08
總結(jié)
這一章中,我們對 WLAN 協(xié)議進行了一些重要的觀察。
管理、控制和數(shù)據(jù)幀是未加密的,所以監(jiān)控空域的人可以輕易讀取。要注意數(shù)據(jù)封包載荷可以使用加密來保護,使其更加機密。我們在下一章討論它們。
我們可以通過將網(wǎng)卡設(shè)置為監(jiān)控模式來嗅探附近的整個空域。
由于管理和控制幀沒有完整性保護,使用例如 aireplay-ng 的工具通過監(jiān)控或照舊重放它們來注入封包非常容易。
未加密的數(shù)據(jù)封包也可以被修改和重放到網(wǎng)絡(luò)中。如果封包加密了,我們?nèi)匀豢梢哉张f重放它們,因為 WLAN 設(shè)計上并沒有保護封包重放。
下一章中,我們會看一看用于 WLAN 的不同驗證機制,例如 MAC 過濾和共享驗證,以及其它。并且通過實際的演示來理解多種安全缺陷。