物联网安全------MQTT协议

本文转载于:https://blog.csdn.net/We8__/article/details/128441857

关于MQTT

MQTT是一个基于客户端-服务器消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

MQTT介绍

MQTT的几个要素:

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

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

sudo apt install mosquitto
sudo apt install mosquitto-clients

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

sudo service mosquitto start
 
ps -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相关漏洞

授权和认证漏洞

MQTT 是一种机器对机器连接协议,被设计为一种极其轻量级的发布/订阅消息传输,并被全球数百万的物联网设备广泛使用。MQTT-PWN 旨在成为 IoT Broker 渗透测试和安全评估操作的一站式商店,因为它结合了枚举、支持功能和开发模块,同时将其全部打包在命令行界面中,并易于使用和可扩展的类壳环境(来自翻译)。

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

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

然后就可以启动MQTT-PWN了

sudo docker-compose ps
sudo 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的爆破的用户名和密码字典,这里可以添加我们自己收藏的字典。

传输漏洞

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

sudo docker pull hivemq/hivemq4:4.3.2
 
sudo docker run -p 8080:8080 -p 1883:1883 hivemq/hivemq4:4.3.2

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

使用上面提到的MQTTX工具进行连接。创建一个新的连接,名称随意填写,Client ID为漏洞点,payload为"<img/src=x οnerrοr=alert(1)>",然后端口填写docker映射出的相对端口。设置完毕后,点击connect进行连接和发送。

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

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

应用漏洞

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

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

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

其他漏洞

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

总结

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

猜你喜欢

转载自blog.csdn.net/qq_50854662/article/details/131408798