跳到主要内容

MQTT 匿名枚举与 retained 凭据收割

MQTT 是 IoT 场景常用的发布/订阅协议,默认监听 1883 端口。它的 retained message 机制是收割凭据的关键:broker 为每个 topic 保留最后一条消息,任何新订阅者一接入就立即收到。大量设备把配置、状态甚至凭据以 retained 消息的形式发布,匿名可读时等于把口令放在了公共公告栏上。

仅限授权环境

订阅 # 会拉取目标全部 topic,仅可在授权测试或靶场环境使用。


服务识别

nmap -sV -p 1883 <target>

nmap 会将服务标记为 mosquitto 等 broker。利用的前提通常是 broker 配置了 allow_anonymous true。扫描阶段 nmap 的 mqtt-subscribe 脚本也能返回部分 topic,可用于初筛。


方法 A:retained 消息一次性收割

timeout 10 mosquitto_sub -h <target> -t "#" -v --retained-only
参数作用
-t "#"通配符订阅全部 topic
--retained-only只收取保留消息
timeout 10收割一轮后自动退出

方法 B:发布消息

mosquitto_pub 可以向 topic 写入消息,但就凭据收集而言,只读订阅通常已经足够。


常见 topic 与后续动作

常见 topic内容
ssh/login登录凭据
设备配置 topic连接信息、密钥
健康状态 topic主机名、版本等指纹

从 retained 消息中泄露 user:password 后,直接尝试 SSH 等对应服务的登录。


复核要点

  • 确认匿名可读后,优先完成只读收割,再考虑测写权限。
  • 收割结果按 topic 整理,凭据逐一验证对应服务。
  • nmap 脚本结果与 mosquitto_sub 结果合并去重。

防御建议

  1. 关闭匿名访问,强制客户端认证。
  2. 配置 topic ACL,限制客户端可见与可发布的范围。
  3. 敏感凭据不走 retained 消息,及时清理保留消息。
  4. 对 IoT 网段做网络隔离,1883 不暴露到不可信网络。