Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
macstealer — MacStealer:Wi-Fi 客户端隔离绕过 | Kitploit
工具/GitHubGitHub/vanhoefm/macstealer
Wi-Fi审计漏洞分析漏洞利用信息收集网络安全无线安全渗透测试红队
GitHubvanhoefm/macstealer

macstealer

MacStealer:Wi-Fi 客户端隔离绕过

查看仓库
55260259个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
网站

MacStealer:Wi-Fi 客户端隔离绕过

1. 引言

本仓库包含 MacStealer。它可以测试 Wi-Fi 网络是否存在客户端隔离绕过漏洞 (CVE-2022-47522)。我们的攻击可以在 MAC 层拦截(窃取)发往其他客户端的流量, 即使客户端之间被禁止互相通信。该漏洞影响存在恶意内部人员的 Wi-Fi 网络,我们的攻击可以绕过客户端隔离(有时也称为 AP 隔离)。该攻击还可用于绕过动态 ARP 检测(DAI),并且很可能还可以绕过其他阻止客户端相互攻击的方法。该攻击也被称为 安全上下文覆盖攻击,参见我们 USENIX Security '23 论文 的第 5 节(仓库)。

受影响的网络的具体示例包括:

  • 用户之间可能互不信任的企业网络,这些网络使用客户端隔离或 ARP 检测等技术来防止用户相互攻击。例如,同时为访客和员工提供账户的公司网络,以及 eduroam 和 govroam 等网络。

  • 受 Passpoint(原 Hotspot 2.0)保护的公共热点。这些热点可以让你自动、安全地连接。例如,它可以使用你手机的 SIM 卡无缝认证你的身份。

  • 启用了客户端隔离的家庭 WPA2 或 WPA3 网络。这包括为访客或不安全的(IoT)设备提供独立 SSID 的网络。还包括使用多个密码以进一步隔离设备的网络,这被称为 Multi-PSK、Identity PSK、per-station PSK 或 EasyPSK。更多信息请参阅 威胁模型讨论。

  • 基于 WPA3 SAE-PK 的公共热点。这些热点受共享公共密码保护,但攻击者无法利用这个公开已知的密码。

我们强调,我们的攻击无法绕过 VLAN。换句话说,根据目前的实验,我们的攻击无法用来攻击另一个 VLAN 中的设备。

我们还提供了 USENIX Security '23 中其他结果的仓库。

2. 漏洞详细信息

该攻击的核心思想在于,客户端认证的方式与数据包如何路由到正确的 Wi-Fi 客户端之间没有关联。也就是说,认证是基于密码、用户名、802.1X 身份和/或证书完成的,但一旦客户端连接成功,数据包的路由则基于 MAC 地址进行。恶意内部人员可以滥用这一点,通过断开受害者连接,然后使用攻击者自己的凭据以受害者的 MAC 地址连接来拦截发往该 Wi-Fi 客户端的数据。任何仍在发往受害者途中的数据包,例如受害者仍在加载的网站数据,现在将由攻击者收到,而不是受害者。

更准确地说,该攻击由三个步骤组成:

  1. 让受害者请求数据:攻击者首先等待受害者(客户端)与易受攻击的接入点(AP)建立 Wi-Fi 连接。我们假设受害者随后会向互联网上的服务器发送请求。例如,受害者可能向(明文)网站 example.com 发送 HTTP 请求。攻击者的目标是拦截该网站将要发送的响应。

  2. 以受害者的 MAC 地址连接:在受害者请求数据之后(例如通过发送 HTTP 请求数据包),攻击者将在响应到达易受攻击的 AP 之前 强制断开受害者与网络的连接。在我们的例子中,这意味着在 example.com 的响应到达 AP 之前,受害者就会被断开。一旦受害者断开连接,攻击者便伪造受害者的 MAC 地址,并使用自己的凭据连接到网络。这意味着攻击者是一个恶意内部人员,可以使用自己的凭据连接网络,例如在企业 Wi-Fi 网络中使用自己的用户名和密码。

  3. 拦截响应:一旦攻击者以受害者的 MAC 地址连接,AP 会将攻击者新生成的加密密钥与受害者的 MAC 地址关联起来。因此,当服务器的响应到达 Wi-Fi 网络时,或者通常任何发往受害者的入站流量到达时,路由器都会将这些入站数据包转发到受害者的 MAC 地址。在我们的例子中,这意味着 example.com 的响应被路由器转发到受害者的 MAC 地址。然而,攻击者现在正在使用这个 MAC 地址。这意味着 AP 将使用攻击者的密钥对响应进行加密。换句话说,攻击者现在将收到任何仍在发往受害者途中的待处理流量。

