ESP32 WiFi安全审计:Marauder工具实践与防护方案
物联网WiFi安全:被忽视的攻击面
你做了一套ESP32物联网设备,连着WiFi跑着MQTT,功能测试一切正常。上线运行后,有没有想过:
有人对着你的WiFi热点抓包怎么办?
有人发送Deauth帧把你的设备踢下线怎么办?
有人伪造MQTT Broker截获设备数据怎么办?
大多数物联网设备的WiFi安全几乎为零。默认WPA2-PSK密码硬编码在固件里,抓包后跑个字典就能破解。设备也不验证服务器证书,中间人攻击轻松搞定。
这篇文章不是教你搞破坏,而是从攻击者视角检查自己设备的安全漏洞。知道怎么打,才知道怎么防。
ESP32 Marauder:WiFi安全测试利器
ESP32 Marauder是一个开源的WiFi安全测试工具,运行在ESP32上。功能包括:
- WiFi扫描和探测
- Deauth检测和发送
- Beacon泛洪
- Packet抓取
- PMKID捕获
沧州虎王科技在GitHub上开源了Marauder的MicroPython移植版本:github.com/huwangkeji/ESP32Marauder-MicroPython
跟原版(C/C++)比,MicroPython版本的优势是:
- 代码可读性高,适合学习理解原理
- 修改方便,快速定制测试功能
- 可以交互式运行,实时调试
劣势是性能差一些,Deauth帧发送速率只有C版本的五分之一。但对于安全测试和学习来说足够了。
用Marauder做安全审计
1. 扫描目标WiFi
from marauder import WiFiScanner
scanner = WiFiScanner()
scanner.scan(seconds=5)
# 列出所有发现的AP
for ap in scanner.get_results():
print(f"{ap.bssid} | {ap.ssid} | {ap.rssi}dBm | {ap.channel} | {ap.auth}")
扫描结果包括BSSID、SSID、信号强度、信道、加密方式。从这里就能看出问题:
- 如果你的设备AP用的是WEP或WPA,立刻升级到WPA2/WPA3
- 如果SSID是默认名称(如ESP32_xxxxxx),容易被批量识别
2. Deauth攻击检测
Deauth攻击是最常见的WiFi攻击方式。攻击者发送伪造的Deauth帧,让设备以为路由器要求断开,于是掉线。
from marauder import DeauthDetector
detector = DeauthDetector()
detector.start()
# 如果检测到Deauth帧,会触发回调
def on_deauth(src, dst, reason):
print(f"DEAUTH detected: {src} -> {dst}, reason={reason}")
detector.on_deauth = on_deauth
# 持续监听
import time
while True:
time.sleep(1)
把ESP32设备放在你的物联网设备旁边,如果检测到Deauth帧,说明有人在进行攻击。
防御方案:
- ESP32支持802.11w(PMF,Protected Management Frames),开启后Deauth帧需要加密验证,伪造的Deauth会被丢弃
- 在固件中实现Deauth检测+自动重连+告警上报
3. 抓包分析
from marauder import PacketCapture
capture = PacketCapture(channel=6) # 切换到目标信道
capture.start(timeout=30)
# 保存为pcap文件
capture.save_pcap("/sd/capture.pcap")
把pcap文件拉到电脑上用Wireshark分析:
- MQTT消息是否明文传输?
- 设备是否发送了硬编码的密码?
- 有没有敏感数据泄露?
常见发现:大多数物联网设备的MQTT流量是明文的,用户名密码直接在TCP包里能看到。解决方案是使用MQTT over TLS(MQTTS),端口8883。
4. PMKID捕获
PMKID是WPA2/WPA3握手过程中的一个元素,可以离线破解密码。Marauder可以捕获PMKID:
from marauder import PMKIDCollector
collector = PMKIDCollector(target_bssid="AA:BB:CC:DD:EE:FF")
collector.start()
捕获后用hashcat跑字典破解:
hashcat -m 22000 capture.pmkid wordlist.txt
防御方案:
- 使用强密码(16位以上,随机生成)
- 使用WPA3(SAE握手,不受PMKID离线破解影响)
- 定期更换密码
自己设备的漏洞清单
用Marauder测完自己的设备后,常见的漏洞清单:
| 漏洞 | 风险等级 | 修复方案 |
|---|---|---|
| WPA2-PSK密码硬编码 | 高 | 改为每设备独立密码,首次配网时设置 |
| MQTT明文通信 | 高 | 启用MQTTS (TLS),端口8883 |
| 不验证服务器证书 | 高 | 启用证书pinning |
| 默认SSID可识别 | 中 | 随机化SSID |
| 无Deauth防护 | 中 | 开启PMF (802.11w) |
| 固件可通过OTA下载 | 高 | OTA固件签名验证 |
| WiFi配置接口无认证 | 高 | 配网AP加密码+限制尝试次数 |
代码示例:MQTT TLS + 证书Pinning
// ESP32 MQTT over TLS with certificate pinning
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
WiFiClientSecure esp_client;
PubSubClient mqtt_client(esp_client);
// 服务器证书指纹(硬编码在固件中)
const char* server_cert_fingerprint = "AA:BB:CC:DD:EE:FF:...";
void setup_mqtt() {
// 启用TLS
esp_client.setInsecure(); // 仅测试用,生产环境应该验证完整证书
// 生产环境:证书Pinning
// esp_client.setCACert(server_cert_pem);
mqtt_client.setServer("mqtt.example.com", 8883);
mqtt_client.setCallback(mqtt_callback);
}
void connect_mqtt() {
while (!mqtt_client.connected()) {
String client_id = "esp32_" + String(ESP.getChipId(), HEX);
if (mqtt_client.connect(client_id.c_str(),
mqtt_user, mqtt_pass)) {
Serial.println("MQTT connected (TLS)");
mqtt_client.subscribe("devices/+/command");
} else {
Serial.print("MQTT failed, rc=");
Serial.print(mqtt_client.state());
delay(5000);
}
}
}
PMF (802.11w) 启用
ESP32支持PMF,在连接WiFi时启用:
#include <WiFi.h>
void connect_wifi() {
WiFi.mode(WIFI_STA);
// 启用PMF
wifi_config_t conf;
conf.pmfmfpc = 1; // PMF Required
conf.pmfmfpb = 0; // 不允许不支持的AP连接
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.println("WiFi connected with PMF");
}
总结
物联网设备的WiFi安全不是可选项。用ESP32 Marauder做安全审计,5分钟就能发现设备的安全漏洞。
核心防护措施三条:
- MQTT走TLS加密(端口8883)
- WiFi启用PMF防Deauth
- OTA固件签名验证防恶意固件
做安全测试不是搞破坏,是在别人搞破坏之前先发现问题。虎王科技的ESP32 Marauder MicroPython版本在GitHub上开源,欢迎下载测试。
GitHub: github.com/huwangkeji/ESP32Marauder-MicroPython
沧州虎王科技,专注物联网软硬件开发、通信设备、嵌入式系统与设备管理平台。
更多推荐


所有评论(0)