0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

蛇矛实验室 来源:蛇矛实验室 作者:c4se 2022-11-23 14:12 次阅读

本环境是蛇矛实验室基于"火天网演攻防演训靶场"进行搭建,通过火天网演中的环境构建模块,可以灵活的对目标网络进行设计和配置,并且可以快速进行场景搭建和复现验证工作。

自 2005年国际电信联盟正式提出“物联网IoT)”这一概念以来,物联网在全球范围内迅速获得认可,并成为信息产业革命第三次浪潮和第四次工业革命的核心支撑。

同时,数以亿计的设备接入物联网,这些设备如今已渗透到我们生活的方方面面,从家居到工厂无处不在。一方面物联网设备使我们的生活更加便捷,而另一方面物联网安全事件频发,全球物联网安全支出不断增加。

当前,大量物联网设备及云服务端直接暴露于互联网,这些设备和云服务端存在的漏洞一旦被利用,可导致设备被控制、用户隐私泄露、云服务端数据被窃取等安全风险,甚至会对基础通信网络造成严重影响。

从2018年全球统计数据来看,路由器、视频监控设备暴漏数量占比较高。路由器暴漏数量超过3000万台,视频监控设备暴露数量超过1700万台,并且这些设备往后几年会一年比一年多,物联网安全的事件也会越来越多。由此,物联网安全行业需要大力发展,物联网安全人才的培养也刻不容缓。

蛇矛实验室在后续将利用火天网境系列靶场中的相关目标仿真和环境构建的特性,将持续发布关于“物联网安全-CVE实战分析”系列的文章来帮助大家入门物联网安全。

关于MQTT

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。