我们强调,被拦截的流量可能受到更高层加密的保护,例如 TLS 和 HTTPS。然而,即使使用了更高层加密,我们的攻击仍然会暴露受害者正在通信的 IP 地址。这反过来又会暴露受害者正在访问的网站,而这些网站本身可能就是敏感信息。

默认情况下,该攻击不会拦截受害者_发送的_流量,而只能拦截_发往受害者的_流量。然而,攻击者可以尝试后续攻击,以拦截受害者发送的流量。特别是,通过拦截发往受害者的 DNS 应答,攻击者可以伪造 DNS 应答,并同时拦截发往受害者以及受害者发送的所有 IP 流量。

只有在目标网络启用了客户端隔离时,上述攻击才有意义。否则,如果客户端隔离被禁用,恶意内部人员只需使用 ARP 欺骗 等技术直接攻击其他客户端即可(参见 客户端隔离测试)。

该攻击对企业 WPA1、WPA2 和 WPA3 网络均同样适用。这是因为该攻击并不利用 Wi-Fi 的任何加密特性,而是滥用网络确定数据包应发送(即路由到)哪个客户端的方式。

有关该攻击的更多详细信息,请参阅我们论文 Framing Frames: Bypassing Wi-Fi Encryption by Manipulating Transmit Queues 中的_安全上下文覆盖攻击_(第 5 节)。

3. 可能的缓解措施

3.1. 防止 MAC 地址窃取

为了缓解我们的攻击,AP 可以临时阻止客户端连接到网络,如果它们使用的 MAC 地址是最近连接过该 AP 的地址。这样可以防止攻击者伪造 MAC 地址并拦截发往受害者的待处理或排队帧。当可以保证某个 MAC 地址背后的用户没有变化时,可以允许客户端立即重新连接。请注意,此检查必须在属于同一分布式系统的所有 AP 上进行,更具体地说,是在客户端可以在保持当前 IP 地址的同时漫游到的所有 AP 上进行。

3.1.1. 使用共享口令时

为了安全地识别最近连接过的用户,AP 可以存储客户端 MAC 地址与其缓存的安全关联(例如缓存的 PMK)之间的映射。可以通过证明客户端拥有与该 MAC 地址关联的缓存安全关联(例如,使用正确的缓存 PMK 进行连接),来允许客户端在最近使用过的 MAC 地址下立即(重新)连接。

使用 multi-PSK(也称为 per-station PSK 或 Identity PSK)时,AP 可以维护最近连接过的 MAC 地址及其使用的(唯一)密码的映射。当客户端连接时,AP 会检查其 MAC 地址是否最近被使用过。如果没有,或者如果使用过但客户端使用与之前相同的密码,客户端可以正常连接。但是,如果同一个 MAC 地址使用了不同的密码,客户端必须等待预定的时间后才能成功连接。

在使用 SAE-PK 保护热点时,我们知道的唯一能安全识别 MAC 地址被同一用户再次使用的方法,是依赖缓存的安全关联(例如与该 MAC 地址关联的缓存 PMK)。

上述防御措施假设,在一定的延迟之后,不再有发往受害者的待处理数据包到达。为了防止在超过此延迟后发生泄露,客户端可以对它们通信的服务使用端到端加密(例如 TLS)。

3.1.1. 使用 802.1X 认证和 RADIUS 扩展时

在使用基于 802.1X EAP 的认证时,另一种更安全的识别最近连接用户的方法是使用客户端在 802.1X 认证期间使用的 EAP 身份。AP 可以安全地从认证客户端的 RADIUS 服务器学习 EAP 身份,并维护最近连接的 MAC 地址与其对应 EAP 身份的映射。当客户端连接时,AP 会检查其 MAC 地址是否最近被使用过。如果没有,或者如果使用过且客户端使用与之前相同的 EAP 身份,客户端可以正常连接。但是,如果同一个 MAC 地址使用了不同的 EAP 身份,客户端必须等待预定的时间后才能成功连接。

一个挑战是,出于隐私方面的考虑,AP 可能并不总是知道客户端的 802.1X 身份。例如,该信息可能只在归属 AAA 服务器上可用,而 AP 只会从 RADIUS 服务器收到一个计费用户身份。该身份不允许 AP 识别同一设备/凭据的两次关联,因为其值可能会不断变化。AP 确实会在 EAP-Response/Identity 中收到匿名身份,例如 anonymous@realm,并且可以依靠该身份至少识别来自不同领域的用户。

