ESP32/8266 Wi-Fi 漏洞的概念验证(CVE-2019-12586、CVE-2019-12587、CVE-2019-12588)
本仓库是 ASSET 研究组 的研究成果的一部分。

本仓库演示了针对流行的 ESP32/8266 IoT 设备的 3 种 Wi-Fi 攻击:
有关更多详情和乐鑫(Espressif)的补丁,请点击每个漏洞对应的链接。
这些漏洞是在 ESP32 和 ESP8266 的 SDK 中发现的。发现时,它们的版本分别为 ESP-IDF v4.0-dev-459-gba1ff1692 和 NONOS-SDK v3.0-103-g7a31cb7。
虽然提供了一个定制版 hostapd 用于测试前两个漏洞,但对于最后一个漏洞,则是使用一个 ESP8266 来注入伪造的 802.11 信标帧,以使其同类设备崩溃(无意双关!)。
如果你运行的是 Debian 或 Ubuntu,可以直接执行 `hostapd-2.8_binary` 文件夹中已编译好的 hostapd。运行 `hostapd-2.8_binary/run_hostapd_exploit.sh` 即可启动访问点来测试漏洞,或运行 `hostapd-2.8_binary/run_zero_pmk_EAP.sh` 启动时不进行此测试。请注意,你需要使用 `service network-manager stop` 停止网络服务,以释放你的 Wi-Fi 接口。
service network-manager stop
./run_zero_pmk_EAP.sh # to test against CVE-2019-12587 (remember to restart ESP first)
./run_crash_esp_EAP.sh # to test against CVE-2019-12586
如果出于某种原因该二进制文件在你的系统上无法运行,你可以通过执行脚本 `./buid.sh` 来编译项目 `hostapd-2.8_source`。该脚本会在运行工具前安装以下依赖:`build-essential pkg-config git libnl-genl-3-dev libssl-dev libnl-route-3-dev`。
构建成功后,你可以运行脚本 `./run_zero_pmk_EAP.sh` 启动访问点以测试漏洞,或运行 `./run_hostapd_normal.sh` 启动时不进行测试。
./build
./run_zero_pmk_EAP.sh # to test against CVE-2019-12587 (remember to restart ESP first)
./run_crash_esp_EAP.sh # to test against CVE-2019-12586
为了编译 beacon_frame_crasher 文件夹中用于 esp8266 的代码,需要遵循 ESP8266 Deauther 中的步骤。这是一个修改版的 ESP8266 板级支持包,允许注入原始 802.11 帧。如果你有闲置的 wemos d1 mini 开发板,beacon_frame_crasher/ESP8266Crasher.ino.d1_mini.bin 中还提供了一个二进制文件用于快速测试。请注意,该代码硬编码为让一个配置为 ssid=TEST_KRA 接入点的 ESP8266 崩溃。“beacon frame crasher” 设备一启动,连接到该接入点的其他 ESP8266 设备应会间歇性重启。
或者,如果你的 Wi-Fi 硬件支持监听和注入,可以运行以下 Python 脚本:
sudo apt-get install -y aircrack-ng
sudo airmon-ng check kill
sudo airmon-ng wlan0 start # wlan0 is your wifi interface name
pip install scapy
python beacon_frame_crasher/ESP8266Crasher.py
如果你的 ESP 设备 SDK 存在 CVE-2019-12587 漏洞,你应该会从 hostapd 收到如下输出:

如果你的 ESP 设备 SDK 存在 CVE-2019-12586 漏洞,你应该会从 hostapd 收到如下输出:

在这种情况下,由于设备每次尝试与 hostapd 连接时都会重启,你应该会收到大量表示重新连接的日志。如果你正在监视设备的串口,还可以收到跟踪日志。
默认情况下,该 PoC 接入点具有以下默认配置:
要更改这些选项,请修改 hostapd 根目录中的 hostapd.conf 文件(hostapd-2.8_binary/hostapd.conf 或 hostapd-2.8_source/hostapd/hostapd.conf)。请将 interface 参数改为与你的 Wi-Fi 网卡匹配;如果你希望测试 ESP32/8266 客户端测试代码,建议将其余参数保持默认。仓库中也包含了正确的证书(与 ESP-IDF 仓库中的相同),因此无需在 hostapd 文件夹中更改它们。
如果你想更改 EAP 方法或用户名凭据,只需更改 hostapd.eap_user
检查你的 openssl 库是否允许使用 TLS 1.0 版本。你通常可以在 /etc/ssl/openssl.cnf 中更改此配置,将最后几行改为:
[system_default_sect]
MinProtocol = TLSv1.0
CipherString = DEFAULT@SECLEVEL=1
用于测试易受影响设备的代码位于 esp_client_test_codes 文件夹中。
ESP32_Arduino_EAP_Client 和 ESP8266_Arduino_EAP_Client 可以使用各自的 Arduino 板级支持包(arduino-esp32 和 arduino-esp8266)进行编译。至于非 Arduino 代码,则需要 ESP-IDF 和 ESP8266_NONOS_SDK 来编译 ESP8266_EAP_Client 和 ESP32_EAP_Client。请注意,你需要使用与前文所述相同或更早的 SDK,才能触发所描述的所有漏洞。
本研究部分得到了 Keysight Technologies 的支持。