1. 协议报文
-
固定报头
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
-
控制报文的类型
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
标志位 Flag Bits
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
DUP1 代表控制报文的重复分发标志。 -
QoS2 代表 PUBLISH报文的服务质量等级。
-
RETAIN3 代表 PUBLIS
H报文
match
的保留
标志。
-
客户端连接到MQTT代理; -
客户端订阅一个或多个主题; -
发布者发布一个特定主题的消息; -
MQTT代理将该消息传递给所有已订阅该主题的客户端; -
客户端收到消息并执行必要的操作。
-
MQTT 的最小报文仅为 2 个字节,比 HTTP 占用更少的网络开销。 -
MQTT 与 HTTP 都能使用 TCP 连接,并实现稳定、可靠的网络连接。 -
MQTT 基于发布订阅模型,HTTP 基于请求响应,因此 MQTT 支持双工通信。 -
MQTT 可实时推送消息,但 HTTP 需要通过轮询获取数据更新。 -
MQTT 是有状态的,但是 HTTP 是无状态的。 -
MQTT 可从连接异常断开中恢复,HTTP 无法实现此目标。
4. 测绘情况
目前,全网共计有 102 万主机开放了 MQTT 服务,主要集中在亚洲地区。
5. 相关概念
-
Topic
chat/room/1
sensor/10/temperature
sensor/+/temperature
$SYS/broker/metrics/packets/received
$SYS/broker/metrics/#
'+': 表示通配一个层级,例如 a/+,匹配 a/x, a/y
'#': 表示通配多个层级,例如 a/#,匹配 a/x, a/b/c/d
-
系统Topic
-
保留消息
-
遗嘱消息
-
因网络故障或网络波动,设备在保持连接周期内未能通讯,连接被服务端关闭 -
设备意外掉电 -
设备尝试进行不被允许的操作而被服务端关闭连接,例如订阅自身权限以外的主题等。
-
QoS
|
|
|
|
|
|
|
|
二、环境搭建
1. 服务端
这里选取 EMQX 作为服务端,仅需三步即可完成服务端的搭建。
curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash
sudo apt-get install emqx
sudo systemctl start emqx
2. 客户端
这里选取MQTTX作为MQTT客户端工具,值得注意的是此工具仅支持MQTT 5.0协议,除此之外的协议不支持。下载链接:https://mqttx.app/
3. 使用方式
a)创建连接
点击“NewSubscription”,填写想要订阅的主题即可。
三、安全探究
1. 安全隐患
a)未授权访问
client = mqtt.Client()
client.connect(self.host, port=self.port, keepalive=1)
rc = client.loop()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
client = mqtt.Client()
client.connect(self.host, port=self.port, keepalive=1)
client.loop()
rc = client.loop()
c)弱口令
c)漏洞
服务端软件自身存在缺陷可被利用,或者订阅端或服务端解析内容不当产生安全漏洞,这将导致整个系统不安全。
如CVE-2019-11779,在Eclipse Mosquitto 1.5.0 到1.6.5 中,如果恶意MQTT 客户端发送一个SUBSCRIBE 数据包,其中包含一个由大约65400 个或更多'/' 字符组成的主题,即主题层次分隔符,则会发生堆栈溢出。
2 安全影响
a)通过通配符订阅全部主题或系统主题
订阅系统主题
b)轨迹泄露
c)内外探测
IoT设备会通过 MQTT 协议发布自己的配置信息,以供其他设备获取,其中包含了IP、设备名称等信息,通过这些信息可以达到内网探测的目的。暴露内部网络 IP 地址可能会带来严重的安全风险。如果攻击者获得了对内部网络中设备 IP 地址的访问权限,他们可能会发起范围广泛的攻击,例如访问机密信息、窃取数据、安装恶意软件,甚至获得网络控制权。通过网络空间搜索引擎,我们发现了近 4000+ 的 MQTT 服务器向外暴露了配置信息,其中包括PC、TV、路由器等设备的配置信息。
d)身份信息泄露
除此之外,我们还发现物联网设备通过 MQTT 协议进行身份认证,但在通信过程中使用了明文,暴露了用户邮箱地址、名字、密码等身份信息。如下图的设备,在通信过程中,向外发布了用户邮箱、姓名、性别和密码信息,暴露了个人身份信息。
四、测绘数据分析
五、防护建议
六、相关链接
-
MQTT协议: https://mcxiaoke.gitbook.io/mqtt/
-
EMQX: https://www.emqx.io/
-
Mosquitto Security: https://mosquitto.org/security/
-
物联网安全之MQTT协议安全: https://bacde.me/post/mqtt-security-part-
one/
原文始发于微信公众号(源影安全团队):是谁关了我家的灯-MQTT协议测绘分析与安全问题探究
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论