MQTT 协议
默认端口:1883(mqtt)、8883(mqtt-tls)
探测发现
网络空间引擎
Shodan
FOFA
protocol=”mqtt”
protocol=”mqtt-ssl”
ZoomEye
Censys
host.services.protocol = “MQTT”(免费用户不可用)
工具
Nmap
nmap <主机> -p1883 --script mqtt-subscribe \
--script-args mqtt-subscribe.listen-msgs=1
mqtt-subscribe 会建立 MQTT 连接并订阅主题。mqtt-subscribe.listen-msgs=1 表示收到一条 PUBLISH 后结束。
MQTTX
MQTTX 可直接查看 CONNECT、SUBSCRIBE、PUBLISH 的返回码,用于比较匿名连接与不同 ACL 账号的行为。
Mosquitto 客户端
使用命令行复核单个主题:
mosquitto_sub -h <主机> -p 1883 -t '<测试主题>' -C 1 -W 5
-C 1 在收到一条消息后退出,-W 5 设置五秒超时。--insecure 会跳过 TLS 证书主机名校验。
测试方法
未授权订阅
可以使用 Nmap 脚本做最小验证:
nmap <主机> -p1883 --script mqtt-subscribe \
--script-args mqtt-subscribe.listen-msgs=1
如不存在未授权订阅结果为
PORT STATE SERVICE
1883/tcp open mqtt
|_mqtt-subscribe: Connection rejected: Not Authorized
存在未授权订阅则会显示
PORT STATE SERVICE
1883/tcp open xxx version x.x.x
| mqtt-subscribe:
| Topics and their most recent payloads:
| ……
|_ ……
如:

CONNECT 成功只表示 Broker 接受会话;匿名客户端收到非公开主题的 retained message 或实时 PUBLISH,才说明订阅 ACL 未生效。
凭据与 ACL
认证与 ACL 分开测试。认证阶段比较匿名、错误凭据和有效凭据的 CONNACK;ACL 阶段固定账号,分别测试精确主题、单层通配符 +、多层通配符 # 以及发布权限。
# 精确主题
mosquitto_sub -h <主机> -u '<用户名>' -P '<密码>' \
-t 'factory/line-1/status' -C 1 -W 5 -d
# 多层通配符
mosquitto_sub -h <主机> -u '<用户名>' -P '<密码>' \
-t 'factory/#' -C 1 -W 5 -d
# 发布权限
mosquitto_pub -h <主机> -u '<用户名>' -P '<密码>' \
-t 'factory/line-1/test' -m 'acl-check' -q 1 -d
MQTT 3.1.1 常见拒绝结果为 CONNACK 0x05 Not authorized 或失败的 SUBACK;MQTT 5.0 对应 Reason Code 0x87 Not authorized。Broker 也可能直接断开连接,因此需要结合报文和服务端日志判断。
参考
mqtt-subscribe NSE script
Eclipse Mosquitto command line utilities
MQTT Version 5.0 — OASIS Standard
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。