1. 项目概述:为什么今天还要关注KRACK?
几年前,当KRACK(密钥重装攻击)漏洞被披露时,整个Wi-Fi安全领域都为之震动。它不像那些需要物理接触或复杂社会工程学的攻击,KRACK直接动摇了我们每天赖以连接互联网的WPA2协议的核心信任基础。时间过去这么久,很多人可能觉得“这已经是老黄历了,我的路由器早就自动更新固件修复了”。但现实情况要复杂得多。
我之所以今天还要花时间详细拆解
krackattacks-scripts
这个工具集,是因为在真实的网络环境中,KRACK的威胁远未消失。首先,不是所有设备厂商都及时、彻底地发布了补丁,尤其是一些物联网设备、老旧的智能家居产品或者一些非主流品牌的网络设备,它们可能永远都不会收到更新。其次,即使打了补丁,补丁的实现是否完整、是否正确,也需要验证。最后,作为安全从业者或网络管理员,理解一种曾影响全球的协议级攻击的原理和检测方法,其价值远超应对单一漏洞本身,它能帮你建立起对无线安全更深层次的认知和排查思路。
krackattacks-scripts
正是由漏洞发现者Mathy Vanhoef教授亲自发布的一套概念验证(PoC)脚本。它不仅仅是一个“攻击工具”,更是一套绝佳的教学材料和检测框架。通过它,你可以亲手复现攻击过程,直观理解四步握手(4-way handshake)中密钥重装(Key Reinstallation)的脆弱性究竟发生在哪里,进而学会如何检测自己的网络或设备是否依然暴露在此风险之下。这对于渗透测试人员、网络安全研究员以及任何负责维护无线网络安全的工程师来说,都是一项必备的实践技能。
2. 核心原理深度拆解:WPA2的四步握手与密钥重装漏洞
要理解KRACK,必须回到WPA2安全连接的建立过程,特别是其中的四步握手。这个握手过程的目标很简单:让客户端(比如你的手机)和接入点(AP,比如你的路由器)协商出一对用于加密后续通信数据的密钥(PTK和GTK)。但这个协商过程,却因为一个设计上的瑕疵,成了攻击的突破口。
2.1 四步握手的标准流程与关键帧
我们用最简单的语言回顾一下这四次“握手”:
- 消息1(AP -> 客户端) :AP发送一个随机数(Anonce)给客户端。
- 消息2(客户端 -> AP) :客户端收到Anonce后,结合自己生成的随机数(Snonce)、双方已知的PMK(由Wi-Fi密码派生),计算出PTK。然后,它将Snonce和一段MIC(消息完整性校验码)发给AP。
- 消息3(AP -> 客户端) :AP收到Snonce后,也能计算出同样的PTK。它验证MIC是否正确。验证通过后,AP发送一个“安装PTK”的指令给客户端,同时附上用于加密组播流量的GTK。
- 消息4(客户端 -> AP) :客户端回复一个确认,表示“PTK和GTK已安装完毕”。至此,握手完成,双方开始用PTK加密单播数据。
问题的核心就出在 消息3 。根据802.11i标准,当客户端收到消息3时,它应该立即安装并使用新的PTK和GTK。但是,标准没有明确规定,如果客户端已经安装了一个密钥,再次收到“安装”指令时该怎么办。
2.2 密钥“重装”漏洞的触发点
攻击者(中间人)是如何利用这一点的呢?攻击的核心是 重放和阻塞 。
- 嗅探与重放 :攻击者首先需要监听到客户端和AP之间的握手过程。当客户端发送消息2后,攻击者会捕获到合法的消息3。
- 阻塞确认帧 :攻击者利用各种技术(比如发送大量的CTS-to-self控制帧)干扰无线信道,阻止客户端的消息4(确认帧)成功送达AP。
- 重放消息3 :由于AP没有收到确认,它会认为消息3丢失了,于是重传这个消息3。标准允许这种重传。此时,攻击者将之前捕获到的那个消息3也重复发送给客户端。
- 触发重装 :客户端先后收到了来自AP的重传消息3和攻击者重放的消息3。每收到一次消息3,客户端都可能执行一次“安装PTK”的操作。这就是 密钥重装 。
为什么重装密钥是灾难性的?因为PTK的推导依赖于一个计数器(Nonce)。当密钥被重装时,这个计数器可能会被重置到一个之前用过的值。在诸如TKIP或CCMP(WPA2使用的两种加密协议)中,重复使用相同的密钥和计数器加密不同的数据,会严重削弱甚至完全破坏加密的安全性,使得攻击者能够解密数据包、注入恶意数据或进行流量分析。
注意 :KRACK不是一个单一的漏洞,而是一类漏洞的统称。它对客户端(Station)和AP的影响方式不同,利用姿势也有差异。
krackattacks-scripts主要针对的是客户端漏洞的检测,因为这是最常见且影响最广的攻击面。
2.3
krackattacks-scripts
的检测逻辑
这套脚本的检测思想非常直接: 模拟一个恶意的AP,主动向被测客户端发起连接并操纵握手过程,尝试触发密钥重装,然后观察客户端的反应或检测加密状态是否被破坏。
它不是一个全自动的“一键漏洞扫描器”,而是一个需要你手动操作、理解每一步在做什么的测试框架。通常,你需要:
-
将一台Linux电脑的无线网卡设置为AP模式(使用
hostapd)。 - 配置脚本,让这个“恶意AP”使用目标客户端支持的某种加密方式(如WPA2-TKIP, WPA2-CCMP等)。
- 让目标客户端连接到这个测试AP。
-
运行对应的Python脚本(例如
krack-test-client.py),该脚本会利用scapy库精细地构造和发送特定的802.11数据帧,在握手的关键节点插入重放或篡改的帧。 - 通过监听网络流量,检查是否观察到了密钥重置的迹象(例如,捕获到的数据包序列号出现异常回滚),或者直接尝试解密流量来验证攻击是否成功。
3. 环境搭建与工具链详解
工欲善其事,必先利其器。用
krackattacks-scripts
进行测试,对测试平台有一定要求。下面是我多次搭建环境后总结的可靠方案。
3.1 硬件与操作系统选择
- 测试机(攻击机) :一台运行Linux的电脑是必须的。 Kali Linux 或 Ubuntu 是最佳选择,因为它们内置了大量无线测试工具和驱动。我个人更倾向于使用Ubuntu 20.04 LTS或更新版本,因为其内核和驱动更新比较及时。
-
无线网卡
:这是
最关键
的部件。不是所有无线网卡都支持所需的“监听模式”(Monitor Mode)和“数据包注入”(Packet Injection)。
- 推荐芯片组 :Atheros AR9271、RTL8812AU/8814AU芯片的网卡在社区中支持最好。例如,经典的 Alfa AWUS036NHA (Atheros)或 Alfa AWUS036ACH (Realtek 8812AU)都是经久不衰的选择。
- 务必避坑 :许多笔记本内置的Intel无线网卡对监听和注入模式支持有限,或者功能不完整,可能导致测试失败。强烈建议使用外置USB网卡。
- 被测设备(DUT) :你需要准备可能存在漏洞的客户端设备,如旧款Android手机(Android 6.0左右版本风险最高)、老旧的物联网设备、或者特定版本的Windows/Linux客户端。
3.2 软件依赖安装
在Ubuntu系统上,打开终端,按顺序执行以下命令来搭建完整环境:
# 1. 更新系统并安装基础编译工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential libssl-dev libnl-3-dev libnl-genl-3-dev pkg-config
# 2. 安装Python3及必要的库(scapy是关键)
sudo apt install -y python3 python3-pip
pip3 install --user scapy
# 3. 安装hostapd(用于创建测试AP)和必要的工具
sudo apt install -y hostapd wpasupplicant wireless-tools iw tcpdump
# 4. 克隆krackattacks-scripts仓库
git clone https://github.com/vanhoefm/krackattacks-scripts.git
cd krackattacks-scripts
3.3 无线网卡模式配置
这是实操中的第一个难点。你需要将外置网卡切换到监听模式,并正确配置信道。
# 查看无线网卡接口名,通常是wlan0或wlx开头
iwconfig
# 假设你的外置网卡是wlx00c0caa5a1a2
sudo ip link set wlx00c0caa5a1a2 down
# 设置监听模式
sudo iwconfig wlx00c0caa5a1a2 mode monitor
# 启动接口
sudo ip link set wlx00c0caa5a1a2 up
# 设置监听信道(需要与后续测试信道一致,例如信道6)
sudo iwconfig wlx00c0caa5a1a2 channel 6
# 验证模式是否切换成功
iwconfig wlx00c0caa5a1a2
# 输出中应包含“Mode:Monitor”
实操心得 :有时直接用
iwconfig设置监听模式会失败,可以尝试用airmon-ng套件(需安装aircrack-ng)。但更常见的问题是驱动。如果你使用的网卡是RTL8812AU,可能需要手动编译安装88xxau驱动才能获得完整的注入功能。这个过程比较繁琐,建议提前在搜索引擎中搜索“你的网卡型号 + monitor mode injection driver linux”来寻找社区解决方案。
4. 核心脚本解析与实战检测流程
krackattacks-scripts
仓库里脚本不少,我们聚焦在最核心的客户端测试脚本
krack-test-client.py
上。理解它的参数和流程,你就掌握了检测的主动权。
4.1 脚本参数深度解读
进入仓库目录,先不着急运行,看看脚本的帮助文档:
cd krackattacks-scripts
python3 krack-test-client.py --help
你会看到一系列参数,几个关键的如下:
-
-i:指定你的无线网卡接口(处于监听模式的那个)。 -
-b:目标客户端的MAC地址。你需要先让客户端连接上你的测试AP,然后用arp-scan或airodump-ng来获取它。 -
-s:测试AP(也就是你用hostapd创建的AP)的MAC地址。这个通常是你的无线网卡在AP模式下的MAC。 -
-c:指定测试的信道。 -
--group:指定组密钥的加密套件(如ccmp),必须与hostapd配置一致。 -
--pairwise:指定成对密钥的加密套件(如ccmp),必须与hostapd配置一致。 -
-t:针对特定漏洞变体进行测试。例如,-t 3会测试“四次握手消息3重传触发PTK重装”这个经典漏洞。
4.2 创建测试AP(hostapd配置)
你需要编写一个
hostapd.conf
配置文件来启动一个“诱饵”AP。以下是一个针对WPA2-CCMP测试的最小配置示例:
# hostapd.conf
interface=wlx00c0caa5a1a2 # 你的网卡接口
ssid=Test-KRACK-Network # 测试网络名称,自己定
channel=6 # 信道,与监听模式设置一致
hw_mode=g
wpa=2 # WPA2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP # 成对密钥加密套件
wpa_group=CCMP # 组密钥加密套件
wpa_passphrase=12345678 # 测试密码
保存后,在另一个终端窗口启动hostapd:
sudo hostapd hostapd.conf
如果一切正常,你应该能在手机的Wi-Fi列表里看到“Test-KRACK-Network”这个网络。
4.3 执行漏洞检测实战
现在,让被测设备(DUT)连接到这个测试网络。连接成功后,按照以下步骤操作:
-
获取MAC地址 :在运行
hostapd的终端或新的终端里,使用arp-scan扫描本地网络来获取已连接客户端的IP和MAC地址。sudo arp-scan -I wlx00c0caa5a1a2 --localnet找到属于你DUT的那个IP和MAC地址,记下客户端的MAC(例如
aa:bb:cc:dd:ee:ff)。 -
运行检测脚本 :在
krackattacks-scripts目录下,运行测试命令。假设你的网卡接口是wlx00c0caa5a1a2,AP的MAC就是该网卡的MAC(用ifconfig查看),客户端MAC是aa:bb:cc:dd:ee:ff,信道是6,测试漏洞变体3。sudo python3 krack-test-client.py -i wlx00c0caa5a1a2 -b aa:bb:cc:dd:ee:ff -s [你的AP_MAC地址] -c 6 --group ccmp --pairwise ccmp -t 3 -
观察与解读输出 :脚本开始运行后,它会尝试建立连接、发起握手,并在关键时刻注入恶意帧。你需要密切关注终端输出。
- 成功迹象 :脚本可能会输出“Replaying message 3...”、“Potential vulnerability detected!”或“Resetting nonce/IV detected in captured packets.”等类似信息。更确凿的证据是,配合Wireshark抓包分析,你会看到数据包的IV(初始化向量)序列出现重置(从大数突然跳回一个小数)。
- 失败迹象 :如果客户端已打补丁,脚本可能会输出“Client did not reinstall the key”、“No vulnerability detected”或连接直接断开。脚本也可能因为环境问题(如驱动注入失败)而报错。
重要注意事项 :这个测试是在你完全控制的实验环境中进行的,目标是 你自己的设备 。未经授权对他人网络或设备进行测试不仅是非法的,也可能扰乱正常的网络服务。务必在隔离的实验室环境(例如法拉第笼或完全独立的房间)中进行所有测试。
5. 检测结果分析与问题排查实录
运行脚本后,你可能会遇到各种情况。下面是我在多次测试中积累的常见问题与解决方案。
5.1 常见输出结果与含义
| 脚本输出/现象 | 可能含义 | 下一步行动 |
|---|---|---|
Injection test failed
| 网卡驱动不支持数据包注入,或功率不足。 | 确认网卡型号和驱动,尝试更换USB端口(使用带供电的USB Hub),或更换网卡。 |
Client disconnected during handshake
| 客户端在握手过程中异常断开。可能是脚本发送的畸形帧触发了客户端的保护机制(说明它可能有防护),也可能是网络不稳定。 | 重复测试几次。如果每次都断开,可能意味着设备对此攻击有抵抗力(已修复)。检查hostapd日志看是否有错误。 |
No vulnerability detected after multiple attempts
| 脚本未检测到密钥重装的证据。 |
这
很可能
意味着该客户端针对所测试的漏洞变体已修复。可以尝试其他变体(如
-t 4
测试组密钥握手)。
|
Wireshark捕获到IV/Nonce重置
| 这是漏洞存在的强证据 。在加密数据流中,序列号出现回退。 | 恭喜(从研究角度),你确认了一个易受攻击的设备。保存抓包文件以备分析。 |
| 脚本卡住或无响应 | 可能遇到了竞争条件或网络状态异常。 | 中断脚本(Ctrl+C),重启hostapd,让客户端重新连接,再试一次。 |
5.2 典型故障排查指南
问题1:网卡无法切换到监听模式,或监听模式下看不到任何流量。
-
排查
:首先用
sudo airmon-ng check kill结束可能干扰的进程。如果不行,检查驱动。对于Realtek芯片,可能需要手动安装并加载88xxau驱动模块,并使用sudo modprobe -r 88xxau && sudo modprobe 88xxau等命令重置。 - 心得 :外置USB网卡的稳定性远高于内置网卡。如果一直失败,考虑换一张社区公认支持度高的网卡(如之前推荐的Alfa系列)。
问题2:客户端能发现测试AP但无法连接,或连接后立即断开。
-
排查
:检查
hostapd.conf配置。确保wpa_pairwise和wpa_group设置正确(CCMP或TKIP)。确认密码无误。查看hostapd终端输出的错误信息,常见的有“无法设置HT”等,可以尝试在配置中增加ieee80211n=0来禁用HT(高速模式)。 - 心得 :有些老旧设备只支持TKIP,而新设备默认用CCMP。确保你的测试AP配置与客户端能力匹配。可以先用一个普通的Wi-Fi连接测试客户端能否正常连接一个标准WPA2网络,排除客户端本身的问题。
问题3:脚本运行但似乎没有触发任何测试行为。
-
排查
:确认你使用的接口(
-i参数)是处于监听模式的接口,而不是AP模式的接口。确认目标客户端MAC(-b参数)和AP的MAC(-s参数)填写正确。最稳妥的方式是,在运行脚本的同时,用Wireshark在监听接口上抓包,过滤目标客户端的MAC地址(wlan.addr == aa:bb:cc:dd:ee:ff),直观地看脚本是否在发送和接收预期的管理帧和数据帧。 - 心得 : 始终结合Wireshark进行分析 。只看脚本输出是片面的。Wireshark能让你看到整个握手过程、脚本注入的帧以及客户端的反应,是诊断问题最强大的工具。
问题4:如何验证攻击真的成功了?
-
高级检测
:仅仅依靠脚本的文本输出可能不够。最确凿的证据是密码学上的。你可以设置一个简单的网络服务(比如在测试机上运行
python3 -m http.server 80),让被测客户端通过测试AP访问它,并传输一些已知数据。同时,用Wireshark抓取加密的802.11数据帧。如果KRACK攻击成功,并且你通过脚本等手段重置了Nonce,你有可能利用捕获到的多个使用相同密钥和Nonce加密的数据包,通过离线工具(如aircrack-ng套件中的工具)尝试解密或验证其脆弱性。但这部分涉及更深的密码学分析,属于高级研究范畴。
6. 从检测到防御:构建健壮的无线安全体系
通过
krackattacks-scripts
进行检测,最终目的是为了加固防御。对于不同角色,行动建议也不同。
对于个人用户:
- 更新一切 :确保你的无线路由器/AP固件、手机、电脑、智能设备操作系统更新到最新版本。这是防御KRACK最根本、最有效的方法。
- 淘汰老旧设备 :对于早已停止安全更新的老旧设备,尤其是智能家居产品,应考虑升级或替换。如果无法替换,尽量将其置于一个独立的、与其他重要设备隔离的网络子网中。
- 考虑WPA3 :如果你的设备和路由器都支持WPA3,请启用它。WPA3的SAE(Simultaneous Authentication of Equals)握手协议从根本上设计了防御KRACK这类重放攻击的机制。
对于企业网络管理员和安全研究员:
-
资产清点与风险评估
:使用像
krackattacks-scripts这样的工具,在可控环境内对关键移动设备(如公司配发的手机、平板)、物联网设备进行抽样检测,评估风险面。 - 网络分段与监控 :对无线网络进行严格分段,将访客网络、物联网设备网络与核心办公网络隔离。部署无线入侵检测系统(WIDS),监控网络中是否存在异常的重传握手帧或IV重置现象。
- 补丁管理 :建立严格的补丁管理流程,不仅关注操作系统,更要关注网络设备固件和嵌入式设备固件的安全更新。
- 安全意识培训 :教育员工不要连接不信任的公共Wi-Fi,因为KRACK攻击在公共热点环境中实施的风险更高。
对于开发者(尤其是物联网和无线驱动开发者):
-
深入研究补丁
:仔细研究各大操作系统(Linux
wpa_supplicant、Windows、iOS)和芯片厂商针对KRACK发布的官方补丁。理解他们是如何通过“仅安装一次密钥”或“使用更严格的Nonce管理”来修复问题的。 - 代码审计 :检查自己的产品中与WPA2握手相关的代码逻辑,确保没有实现上的错误,严格遵循已修复的安全规范。
- 测试常态化 :将无线协议的安全性测试,包括对密钥管理逻辑的模糊测试,纳入开发周期。
在我自己的测试经历中,最深的体会是:安全是一个动态的过程。像KRACK这样的协议级漏洞提醒我们,即使是最基础、最信任的标准也可能存在盲点。
krackattacks-scripts
的价值,不仅在于它能够检测一个特定的历史漏洞,更在于它提供了一种方法论——如何通过主动测试去理解协议、发现异常、验证假设。掌握这套工具和背后的思路,当下一次“KRACK”出现时,你就能更快地理解它、检测它,并保护你的网络免受其害。

7231

被折叠的 条评论
为什么被折叠?



