神兵利器 - 针对WPA2的KRACK攻击

2021-03-10 12:07:07 浏览数 (1)

vanhoefm

用于测试客户端或接入点(AP)是否受到针对WPA2的KRACK攻击的影响。

我们的脚本在Kali Linux上进行了测试。要在Kali上安装所需的依赖项:

代码语言:javascript复制
sudo apt update
sudo apt install libnl-3-dev libnl-genl-3-dev pkg-config libssl-dev net-tools git sysfsutils virtualenv

然后禁用硬件加密:

代码语言:javascript复制
cd krackattack
sudo ./disable-hwcrypto.sh

如果需要的话,以后可以使用脚本sudo ./reenable-hwcrypto.sh重新启用硬件加密。建议在禁用硬件加密后重新启动。我们用Intel双频无线-AC 7260和TP-Link TL-WN722N v1在Kali Linux上测试了我们的脚本。

现在编译我们修改后的hostapd

代码语言:javascript复制
cd krackattack
./build.sh

最后,为了保证你使用的是兼容的python库,创建一个virtualenv,其依赖关系列在krackattack/requirements.txt

代码语言:javascript复制
cd krackattack
./pysetup.sh

每次在使用脚本之前,你必须在网络管理器中禁用Wi-Fi再执行

代码语言:javascript复制
sudo rfkill unblock wifi
cd krackattack
sudo su
source venv/bin/activate

做完这些后,只要不关闭终端,就可以多次执行脚本。

测试客户端

首先修改hostapd/hostapd.conf,并编辑interface=行,指定用于执行测试的Wi-Fi接口。注意,对于所有的测试,一旦脚本运行,必须让被测试的设备使用密码abcdefgh连接到SSID testnetwork。你可以通过修改hostapd/hostapd.conf来改变AP的设置。在所有的测试中,客户端必须在连接到Wi-Fi网络后使用DHCP获取IP。这是因为有些测试是在客户端使用DHCP请求IP后才开始的。

现在你应该运行位于krackattacks/目录下的以下测试:

  1. ./krack-test-client.py --replay-broadcast 这将测试客户端是否接受重播广播帧。如果客户端接受重播广播帧,必须先打上补丁。如果你没有给客户端打补丁,我们的脚本将无法确定组密钥是否正在被重新安装(因为这样脚本将总是说组密钥正在被重新安装)
  2. ./krack-test-client.py --group --gtkinit 这将测试客户端是否在与给定的接收序列计数器(RSC)的组密钥握手中安装组密钥。
  3. ./krack-test-client.py --group 这将测试客户端是否在组密钥握手中重新安装组密钥。换句话说,它测试客户端是否对CVE-2017-13080存在漏洞。该脚本通过使用一个已经使用(重放)的包号(这里的包号=nonce=IV)向客户端发送广播ARP请求来测试是否重装组密钥。请注意,如果客户端总是接受重放的广播帧(参见--replay-broadcast),这个测试可能会错误地得出组密钥正在被重新安装的结论。
  4. ./krack-test-client.py 通过向客户端重复发送加密消息3来测试4路握手中的密钥重装。换句话说,这个测试针对CVE-2017-13077(影响最大的漏洞)和CVE-2017-13078 。该脚本监控客户端发送的流量,以查看是否重新安装了配对密钥。请注意,这有效地执行了两个测试:是否重新安装了配对密钥,以及是否重新安装了组密钥。确保客户端使用DHCP请求一个IP,以便开始组密钥重装测试。为了保证客户端发送足够的单播帧,你可以选择性地ping一下AP:ping 192.168.100.254.
  5. ./krack-test-client.py --tptk 与测试4相同,只是在发送加密消息3之前注入了伪造的消息1。这个测试的变体是很重要的,因为一些客户端(例如wpa_supplicant v2.6)只有在发送重传信息3之前注入伪造信息1时,才会在4路握手中受到配对密钥重装的影响。
  6. ./krack-test-client.py --tptk-rand 与上面的测试相同,只是伪造的消息1中包含了一个随机的ANonce./krack-test-client.py --tptk-rand.
  7. ./krack-test-client.py --gtkinit 该脚本测试客户端是否在4路握手中用给定的接收序列计数器(RSC)安装组密钥。脚本会不断执行新的4路握手来测试这一点。不幸的是,这个测试可能相当不可靠,因为任何遗漏的握手消息都会导致同步问题,使测试不可靠。你应该只在背景噪音小的环境中执行这个测试,并且要执行多次。

