越來越多的裝置透過無線傳輸的方式連線到網際網路,以及,大範圍可用的 WiFi 接入點為攻擊者攻擊使用者提供了很多機會。透過欺騙使用者連線到虛假的 WiFi 接入點[1],攻擊者可以完全控制使用者的網路連線,這將使得攻擊者可以嗅探和篡改使用者的資料包,將使用者的連線重定向到一個惡意的網站,並透過網路發起其他的攻擊。
為了保護使用者並告訴他們如何避免線上的危險操作,安全審計人員和安全研究員必須評估使用者的安全實踐能力,使用者常常在沒有確認該 WiFi 接入點為安全的情況下就連線上了該網路,安全審計人員和研究員需要去瞭解這背後的原因。有很多工具都可以對 WiFi 的安全性進行審計,但是沒有一款工具可以測試大量不同的攻擊場景,也沒有能和其他工具整合得很好的工具。
Evil-Twin Framework(ETF)用於解決 WiFi 審計過程中的這些問題。審計者能夠使用 ETF 來整合多種工具並測試該 WiFi 在不同場景下的安全性。本文會介紹 ETF 的框架和功能,然後會提供一些案例來說明該如何使用這款工具。
ETF 的架構
ETF 的框架是用 Python[2] 寫的,因為這門開發語言的程式碼非常易讀,也方便其他開發者向這個專案貢獻程式碼。除此之外,很多 ETF 的庫,比如 Scapy[3],都是為 Python 開發的,很容易就能將它們用於 ETF。
ETF 的架構(圖 1)分為不同的彼此互動的模組。該框架的設定都寫在一個單獨的配置檔案裡。使用者可以透過 ConfigurationManager
類裡的使用者介面來驗證並修改這些配置。其他模組只能讀取這些設定並根據這些設定進行執行。
圖 1:Evil-Twin 的框架架構
ETF 支援多種與框架互動的使用者介面,當前的預設介面是一個互動式控制檯介面,類似於 Metasploit[4] 那種。正在開發用於桌面/瀏覽器使用的圖形使用者介面(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 的例子
ETF 可以透過多種方式對 WiFi 的網路安全或者終端使用者的 WiFi 安全意識進行滲透測試。下麵的例子描述了這個框架的一些滲透測試功能,例如接入點和客戶端檢測、對使用 WPA 和 WEP 型別協議的接入點進行攻擊,和建立 evil twin 接入點。
這些例子是使用 ETF 和允許進行 WiFi 資料捕獲的 WiFi 卡設計的。它們也在 ETF 設定命令中使用了下麵這些縮寫:
在實際的測試場景中,確保你使用了正確的資訊來替換這些縮寫。
在解除認證攻擊後捕獲 WPA 四次握手的資料包。
這個場景(圖 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 =
start airscanner with credentialsniffer
add aps where ssid =
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 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 無線網路
下麵這個場景(圖 3)將關註地址解析協議[5](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 =
config arpreplayer
set target_ap_bssid
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 =
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 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
結論和以後的工作
這些場景使用常見和眾所周知的攻擊方式來幫助驗證 ETF 測試 WIFI 網路和客戶端的能力。這個結果同樣證明瞭該框架的架構能在平臺現有功能的優勢上開發新的攻擊向量和功能。這會加快新的 WiFi 滲透測試工具的開發,因為很多的程式碼已經寫好了。除此之外,將 WiFi 技術相關的東西都整合到一個單獨的工具裡,會使 WiFi 滲透測試更加簡單高效。
ETF 的標的不是取代現有的工具,而是為它們提供補充,併為安全審計人員在進行 WiFi 滲透測試和提升使用者安全意識時,提供一個更好的選擇。
ETF 是 GitHub[6] 上的一個開源專案,歡迎社群為它的開發做出貢獻。下麵是一些您可以提供幫助的方法。
當前 WiFi 滲透測試的一個限制是無法在測試期間記錄重要的事件。這使得報告已經識別到的漏洞更加困難且準確性更低。這個框架可以實現一個記錄器,每個類都可以來訪問它並建立一個滲透測試會話報告。
ETF 工具的功能涵蓋了 WiFi 滲透測試的方方面面。一方面,它讓 WiFi 標的偵察、漏洞挖掘和攻擊這些階段變得更加容易。另一方面,它沒有提供一個便於提交報告的功能。增加了會話的概念和會話報告的功能,比如在一個會話期間記錄重要的事件,會極大地增加這個工具對於真實滲透測試場景的價值。
另一個有價值的貢獻是擴充套件該框架來促進 WiFi 模糊測試。IEEE 802.11 協議非常的複雜,考慮到它在客戶端和接入點兩方面都會有多種實現方式。可以假設這些實現都包含 bug 甚至是安全漏洞。這些 bug 可以透過對 IEEE 802.11 協議的資料幀進行模糊測試來進行發現。因為 Scapy 允許自定義的資料包建立和資料包註入,可以透過它實現一個模糊測試器。
via: https://opensource.com/article/19/1/evil-twin-framework
作者:André Esser[8] 選題:lujun9972 譯者:hopefully2333 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出