为了防止同一领域内的用户相互攻击,同时不向 AP 泄露客户端身份,需要与 RADIUS 服务器进行配合并对其进行更改。具体来说,可以更新 RADIUS 服务器,以帮助检测该 MAC 地址最近是否被同一领域(在给定的本地网络中)的另一个用户使用。然后,RADIUS 服务器需要被告知客户端何时断开连接,以便了解某个 MAC 地址最后一次被其某个用户使用是什么时候,并且需要被告知任何正在尝试连接的客户端的 MAC 地址。

最后需要说明的是,虽然这种依赖 EAP 身份的方法可以防止不同用户相互攻击,但无法防止某个已被入侵的设备攻击该同一用户的另一台设备。也就是说,攻击只能在不同用户之间被阻止,而不能在同一用户的不同设备之间被阻止。

3.2. 保护网关的 MAC 地址

需要注意的是,我们的攻击不仅限于拦截发往 Wi-Fi 客户端的数据包。攻击者还可以尝试使用默认网关或本地网络中其他服务器的 MAC 地址进行关联。为了防止此类攻击,AP 或控制器可以禁止客户端使用与默认网关相同的 MAC 地址。更一般地说,可以在 Wi-Fi 客户端连接网络时使用重复 MAC 地址检测,以防止 Wi-Fi 客户端使用网络中其他设备正在使用的 MAC 地址。

3.3. 管理帧保护(802.11w)

使用管理帧保护(MFP)会使攻击更难执行,但并非不可能。在之前的工作中,我们发现了即使在使用 MFP 的情况下也能断开/去认证客户端的一些方法。基于这些经验,即使使用 MFP,似乎总会有某种方法可以强制将客户端与网络断开。换句话说,要完全防止断开连接和去认证攻击是很困难的。话虽如此,MFP 会在实际执行攻击时带来额外的障碍,因此它可以成为有用的缓解措施,使攻击在实际中更难(但并非不可能)执行。

3.4. VLAN 的使用

根据初步实验,该攻击无法跨不同的 VLAN 生效。换句话说,执行攻击的恶意内部人员必须与受害者处于同一 VLAN 中。因此,一种缓解措施是将不同的用户组放入不同的 VLAN。然而,恶意内部人员仍然能够对同一 VLAN 中的其他用户发起攻击(即绕过客户端隔离)。

请注意,使用 multi-PSK(又名 per-station PSK 或 identity PSK)时,你可以根据客户端使用的密码将其放入不同的 VLAN。换句话说,你可以为每个密码使用一个 VLAN。这样可以防止使用不同密码的客户端相互攻击。

4. 工具前提条件

MacStealer 工具适用于 Linux 支持的任何网卡。我们在 Ubuntu 22.04 上测试了 MacStealer。要在 Ubuntu 22.04 上安装所需的依赖项,请执行:

sudo apt update
sudo apt install libnl-3-dev libnl-genl-3-dev libnl-route-3-dev libssl-dev \
	libdbus-1-dev git pkg-config build-essential net-tools python3-venv \
	aircrack-ng rfkill

现在克隆此仓库,构建工具,并配置虚拟 python3 环境:

git clone https://github.com/vanhoefm/macstealer.git macstealer
cd macstealer/research
./build.sh
./pysetup.sh

上述说明只需执行一次。

使用 git 拉取新代码后,你需要再次执行 ./build.sh 和 ./pysetup.sh。有关自协调披露开始以来对 MacStealer 的更新的详细概述,请参阅 变更日志。

5. 每次使用前

5.1 执行环境

每次你想使用 MacStealer 时,首先必须以 root 身份加载虚拟 python3 环境。可以使用以下命令:

cd research
sudo su
source venv/bin/activate

你现在应该在网络管理器中禁用 Wi-Fi,以免它与 MacStealer 发生冲突。也可以使用 sudo airmon-ng check 来检查哪些其他进程可能正在使用无线网卡并可能干扰 MacStealer。

5.2. 网络配置

下一步是编辑 client.conf,填入你要测试的网络的信息。这是 wpa_supplicant 的配置文件,必须包含两个网络块:一个代表受害者,一个代表攻击者。用于测试虚构网络 kuleuven 的示例配置文件如下:

# Don't change this line, other MacStealer won't work
ctrl_interface=wpaspy_ctrl

network={
	# Don't change this field, the script relies on it
	id_str="victim"

	# Network to test: fill in properties of the network to test
	ssid="kuleuven"
	key_mgmt=WPA-EAP
	eap=PEAP
	phase2="auth=MSCHAPV2"

	# Victim login: fill in login credentials representing the victim
	identity="[email protected]"
	password="SuperSecret"
}

network={
	# Don't change this field, the script relies on it
	id_str="attacker"
下载工具