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 结果合并去重。
防御建议
- 关闭匿名访问,强制客户端认证。
- 配置 topic ACL,限制客户端可见与可发布的范围。
- 敏感凭据不走 retained 消息,及时清理保留消息。
- 对 IoT 网段做网络隔离,1883 不暴露到不可信网络。