瞭解一款用於對 WiFi 接入點安全進行滲透測試的工具。
-- André Esser
越來越多的設備通過無線傳輸的方式連接到互聯網,以及,大範圍可用的 WiFi 接入點為攻擊者攻擊用戶提供了很多機會。通過欺騙用戶連接到 虛假的 WiFi 接入點 ,攻擊者可以完全控制用戶的網絡連接,這將使得攻擊者可以嗅探和篡改用戶的數據包,將用戶的連接重定向到一個惡意的網站,並通過網絡發起其他的攻擊。
為了保護用戶並告訴他們如何避免線上的危險操作,安全審計人員和安全研究員必須評估用戶的安全實踐能力,用戶常常在沒有確認該 WiFi 接入點為安全的情況下就連接上了該網絡,安全審計人員和研究員需要去了解這背後的原因。有很多工具都可以對 WiFi 的安全性進行審計,但是沒有一款工具可以測試大量不同的攻擊場景,也沒有能和其他工具集成得很好的工具。
Evil-Twin Framework(ETF)用於解決 WiFi 審計過程中的這些問題。審計者能夠使用 ETF 來集成多種工具並測試該 WiFi 在不同場景下的安全性。本文會介紹 ETF 的框架和功能,然後會提供一些案例來說明該如何使用這款工具。
ETF 的架構
ETF 的框架是用 Python 寫的,因為這門開發語言的代碼非常易讀,也方便其他開發者向這個項目貢獻代碼。除此之外,很多 ETF 的庫,比如 Scapy ,都是為 Python 開發的,很容易就能將它們用於 ETF。
ETF 的架構(圖 1)分為不同的彼此交互的模塊。該框架的設置都寫在一個單獨的配置文件裡。用戶可以通過 ConfigurationManager 類裡的用戶界面來驗證並修改這些配置。其他模塊只能讀取這些設置並根據這些設置進行運行。
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 的例子
ETF 可以通過多種方式對 WiFi 的網絡安全或者終端用戶的 WiFi 安全意識進行滲透測試。下面的例子描述了這個框架的一些滲透測試功能,例如接入點和客戶端檢測、對使用 WPA 和 WEP 類型協議的接入點進行攻擊,和創建 evil twin 接入點。
這些例子是使用 ETF 和允許進行 WiFi 數據捕獲的 WiFi 卡設計的。它們也在 ETF 設置命令中使用了下面這些縮寫:
- APS Access Point SSID
- APB Access Point BSSID
- APC Access Point Channel
- CM Client MAC address
在實際的測試場景中,確保你使用了正確的信息來替換這些縮寫。
在解除認證攻擊後捕獲 WPA 四次握手的數據包。
這個場景(圖 2)做了兩個方面的考慮: 解除認證攻擊(de-authentication attack)和捕獲 WPA 四次握手數據包的可能性。這個場景從一個啟用了 WPA/WPA2 的接入點開始,這個接入點有一個已經連上的客戶端設備(在本例中是一臺智能手機)。目的是通過常規的解除認證攻擊(LCTT 譯註:類似於 DoS 攻擊)來讓客戶端斷開和 WiFi 的網絡,然後在客戶端嘗試重連的時候捕獲 WPA 的握手包。重連會在斷開連接後馬上手動完成。
在這個例子中需要考慮的是 ETF 的可靠性。目的是確認工具是否一直都能捕獲 WPA 的握手數據包。每個工具都會用來多次復現這個場景,以此來檢查它們在捕獲 WPA 握手數據包時的可靠性。
使用 ETF 來捕獲 WPA 握手數據包的方法不止一種。一種方法是使用 AirScanner 和 AirInjector 兩個模塊的組合;另一種方法是隻使用 AirInjector。下面這個場景是使用了兩個模塊的組合。
ETF 啟用了 AirScanner 模塊並分析 IEEE 802.11 數據幀來發現 WPA 握手包。然後 AirInjecto 就可以使用解除認證攻擊來強制客戶端斷開連接,以進行重連。必須在 ETF 上執行下面這些步驟才能完成上面的目標:
- 進入 AirScanner 配置模式:config airscanner
- 設置 AirScanner 不跳信道:config airscanner
- 設置信道以嗅探經過 WiFi 接入點信道的數據(APC):set fixed_sniffing_channel =
- 使用 CredentialSniffer 插件來啟動 AirScanner 模塊:start airscanner with credentialsniffer
- 從已嗅探的接入點列表中添加目標接入點的 BSSID(APS):add aps where ssid =
- 啟用 AirInjector 模塊,在默認情況下,它會啟用解除認證攻擊: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)將關注 地址解析協議 (ARP)重放攻擊的效率和捕獲包含初始化向量(IVs)的 WEP 數據包的速度。相同的網絡可能需要破解不同數量的捕獲的 IVs,所以這個場景的 IVs 上限是 50000。如果這個網絡在首次測試期間,還未捕獲到 50000 IVs 就崩潰了,那麼實際捕獲到的 IVs 數量會成為這個網絡在接下來的測試裡的新的上限。我們使用 aircrack-ng 對數據包進行破解。
測試場景從一個使用 WEP 協議進行加密的 WiFi 接入點和一臺知道其密鑰的離線客戶端設備開始 —— 為了測試方便,密鑰使用了 12345,但它可以是更長且更復雜的密鑰。一旦客戶端連接到了 WEP 接入點,它會發送一個不必要的 ARP 數據包;這是要捕獲和重放的數據包。一旦被捕獲的包含 IVs 的數據包數量達到了設置的上限,測試就結束了。
ETF 使用 Python 的 Scapy 庫來進行包嗅探和包注入。為了最大限度地解決 Scapy 裡的已知的性能問題,ETF 微調了一些低級庫,來大大加快包注入的速度。對於這個特定的場景,ETF 為了更有效率地嗅探,使用了 tcpdump 作為後臺進程而不是 Scapy,Scapy 用於識別加密的 ARP 數據包。
這個場景需要在 ETF 上執行下面這些命令和操作:
- 進入 AirScanner 設置模式:config airscanner
- 設置 AirScanner 不跳信道:set hop_channels = false
- 設置信道以嗅探經過接入點信道的數據(APC):set fixed_sniffing_channel =
- 進入 ARPReplayer 插件設置模式:config arpreplayer
- 設置 WEP 網絡目標接入點的 BSSID(APB):set target_ap_bssid
- 使用 ARPReplayer 插件啟動 AirScanner 模塊:start airscanner with arpreplayer
在執行完這些命令後,ETF 會正確地識別加密的 ARP 數據包,然後成功執行 ARP 重放攻擊,以此破壞這個網絡。
使用一款全能型蜜罐
圖 4 中的場景使用相同的 SSID 創建了多個接入點,對於那些可以探測到但是無法接入的 WiFi 網絡,這個技術可以發現網絡的加密類型。通過啟動具有所有安全設置的多個接入點,客戶端會自動連接和本地緩存的接入點信息相匹配的接入點。
使用 ETF,可以去設置 hostapd 配置文件,然後在後臺啟動該程序。hostapd 支持在一張無線網卡上通過設置虛擬接口開啟多個接入點,並且因為它支持所有類型的安全設置,因此可以設置完整的全能蜜罐。對於使用 WEP 和 WPA(2)-PSK 的網絡,使用默認密碼,和對於使用 WPA(2)-EAP 的網絡,配置“全部接受”策略。
對於這個場景,必須在 ETF 上執行下面的命令和操作:
- 進入 APLauncher 設置模式:config aplauncher
- 設置目標接入點的 SSID(APS):set ssid =
- 設置 APLauncher 為全部接收的蜜罐:set catch_all_honeypot = true
- 啟動 AirHost 模塊: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 上的一個開源項目,歡迎社區為它的開發做出貢獻。下面是一些您可以提供幫助的方法。
當前 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 選題: lujun9972 譯者: hopefully2333 校對: wxy
本文由 LCTT 原創編譯, Linux中國 榮譽推出
閱讀更多 Linux技術 的文章