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