一个基于客户端-服务器的消息发布/订阅传输协议MQTT简析

本环境是蛇矛实验室基于火天网演攻防演训靶场进行搭建,通过火天网演中的环境构建模块,可以灵活的对目标网络进行设计和配置,并且可以快速进行场景搭建和复现验证工作。
自 2005年国际电信联盟正式提出“物联网(iot)”这一概念以来,物联网在全球范围内迅速获得认可,并成为信息产业革命第三次浪潮和第四次工业革命的核心支撑。
同时,数以亿计的设备接入物联网,这些设备如今已渗透到我们生活的方方面面,从家居到工厂无处不在。一方面物联网设备使我们的生活更加便捷,而另一方面物联网安全事件频发,全球物联网安全支出不断增加。
当前,大量物联网设备及云服务端直接暴露于互联网,这些设备和云服务端存在的漏洞一旦被利用,可导致设备被控制、用户隐私泄露、云服务端数据被窃取等安全风险,甚至会对基础通信网络造成严重影响。
从2018年全球统计数据来看,路由器、视频监控设备暴漏数量占比较高。路由器暴漏数量超过3000万台,视频监控设备暴露数量超过1700万台,并且这些设备往后几年会一年比一年多,物联网安全的事件也会越来越多。由此,物联网安全行业需要大力发展,物联网安全人才的培养也刻不容缓。
蛇矛实验室在后续将利用火天网境系列靶场中的相关目标仿真和环境构建的特性,将持续发布关于“物联网安全-cve实战分析”系列的文章来帮助大家入门物联网安全。
关于mqtt
mqtt是一个基于客户端-服务器的消息发布/订阅传输协议。mqtt协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。
在很多情况下,包括受限的环境中,如:机器与机器(m2m)通信和物联网(iot)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
mqtt介绍
mqtt的几个要素:
1
1. 客户端(client):使用mqtt的程序或设备,一般分为发布者和订阅者2. 服务端(server):发布者和订阅者之间的broker3. 主题(topic):附加在消息上的一个标签,broker会将该消息发送给所有订阅该主题的订阅者4. 主题过滤器(topic filter):订阅者订阅时可使用通配符同时订阅一个或多个主题  
mqtt基于发布和订阅模型,mqtt 协议的订阅与发布是基于主题的(topic),mqtt工作在 tcp/ip协议族上。一个典型的 mqtt 消息发送与接收的流程如下:
1. publisher 连接 broker;2. suscriber连接 broker,并订阅主题 topic;3. publisher 发送一条消息给 broker,主题为 topic;4. broker 收到 publisher 的消息,查出 suscriber 订阅了 topic,然后将消息转发到 suscriber;  
我们可以简单理解,将mqtt理解为微博工作模式,当你(suscriber)点击关注一个博主(publisher)后,你就订阅了博主(连接到了broker),当博主发微博消息时(publish message),微博的服务器(broker)会将你订阅博主的微博消息转发给你(subcribe message),这样就完成了消息传递。
mqtt服务器搭建
eclipse mosquitto是一个开源消息代理,实现了mqtt协议版本3.1和3.1.1。mosquitto轻量,适用于低功耗单板计算机到完整服务器的所有设备。mosquitto项目还提供了用于实现mqtt客户端的c库,以及非常受欢迎的mosquitto_pub和mosquitto_sub命令行的mqtt客户端(来自于翻译)。
安装mosquitto的过程,首先添加mosquitto的ppa源:
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
安装mosquitto程序和mosquitto-clients客户端程序
sudo apt install mosquittosudo apt install mosquitto-clients
我们接下来就可以启动mosquitto服务了,启动可以查看一下mosquitto进程是否启动。这里可以看到mosquitto -c参数后运行配置文件的路径
sudo service mosquitto startps -aux | grep mosquitto或者sudo service mosquitto status
接下来,我们就可以测试mqtt协议的工作流程了,首先启动一个终端
mosquitto_sub -t topic_name  
然后再起一个终端,使用
mosquitto_pub -t topic_name -m this is a test  
这时,客户端就会接受到订阅的消息,服务器再次发送后,客户端将又会接受到订阅消息
我们可以添加一个用户,这里我创建了一个example用户,密码为example
sudo mosquitto_password -c /etc/mosquitto/example example
进入到/etc/mosquitto目录下,可以看到刚刚创建example用户名和密码的配置文件
接下来我们可以添加一个用户的配置文件,使用用户的配置文件进行运行,我们先停止mosquitto服务,然后在/etc/mosquitto/conf.d目录下创建一个default.conf(这里也可以拷贝/usr/share/doc/mosquitto/example/mosquitto.conf文件根据需求进行修改),然后重新启动mosquitto服务,查看一下服务是否启动。
此时重复上面的信息发送过程,使用-u参数指定用户名,-p参数输入密码
以上操作均在linux终端下运行,在windows上可以使用mqtt x工具,mqttx 是emq 开源的一款跨平台 mqtt 5.0 桌面客户端,它能运行在 macos,linux,windows上。
mqtt x 的用户界面借助聊天软件的形式简化了页面的操作逻辑,用户可以快速创建连接保存并同时建立多个连接客户端,方便用户快速测试 mqtt/tcp、mqtt/tls 的连接、发布/订阅功能及其他特性。
打开mqtt x官网下载好以后,我们可以使用wireshark进行抓包进行分析整个的流程。
首先启动wireshark进行监听,然后打开mqttx软件新建一个链接,如下图,这里名称我设置的mqtt_test,client id我使用默认分配的,服务器地址协议为mqtt://,后面填broker.emqx.io。这里的emq x cloud 提供的公共 mqtt 服务器,可以供我们免费使用。
下面的端口号为1883,可以进行修改,账号和密码随意设置。设置好以后,就可以点击连接了。
修改下面msg的值为我们要发送的内容,点击小飞机进行发送。就可以看到消息的发布和订阅过程了。
整个流程完毕后,点击mqttx上面的关闭连接按钮。然后wireshark输入mqtt进行过滤。
按时间排序,可以看到mqtt协议给broker发送了一个connect登录请求,然后,服务器回应一个ack,表示登录成功。再双击connect command这条数据包,我们可以从下面窗口中看到数据包详细的十六进制字节内容。
接下来,查看connect ack数据包可以看到到服务器回应了20 02 00 00,这里表示登录成功。
接下来看mqtt协议的 subcribe和publish数据包。可以看到客户端subcribe一个topic(test_topic/1111)
broker返回了90 03 99 47 00,其中90为 subscribe ack 报文固定报头,03 为剩余长度,后面俩字节为id号,00结束。
当publisher往这个topic 推送 payload 时,broker 就会把 payload 转发给定阅这个topic的subcriber。这样就完成了整个流程。
mqtt相关漏洞
授权和认证漏洞
1
mqtt 是一种机器对机器连接协议,被设计为一种极其轻量级的发布/订阅消息传输,并被全球数百万的物联网设备广泛使用。
mqtt-pwn 旨在成为 iot broker 渗透测试和安全评估操作的一站式商店,因为它结合了枚举、支持功能和开发模块,同时将其全部打包在命令行界面中,并易于使用和可扩展的类壳环境(来自翻译)。
接下来,我们使用mqtt-pwn做一些mqtt授权和认证漏洞的演示,首先安装mqtt-pwn
git clone https://github.com/akamai-threat-research/mqtt-pwn.gitcd mqtt-pwnsudo docker-compose up --build --detach
然后就可以启动mqtt-pwn了
sudo docker-compose pssudo docker-compose run cli  
下图为mqtt-pwn运行时状态
有一些公网开放的mqtt服务端软件默认是开启匿名访问,我们可以在shodan、fofa、zoomeye等,搜索mqtt,可以看到mqtt connection code: 0。
这里如果连接某个broker,返回结果中mqtt connection code为0就代表成功连接,如果返回值为4说明账号密码错误,如果返回值为5说明该broker不支持用户密码登陆。
我们接下来使用mqtt-pwn进行连接,help 显示帮助信息,可以使用connect命令进行连接。对于开启匿名登录的服务端,直接使用connect -o host命令就可连接,如果没有报错,就表示连接成功。
连接成功后,可使用system_info 查看系统信息。接下来使用discovery建立扫描,等待scans完成才可进行下一步,否则会报错。
使用scans -i id,id为建立discovery的线程id。然后就可以使用topics查看所有topic了。
可以输入`messages`查看topic的内容
我们可以用mqtt-pwn使用弱口令爆破某个mqtt broker,得到其账号密码,然后接入broker。
bruteforce --host host --port port
这里的暴力破解,主要还是看自己收藏的字典是否强大,另一方面就是网速的快慢。我们可以使用如下命令进行爆破,爆破成功后会显示用户名和密码。mqtt-pwn/resources/wordlists目录下存放了mqtt-pwn的爆破的用户名和密码字典,这里可以添加我们自己收藏的字典。
传输漏洞
2
mqtt可造成xss攻击,这里测试cve-2020-13821漏洞,本次测试搭建的版本为hivemq 4.3.2。我们使用docker搭建环境进行复现,比较方便。
sudo docker pull hivemq/hivemq4:4.3.2sudo docker run -p 8080:8080 -p 1883:1883 hivemq/hivemq4:4.3.2  
环境搭建好以后,使用浏览器访问ip地址,发现运行正常。
使用上面提到的mqttx工具进行连接。创建一个新的连接,名称随意填写,client id为漏洞点,payload为,然后端口填写docker映射出的相对端口。
设置完毕后,点击connect进行连接和发送。
连接成功后,去浏览器进行验证。
点击clients,然后点击“refresh snaphot”即可触发执行payload
应用漏洞
3
以emqx为例,emqx 是一款大规模可弹性伸缩的云原生分布式物联网 mqtt 消息服务器。作为全球最具扩展性的 mqtt 消息服务器,emqx 提供了高效可靠海量物联网设备连接,能够高性能实时移动与处理消息和事件流数据,帮助您快速构建关键业务的物联网平台与应用。
我们可以搜索emqx的相关文档信息,获取有用信息。
以默认用户名和密码为例,我们在fofa或者shodan等搜索18083端口,并且title有dashboard,就可以搜索出emqx的相关站点,我们使用默认用户名和密码即可进行登录查看。
其他漏洞
4
对于无法通过一般途径获取账号密码的客户端,我们可以通过提取设备的固件,对其逆向分析,然后把文件系统中的证书或是账号密码提取出来。亦或者mqtt使用加密通信,通过提取固件分析其加密流程进行解密,并进行后续攻击操作。
总结
这一小节我们本文简单介绍mqtt安全相关内容,使用mosquito和mqttx完成了整个mqtt信息传输流程,然后复现了几个分类中常见的mqtt漏洞。最后提醒一下大家,自己在学习过程中最好自己搭建服务进行测试,请勿对网络上的机器目标进行测试和破坏。


介绍一款专用的电机设计和分析工具
Surface Laptop值得买吗?Surface Laptop拆解:没有升级配置的余地
直流接触器过电流故障的原因分析
智能跳绳蓝牙芯片MS1656解决方案
上海将于本月14日举行2019年全国大学生5G物联网创意竞赛决赛
一个基于客户端-服务器的消息发布/订阅传输协议MQTT简析
RSL10智能拍摄相机平台支持事件触发式IoT方案
NI将PXI可编程电阻器模组加入嵌入式系统平台
Imagination升级为高级会员并将继续致力于推动RISC-V的发展
水产品氯霉素快速检测仪的原理说明,它的用途是什么
倒车雷达的产品配置
RFID在医药物流上可以怎样应用
5G手机芯片江湖:成本和续航两大难题,决定了5G芯片的生死
CES迎来首日开展 将有这些重磅产品登场!
比特大陆追加急单让台积电7纳米产能供不应求,现11起月每月增加1万片
伺服的开环,闭环,以及全闭环问题
以手机为主的互联网用户的隐私问题需引起重视
步进电机的使用需要注意哪些问题
基于RSL10 SIP的蓝牙低功耗技术方案
如何分辨判别步进电动机绕组相序