在很多情况下,包括受限的环境中,如:机器与机器(M2M通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

MQTT介绍

4bccdd54-3ed3-11ed-9e49-dac502259ad0.png

MQTT的几个要素:

1

1. 客户端(Client):使用MQTT的程序或设备,一般分为发布者和订阅者

2. 服务端(Server):发布者和订阅者之间的Broker

3. 主题(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

4c26d3e0-3ed3-11ed-9e49-dac502259ad0.png

安装mosquitto程序和mosquitto-clients客户端程序

sudo apt installmosquitto
sudo apt installmosquitto-clients

4f41baea-3ed3-11ed-9e49-dac502259ad0.png

我们接下来就可以启动mosquitto服务了,启动可以查看一下mosquitto进程是否启动。这里可以看到mosquitto -c参数后运行配置文件的路径

sudo service mosquitto start

ps -aux | grep mosquitto
或者
sudo service mosquitto status

4fb43f7a-3ed3-11ed-9e49-dac502259ad0.png

接下来,我们就可以测试mqtt协议的工作流程了,首先启动一个终端

mosquitto_sub-t "topic_name"

然后再起一个终端,使用

mosquitto_pub-t "topic_name"-m "this is a test"

这时,客户端就会接受到订阅的消息,服务器再次发送后,客户端将又会接受到订阅消息

4febd34a-3ed3-11ed-9e49-dac502259ad0.png

我们可以添加一个用户,这里我创建了一个example用户,密码为example

sudomosquitto_password -c /etc/mosquitto/example example

50118b08-3ed3-11ed-9e49-dac502259ad0.png

进入到"/etc/mosquitto"目录下,可以看到刚刚创建example用户名和密码的配置文件

503746e0-3ed3-11ed-9e49-dac502259ad0.png

接下来我们可以添加一个用户的配置文件,使用用户的配置文件进行运行,我们先停止"mosquitto"服务,然后在"/etc/mosquitto/conf.d"目录下创建一个default.conf(这里也可以拷贝"/usr/share/doc/mosquitto/example/mosquitto.conf"文件根据需求进行修改),然后重新启动mosquitto服务,查看一下服务是否启动。

505b87e4-3ed3-11ed-9e49-dac502259ad0.png

此时重复上面的信息发送过程,使用-u参数指定用户名,-P参数输入密码

5073f2a2-3ed3-11ed-9e49-dac502259ad0.png

以上操作均在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,可以进行修改,账号和密码随意设置。设置好以后,就可以点击连接了。

50ba9932-3ed3-11ed-9e49-dac502259ad0.png

修改下面msg的值为我们要发送的内容,点击小飞机进行发送。就可以看到消息的发布和订阅过程了。

510917e2-3ed3-11ed-9e49-dac502259ad0.png

整个流程完毕后,点击MQTTX上面的关闭连接按钮。然后wireshark输入"mqtt"进行过滤。

按时间排序,可以看到MQTT协议给Broker发送了一个Connect登录请求,然后,服务器回应一个ACK,表示登录成功。再双击Connect Command这条数据包,我们可以从下面窗口中看到数据包详细的十六进制字节内容。

51267b0c-3ed3-11ed-9e49-dac502259ad0.png

接下来,查看Connect Ack数据包可以看到到服务器回应了"20 02 00 00",这里表示登录成功。

52e4dcea-3ed3-11ed-9e49-dac502259ad0.png

接下来看MQTT协议的 Subcribe和Publish数据包。可以看到客户端Subcribe一个topic("test_topic/1111")

530b24cc-3ed3-11ed-9e49-dac502259ad0.png

Broker返回了"90 03 99 47 00",其中"90"为 Subscribe ACK 报文固定报头,"03" 为剩余长度,后面俩字节为id号,"00"结束。

5365d4a8-3ed3-11ed-9e49-dac502259ad0.png

当Publisher往这个topic 推送 Payload 时,Broker 就会把 Payload 转发给定阅这个topic的Subcriber。这样就完成了整个流程。

53c35fe2-3ed3-11ed-9e49-dac502259ad0.png

MQTT相关漏洞

授权和认证漏洞

1

MQTT 是一种机器对机器连接协议,被设计为一种极其轻量级的发布/订阅消息传输,并被全球数百万的物联网设备广泛使用。

MQTT-PWN 旨在成为 IoT Broker 渗透测试和安全评估操作的一站式商店,因为它结合了枚举、支持功能和开发模块,同时将其全部打包在命令行界面中,并易于使用和可扩展的类壳环境(来自翻译)。

接下来,我们使用mqtt-pwn做一些mqtt授权和认证漏洞的演示,首先安装mqtt-pwn

git clone https://github.com/akamai-threat-research/mqtt-pwn.git
cdmqtt-pwn
sudo docker-compose up--build --detach

543898a2-3ed3-11ed-9e49-dac502259ad0.png

然后就可以启动MQTT-PWN了

sudo docker-compose ps
sudo docker-compose run cli

下图为MQTT-PWN运行时状态

546eca94-3ed3-11ed-9e49-dac502259ad0.png

有一些公网开放的MQTT服务端软件默认是开启匿名访问,我们可以在shodan、fofa、zoomeye等,搜索MQTT,可以看到"MQTT Connection Code: 0"。

这里如果连接某个Broker,返回结果中"MQTT Connection Code"为0就代表成功连接,如果返回值为4说明账号密码错误,如果返回值为5说明该Broker不支持用户密码登陆。

549ea80e-3ed3-11ed-9e49-dac502259ad0.png

我们接下来使用mqtt-pwn进行连接,help 显示帮助信息,可以使用connect命令进行连接。对于开启匿名登录的服务端,直接使用"connect -o host"命令就可连接,如果没有报错,就表示连接成功。

连接成功后,可使用system_info 查看系统信息。接下来使用discovery建立扫描,等待Scans完成才可进行下一步,否则会报错。

54cf5d5a-3ed3-11ed-9e49-dac502259ad0.png

使用"scans -i id",id为建立discovery的线程id。然后就可以使用"topics"查看所有topic了。

550b26f0-3ed3-11ed-9e49-dac502259ad0.png

可以输入`messages`查看topic的内容

5558507e-3ed3-11ed-9e49-dac502259ad0.png

我们可以用MQTT-PWN使用弱口令爆破某个MQTT Broker,得到其账号密码,然后接入Broker。

bruteforce --host host --port port

57b3083c-3ed3-11ed-9e49-dac502259ad0.png

这里的暴力破解,主要还是看自己收藏的字典是否强大,另一方面就是网速的快慢。我们可以使用如下命令进行爆破,爆破成功后会显示用户名和密码。"mqtt-pwn/resources/wordlists"目录下存放了mqtt-pwn的爆破的用户名和密码字典,这里可以添加我们自己收藏的字典。

57fab56a-3ed3-11ed-9e49-dac502259ad0.png

传输漏洞

2

MQTT可造成XSS攻击,这里测试CVE-2020-13821漏洞,本次测试搭建的版本为hivemq 4.3.2。我们使用docker搭建环境进行复现,比较方便。

sudodockerpullhivemq/hivemq4:4.3.2

sudodockerrun-p8080:8080-p1883:1883hivemq/hivemq4:4.3.2

环境搭建好以后,使用浏览器访问ip地址,发现运行正常。

582d80da-3ed3-11ed-9e49-dac502259ad0.png

使用上面提到的MQTTX工具进行连接。创建一个新的连接,名称随意填写,Client ID为漏洞点,payload为"",然后端口填写docker映射出的相对端口。

设置完毕后,点击connect进行连接和发送。

586e5772-3ed3-11ed-9e49-dac502259ad0.png

连接成功后,去浏览器进行验证。

589a316c-3ed3-11ed-9e49-dac502259ad0.png

点击Clients,然后点击“Refresh Snaphot”即可触发执行payload

58d3bc48-3ed3-11ed-9e49-dac502259ad0.png

应用漏洞

3

以EMQX为例,EMQX 是一款大规模可弹性伸缩的云原生分布式物联网 MQTT 消息服务器。作为全球最具扩展性的 MQTT 消息服务器,EMQX 提供了高效可靠海量物联网设备连接,能够高性能实时移动与处理消息和事件流数据,帮助您快速构建关键业务的物联网平台与应用。

我们可以搜索EMQX的相关文档信息,获取有用信息。

5989c088-3ed3-11ed-9e49-dac502259ad0.png

以默认用户名和密码为例,我们在fofa或者shodan等搜索18083端口,并且title有dashboard,就可以搜索出EMQX的相关站点,我们使用默认用户名和密码即可进行登录查看。

59cba05c-3ed3-11ed-9e49-dac502259ad0.png

其他漏洞

4

对于无法通过一般途径获取账号密码的客户端,我们可以通过提取设备的固件,对其逆向分析,然后把文件系统中的证书或是账号密码提取出来。亦或者MQTT使用加密通信,通过提取固件分析其加密流程进行解密,并进行后续攻击操作。

总结

这一小节我们本文简单介绍MQTT安全相关内容,使用mosquito和mqttx完成了整个mqtt信息传输流程,然后复现了几个分类中常见的MQTT漏洞。最后提醒一下大家,自己在学习过程中最好自己搭建服务进行测试,请勿对网络上的机器目标进行测试和破坏。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2525

    文章

    48127

    浏览量

    740170
  • 过滤器
    +关注

    关注

    1

    文章

    407

    浏览量

    19002
  • MQTT协议
    +关注

    关注

    0

    文章

    90

    浏览量

    5224

原文标题:物联网安全实战从零开始-MQTT协议分析

文章出处:【微信号:蛇矛实验室,微信公众号:蛇矛实验室】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    mqtt协议和tcp协议区别

    低带宽和高延迟的网络环境,尤其在物联网环境中表现优秀。而TCP协议是面向连接的、可靠的、基于字节流的传输层通信协议,主要用于互联网和局域网中的数据传输。 2. 连接方式:
    的头像 发表于 04-01 09:15 230次阅读

    MQTT协议网关解决方案设计与实施

    MQTT协议网关是一个中间件,负责接收来自不同MQTT客户端的消息,并将这些消息转发到MQTT服务器
    的头像 发表于 03-11 14:07 139次阅读

    【飞腾派4G版免费试用】如何在飞腾开发板上安装EMQX MQTT服务器

    EMQX 是款大规模分布式物联网接入平台,同时作为高性能、可扩展的 MQTT 消息服务器,它可以为物联网(IoT)应用提供可靠的实时消
    发表于 12-26 11:16

    AT32基于FreeRTOS的AWS MQTT客户端

    AT32基于FreeRTOS的AWS MQTT客户端建立MQTT客户端与 AWS IoT C
    发表于 10-26 06:03

    三分钟快速实现三菱系列PLC远程监控

    前言:MQTT是一个基于客户端-服务器的消息发布/订阅传输
    的头像 发表于 10-17 16:09 1276次阅读
    三分钟快速实现三菱系列PLC远程监控

    MQTT网关快速连接三菱系列PLC实现远程监控

    __MQTT协议网关串口连接三菱FX3UPLC操作说明 __ __MQTT协议网关串口连接三菱FX3UPLC操作说明v1.2 __ 前言:MQTT
    的头像 发表于 10-17 15:28 925次阅读
    <b class='flag-5'>MQTT</b>网关快速连接三菱系列PLC实现远程监控

    MQTT协议采集网关可自定义格式

    取出设备地址、寄存地址和数据等内容;最后,将这些内容通过MQTT协议发布到指定的主题上,以便远程客户端可以
    发表于 10-09 19:33

    移动nb—mqtt协议介绍

    MQTT客户端-服务器发布/订阅消息传输协议。它重
    发表于 09-26 07:44

    物联网通信协议

    在TCP/IP协议之上• 客户端/服务器模式• 发布/订阅消息模式,提供对多消息分发• 对
    发表于 09-11 06:18

    MQTT协议网关串口连接三菱FX3UPLC操作说明

    前言:MQTT是一个基于客户端-服务器的消息发布/订阅传输
    发表于 08-14 15:19 0次下载

    西门子PLC如何轻松实现将数据上传到MQTT云平台

    前言:MQTT是一个基于客户端-服务器的消息发布/订阅传输
    发表于 08-14 15:17 0次下载

    EG网关MQTT协议串口PPI连接西门子PLC操作说明

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议
    的头像 发表于 08-04 11:03 661次阅读
    EG网关<b class='flag-5'>MQTT</b><b class='flag-5'>协议</b>串口PPI连接西门子PLC操作说明

    MQTT服务端和客户端

    MQTT 是一种基于客户端-服务端架构(C/S)的消息传输协议,所以在 MQTT
    的头像 发表于 07-30 14:55 1623次阅读

    西门子SMART200PLC连接自建MQTT云平台操作教程

    前言:MQTT 是一个基于客户端-服务器的消息发布/订阅传输
    发表于 05-17 14:40 4次下载

    当WiFi信号变低时,服务器客户端之间的TCP通信丢失,如何使客户端重新连接?

    大家好, 当 WiFi 信号变低时,服务器客户端之间的 TCP 通信丢失,比如超过 -80dBm。客户端断开连接,它就无法重新连接并正常进行通信。如何让
    发表于 05-15 07:31