了解一款用於對 WiFi 接入點安全進行滲透測試的工具。
越來越多的裝置通過無線傳輸的方式連線到網際網路,以及,大範圍可用的 WiFi 接入點為攻擊者攻擊使用者提供了很多機會。通過欺騙使用者連線到虛假的 WiFi 接入點,攻擊者可以完全控制使用者的網路連線,這將使得攻擊者可以嗅探和篡改使用者的封包,將使用者的連線重定向到一個惡意的網站,並通過網路發起其他的攻擊。
為了保護使用者並告訴他們如何避免線上的危險操作,安全審計人員和安全研究員必須評估使用者的安全實踐能力,使用者常常在沒有確認該 WiFi 接入點為安全的情況下就連線上了該網路,安全審計人員和研究員需要去了解這背後的原因。有很多工具都可以對 WiFi 的安全性進行審計,但是沒有一款工具可以測試大量不同的攻擊場景,也沒有能和其他工具整合得很好的工具。
Evil-Twin Framework(ETF)用於解決 WiFi 審計過程中的這些問題。審計者能夠使用 ETF 來整合多種工具並測試該 WiFi 在不同場景下的安全性。本文會介紹 ETF 的框架和功能,然後會提供一些案例來說明該如何使用這款工具。
ETF 的框架是用 Python 寫的,因為這門開發語言的程式碼非常易讀,也方便其他開發者向這個專案貢獻程式碼。除此之外,很多 ETF 的庫,比如 Scapy,都是為 Python 開發的,很容易就能將它們用於 ETF。
ETF 的架構(圖 1)分為不同的彼此互動的模組。該框架的設定都寫在一個單獨的組態檔裡。使用者可以通過 ConfigurationManager
類裡的使用者介面來驗證並修改這些設定。其他模組只能讀取這些設定並根據這些設定進行執行。
圖 1:Evil-Twin 的框架架構
ETF 支援多種與框架互動的使用者介面,當前的預設介面是一個互動式控制台介面,類似於 Metasploit 那種。正在開發用於桌面/瀏覽器使用的圖形化使用者介面(GUI)和命令列介面(CLI),行動端介面也是未來的一個備選項。使用者可以使用互動式控制台介面來修改組態檔裡的設定(最終會使用 GUI)。使用者介面可以與存在於這個框架裡的每個模組進行互動。
WiFi 模組(AirCommunicator)用於支援多種 WiFi 功能和攻擊型別。該框架確定了 Wi-Fi 通訊的三個基本支柱:封包嗅探、自定義封包注入和建立接入點。三個主要的 WiFi 通訊模組 AirScanner、AirInjector,和 AirHost,分別用於封包嗅探、封包注入,和接入點建立。這三個類被封裝在主 WiFi 模組 AirCommunicator 中,AirCommunicator 在啟動這些服務之前會先讀取這些服務的組態檔。使用這些核心功能的一個或多個就可以構造任意型別的 WiFi 攻擊。
要使用中間人(MITM)攻擊(這是一種攻擊 WiFi 用戶端的常見手法),ETF 有一個叫做 ETFITM(Evil-Twin Framework-in-the-Middle)的整合模組,這個模組用於建立一個 web 代理,來攔截和修改經過的 HTTP/HTTPS 封包。
許多其他的工具也可以利用 ETF 建立的 MITM。通過它的可延伸性,ETF 能夠支援它們,而不必單獨地呼叫它們,你可以通過擴充套件 Spawner 類來將這些工具新增到框架裡。這使得開發者和安全審計人員可以使用框架裡預先設定好的引數字元來呼叫程式。
擴充套件 ETF 的另一種方法就是通過外掛。有兩類外掛:WiFi 外掛和 MITM 外掛。MITM 外掛是在 MITM 代理執行時可以執行的指令碼。代理會將 HTTP(s) 請求和響應傳遞給可以記錄和處理它們的外掛。WiFi 外掛遵循一個更加複雜的執行流程,但仍然會給想參與開發並且使用自己外掛的貢獻者提供一個相對簡單的 API。WiFi 外掛還可以進一步地劃分為三類,其中每個對應一個核心 WiFi 通訊模組。
每個核心模組都有一些特定事件能觸發響應的外掛的執行。舉個例子,AirScanner 有三個已定義的事件,可以對其響應進行程式設計處理。事件通常對應於服務開始執行之前的設定階段、服務正在執行時的中間執行階段、服務完成後的解除安裝或清理階段。因為 Python 允許多重繼承,所以一個外掛可以繼承多個外掛類。
上面的圖 1 是框架架構的摘要。從 ConfigurationManager 指出的箭頭意味著模組會從中讀取資訊,指向它的箭頭意味著模組會寫入/修改設定。
ETF 可以通過多種方式對 WiFi 的網路安全或者終端使用者的 WiFi 安全意識進行滲透測試。下面的例子描述了這個框架的一些滲透測試功能,例如接入點和用戶端檢測、對使用 WPA 和 WEP 型別協定的接入點進行攻擊,和建立 evil twin 接入點。
這些例子是使用 ETF 和允許進行 WiFi 資料捕獲的 WiFi 卡設計的。它們也在 ETF 設定命令中使用了下面這些縮寫:
在實際的測試場景中,確保你使用了正確的資訊來替換這些縮寫。
這個場景(圖 2)做了兩個方面的考慮:解除認證攻擊和捕獲 WPA 四次握手封包的可能性。這個場景從一個啟用了 WPA/WPA2 的接入點開始,這個接入點有一個已經連上的用戶端裝置(在本例中是一台智慧手機)。目的是通過常規的解除認證攻擊(LCTT 譯註:類似於 DoS 攻擊)來讓用戶端斷開和 WiFi 的網路,然後在用戶端嘗試重連的時候捕獲 WPA 的握手包。重連會在斷開連線後馬上手動完成。
圖 2:在解除認證攻擊後捕獲 WPA 握手包的場景
在這個例子中需要考慮的是 ETF 的可靠性。目的是確認工具是否一直都能捕獲 WPA 的握手封包。每個工具都會用來多次復現這個場景,以此來檢查它們在捕獲 WPA 握手封包時的可靠性。
使用 ETF 來捕獲 WPA 握手封包的方法不止一種。一種方法是使用 AirScanner 和 AirInjector 兩個模組的組合;另一種方法是只使用 AirInjector。下面這個場景是使用了兩個模組的組合。
ETF 啟用了 AirScanner 模組並分析 IEEE 802.11 資料框來發現 WPA 握手包。然後 AirInjecto 就可以使用解除認證攻擊來強制用戶端斷開連線,以進行重連。必須在 ETF 上執行下面這些步驟才能完成上面的目標:
config airscanner
config airscanner
set fixed_sniffing_channel = <APC>
start airscanner with credentialsniffer
add aps where ssid = <APS>
start airinjector
這些簡單的命令設定能讓 ETF 在每次測試時執行成功且有效的解除認證攻擊。ETF 也能在每次測試的時候捕獲 WPA 的握手封包。下面的程式碼能讓我們看到 ETF 成功的執行情況。
███████╗████████╗███████╗██╔════╝╚══██╔══╝██╔════╝█████╗ ██║ █████╗ ██╔══╝ ██║ ██╔══╝ ███████╗ ██║ ██║ ╚══════╝ ╚═╝ ╚═╝ [+] 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 airscannerETF[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 witharpreplayer 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 11ETF[etf/aircommunicator/airscanner]::> add aps where ssid = CrackWPAETF[etf/aircommunicator/airscanner]::> start airinjectorETF[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'
下面這個場景(圖 3)將關注地址解析協定(ARP)重放攻擊的效率和捕獲包含初始化向量(IVs)的 WEP 封包的速度。相同的網路可能需要破解不同數量的捕獲的 IVs,所以這個場景的 IVs 上限是 50000。如果這個網路在首次測試期間,還未捕獲到 50000 IVs 就崩潰了,那麼實際捕獲到的 IVs 數量會成為這個網路在接下來的測試里的新的上限。我們使用 aircrack-ng
對封包進行破解。
測試場景從一個使用 WEP 協定進行加密的 WiFi 接入點和一台知道其金鑰的離線用戶端裝置開始 —— 為了測試方便,金鑰使用了 12345,但它可以是更長且更複雜的金鑰。一旦用戶端連線到了 WEP 接入點,它會傳送一個不必要的 ARP 封包;這是要捕獲和重放的封包。一旦被捕獲的包含 IVs 的封包數量達到了設定的上限,測試就結束了。
圖 3:在進行解除認證攻擊後捕獲 WPA 握手包的場景
ETF 使用 Python 的 Scapy 庫來進行包嗅探和包注入。為了最大限度地解決 Scapy 裡的已知的效能問題,ETF 微調了一些低階庫,來大大加快包注入的速度。對於這個特定的場景,ETF 為了更有效率地嗅探,使用了 tcpdump
作為後台進程而不是 Scapy,Scapy 用於識別加密的 ARP 封包。
這個場景需要在 ETF 上執行下面這些命令和操作:
config airscanner
set hop_channels = false
set fixed_sniffing_channel = <APC>
config arpreplayer
set target_ap_bssid <APB>
start airscanner with arpreplayer
在執行完這些命令後,ETF 會正確地識別加密的 ARP 封包,然後成功執行 ARP 重放攻擊,以此破壞這個網路。
圖 4 中的場景使用相同的 SSID 建立了多個接入點,對於那些可以探測到但是無法接入的 WiFi 網路,這個技術可以發現網路的加密型別。通過啟動具有所有安全設定的多個接入點,用戶端會自動連線和本地快取的接入點資訊相匹配的接入點。
圖 4:在解除認證攻擊後捕獲 WPA 握手包資料。
使用 ETF,可以去設定 hostapd
組態檔,然後在後台啟動該程式。hostapd
支援在一張無線網絡卡上通過設定虛擬介面開啟多個接入點,並且因為它支援所有型別的安全設定,因此可以設定完整的全能蜜罐。對於使用 WEP 和 WPA(2)-PSK 的網路,使用預設密碼,和對於使用 WPA(2)-EAP 的網路,設定“全部接受”策略。
對於這個場景,必須在 ETF 上執行下面的命令和操作:
config aplauncher
set ssid = <APS>
set catch_all_honeypot = true
start airhost
使用這些命令,ETF 可以啟動一個包含所有型別安全設定的完整全能蜜罐。ETF 同樣能自動啟動 DHCP 和 DNS 伺服器,從而讓用戶端能與網際網路保持連線。ETF 提供了一個更好、更快、更完整的解決方案來建立全能蜜罐。下面的程式碼能夠看到 ETF 的成功執行。
███████╗████████╗███████╗██╔════╝╚══██╔══╝██╔════╝█████╗ ██║ █████╗ ██╔══╝ ██║ ██╔══╝ ███████╗ ██║ ██║ ╚══════╝ ╚═╝ ╚═╝ [+] 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 aplauncherETF[etf/aircommunicator/airhost/aplauncher]::> setconf ssid CatchMessid = CatchMeETF[etf/aircommunicator/airhost/aplauncher]::> setconf catch_all_honeypot truecatch_all_honeypot = trueETF[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
這些場景使用常見和眾所周知的攻擊方式來幫助驗證 ETF 測試 WIFI 網路和用戶端的能力。這個結果同樣證明了該框架的架構能在平台現有功能的優勢上開發新的攻擊向量和功能。這會加快新的 WiFi 滲透測試工具的開發,因為很多的程式碼已經寫好了。除此之外,將 WiFi 技術相關的東西都整合到一個單獨的工具裡,會使 WiFi 滲透測試更加簡單高效。
ETF 的目標不是取代現有的工具,而是為它們提供補充,並為安全審計人員在進行 WiFi 滲透測試和提升使用者安全意識時,提供一個更好的選擇。
ETF 是 GitHub 上的一個開源專案,歡迎社群為它的開發做出貢獻。下面是一些您可以提供幫助的方法。
當前 WiFi 滲透測試的一個限制是無法在測試期間記錄重要的事件。這使得報告已經識別到的漏洞更加困難且準確性更低。這個框架可以實現一個記錄器,每個類都可以來存取它並建立一個滲透測試對談報告。
ETF 工具的功能涵蓋了 WiFi 滲透測試的方方面面。一方面,它讓 WiFi 目標偵察、漏洞挖掘和攻擊這些階段變得更加容易。另一方面,它沒有提供一個便於提交報告的功能。增加了對談的概念和對談報告的功能,比如在一個對談期間記錄重要的事件,會極大地增加這個工具對於真實滲透測試場景的價值。
另一個有價值的貢獻是擴充套件該框架來促進 WiFi 模糊測試。IEEE 802.11 協定非常的複雜,考慮到它在用戶端和接入點兩方面都會有多種實現方式。可以假設這些實現都包含 bug 甚至是安全漏洞。這些 bug 可以通過對 IEEE 802.11 協定的資料框進行模糊測試來進行發現。因為 Scapy 允許自定義的封包建立和封包注入,可以通過它實現一個模糊測試器。