一些补充说明

  • 最重要的测试是./krack -test -client, 它可以测试普通的密钥重新安装在4路握手中。
  • 在干扰小的房间里执行这些测试。大量的数据包丢失会使这个脚本的可靠性降低!
  • 你也可以手动检查网络流量来确认脚本的输出(一些Wi-Fi网卡可能会干扰我们的脚本)
    • ‍‍在监控模式下使用额外的Wi-Fi NIC,以符合我们的脚本(AP)使用正确的数据包号(IV)发送帧。特别是,检查重放的广播帧是否确实使用已经使用的包号(IV)发送。
    • 在监控模式下使用额外的 Wi-Fi NIC,通过监控客户端发送的帧的 IV 来检查配对密钥重装情况。
    • 捕获客户端上的流量,查看重播广播ARP请求是否被接受。
  • 如果客户端可以使用多个 Wi-Fi 无线电/NIC,请使用多个 Wi-Fi NIC 进行测试。
  • 你可以添加--debug参数来获得更多的调试输出。
  • 所有未识别的参数都会被传递给 hostapd,所以你可以加入类似 -dd -K 这样的参数来让 hostapd 输出所有调试信息。

测试接入点:检测脆弱的FT握手(802.11r)

1.创建一个可以用于连接网络的wpa_supplicant配置文件。一个基本的例子是

代码语言:javascript复制
ctrl_interface=/var/run/wpa_supplicant
 network={
   ssid="testnet"
   key_mgmt=FT-PSK
   psk="password"
 }

2.注意使用 "FT-PSK"。将其保存为network.conf或类似的文件。更多信息请参见wpa_supplicant.conf。

尝试使用你的平台的wpa_supplicant连接到网络。这可能需要一个命令,如

代码语言:javascript复制
 sudo wpa_supplicant -D nl80211 -i wlan0 -c network.conf.

如果失败,要么是AP不支持FT,要么是你在步骤1中提供了错误的网络配置选项。请注意,如果AP不支持FT,则不受此漏洞影响。

3.使用这个脚本作为之前wpa_supplicant命令的包装:

代码语言:javascript复制
 sudo ./krack-ft-test.py wpa_supplicant -D nl80211 -i wlan0 -c network.

这将使用提供的参数执行wpa_supplicant命令,并将添加一个虚拟的监控接口来执行攻击测试。

4.使用wpa_cli漫游到同一网络的不同AP

例如:

代码语言:javascript复制
 sudo wpa_cli -i wlan0
 > status
 bssid=c4:e9:84:db:fb:7b
 ssid=testnet
 ...
 > scan_results 
 bssid / frequency / signal level / flags / ssid
 c4:e9:84:db:fb:7b  2412  -21  [WPA2-PSK FT/PSK-CCMP][ESS] testnet
 c4:e9:84:1d:a5:bc  2412  -31  [WPA2-PSK FT/PSK-CCMP][ESS] testnet
 ...
 > roam c4:e9:84:1d:a5:bc
 ...

在这个例子中,我们连接到testnet的AP c4:e9:84:db:fb:7b(见状态命令)。scan_results命令显示这个网络还有第二个AP,MAC为c4:e9:84:1d:a5:bc。我们就漫游到这第二个AP。

5.在AP和客户端之间产生流量比如说

代码语言:javascript复制
 sudo arping -I wlan0 192.168.1.10

6.现在看看./krack-ft-test.py的输出,看看AP是否有漏洞

首先它应该说 "检测到FT重联帧"。然后它会开始重放这个帧来尝试攻击。

脚本显示了AP在发送数据帧时使用了哪些IV(=数据包号)

检测到消息IV重用(IV=X,seq=Y)。AP是脆弱的!意味着我们确认它是脆弱的。

脆弱AP的输出示例

代码语言:javascript复制
 [15:59:24] Replaying Reassociation Request
 [15:59:25] AP transmitted data using IV=1 (seq=0)
 [15:59:25] Replaying Reassociation Request
 [15:59:26] AP transmitted data using IV=1 (seq=0)
 [15:59:26] IV reuse detected (IV=1, seq=0). AP is vulnerable!

打了补丁的AP的输出示例(注意,IV永远不会被重用)

代码语言:javascript复制
[16:00:49] Replaying Reassociation Request
 [16:00:49] AP transmitted data using IV=1 (seq=0)
 [16:00:50] AP transmitted data using IV=2 (seq=1)
 [16:00:50] Replaying Reassociation Request
 [16:00:51] AP transmitted data using IV=3 (seq=2)
 [16:00:51] Replaying Reassociation Request
 [16:00:52] AP transmitted data using IV=4 (seq=3)

项目地址:

https://github.com/vanhoefm/krackattacks-scripts

0 人点赞