MQTT 协议
1.1 介绍
1.2 消息格式
-
CONNECT(连接)
-
PUBLISH(订阅)
-
SUBSCRIBE(订阅确认)
-
UNSUBSCRIBE(取消订阅)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
QoS 0
-
QoS 1
-
QoS 2
-
Will Flag
-
Will Qos
-
Will Retain Flag
-
设备被盗用
-
客户端和服务端的静态数据被修改
-
拒绝服务攻击
-
通信被拦截、修改、重定向
-
虚拟控制报文注入
-
应用层:MQTT提供客户标识以及用户名和密码,在应用层验证设备
-
传输层:类似于HTTPS,MQTT基于TCP连接,也可以加上一层TLS,防止中间人攻击
-
网络层:专线或者vpn来连接设备与MQTT代理
-
应用层:MQTT支持客户标识、用户名和密码
-
传输层:传输层可以使用TLS,除了加密通讯,还可以使用x509证书来认证设备
-
十六进制或二进制
-
字符串
-
JSON
1.3 MQTT通信
1.4 例子
mosquitto_sub -h 127.0.0.1 -t debug(主题)
mosquitto_pub -h 127.0.0.1 -t debug -m "Hello World" -r(保留在服务器上最后一条信息功能)
1.5 批量扫描设备
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("[+] Connection successful")
client.subscribe('#', qos=1)
client.subscribe('$SYS/#')
def on_message(client, userdata, msg):
print('[+] Tomqtt: %s - Message: %s' % (msg.tomqtt, msg.payload))
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
client = mqtt.Client(client_id="MqttClient")
client.on_connect = on_connect
client.on_message = on_message
client.connect('扫描设备IP', 1883, 60)
client.loop_forever()
# client.publish('/test', "I am from pycharm client!")
2. 安全问题
1. MITM攻击
2. 未授权问题
-
利用通配符获取订阅所有Tomqtt
-
权限控制问题
3. 密码爆破
-
匿名登录问题
emqttd/etc/emq.conf # 默认开启是任何人都能登录需要改为false
mqtt.allow_anonymous = true
-
注意认证插件
-
暴力破解
3. 总结
原文始发于微信公众号(山石网科安全技术研究院):MQTT安全分析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论