记录一次对MQTT协议的渗透测试经历
前言
由于工作需要,特意翻查了MQTT的相关漏洞,并一一学习复现,在此做以学习记录,没有恶意,如有抄袭,请私信作者删除。
技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!
介绍
MQTT协议我就不介绍了,这里讲得很详细,点击即可跳转。
环境搭建
在这里我是用ubuntu来搭建MQTT服务器。
安装MQTT服务:
sudo apt-get install mosquitto mosquitto-clients -y
安装完成后查看是否安装成功:
sudo systemctl status mosquitto.service

可以看到MQTT服务已经在运行了,接下来是修改配置文件。
MQTT的配置文件叫mosquitto.conf ,一般存放在 /etc/mosquitto 目录下 sudo vim /etc/mosquitto/mosquitto.conf 在文件最底下添加如下内容: listener 1883
allow_anonymous true
password_file /etc/mosquitto/pwfile.example
内容解析:
listener是MQTT监听的端口号,可以自行修改。
allow_anonymous是匿名访问漏洞的罪魁祸首,当为true时,便支持匿名访问,为false则禁止匿名访问。
password_file是存放MQTT账号密码的文件参数。
修改完后文件内容如下:

使用 mosquitto_passwd 可以添加账号密码。
使用方法: mosquitto_passwd 存放密码文件路径 账号
命令如下:
sudo mosquitto_passwd /etc/mosquitto/pwfile.example test

原来内置了一些账号,如果不想用内置账号,也可以使用 -c 来指定创建存放密码文件路径,需要在配置文件中修改password_file。
配置完MQTT协议后需要重启MQTT服务。
命令如下:
sudo systemctl restart mosquitto.service
接下来运行MQTT协议 发布和订阅 主题就行了。
订阅主题命令:
sudo mosquitto_sub -h 服务器ip -t 订阅的主题 -u 用户名 -P 密码 发布主题命令:
sudo mosquitto_pub -h 服务器ip -t 订阅的主题 -u 用户名 -P 密码 -m 发布的消息

这就算成功了。
工具安装
这里使用mqtt-pwn工具做复现。
sudo git clone https://mirror.ghproxy.com/https://github.com/akamai-threat-research/mqtt-pwn.git
下载完成后进到mqtt-pwn目录,使用 chmod 赋予整个目录权限(没有权限可能会导致运行报错)。
sudo chmod -R 777 *
mqtt-pwn是使用docker部署的,所以需要先安装docker容器。
sudo apt-get install docker-compose docker.io -y
cd进入mqtt-pwn的目录进行安装
sudo docker-compose up --build --detach
运行过程中会报错,报错如下:

这报错原因是因为debian的jessie版本已经不维护了。

修改Dockerfile
sudo vim Dockerfile 在 RUN apt-get update 前加入如下代码: RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && echo "deb http://archive.debian.org/debian/ jessie main" >/etc/apt/sources.list && echo "deb-src http://archive.debian.org/debian/ jessie main" >>/etc/apt/sources.list && echo "deb http://archive.debian.org/debian-security jessie/updates main" >>/etc/apt/sources.list && echo "deb-src http://archive.debian.org/debian-security jessie/updates main" >>/etc/apt/sources.list
在install中添加 --force-yes

修改完Dockerfile文件后,需要删除docker中报错的镜像,即 <none> 和 python。
先使用 sudo docker images 查看所有镜像信息
然后使用删除命令进行镜像删除: sudo docker rmi -f [IMAGE ID] 这里的 IMAGE ID 为 images 中的 IMAGE ID
再重新运行 sudo docker-compose up --build --detach 即可。

看到successfully就是成功了。
运行启动命令:
sudo docker-compose run cli

攻击复现
一、匿名访问漏洞
漏洞描述
由于MQTT默认开启匿名访问,或者在配置文件中配置 allow_anonymous 参数不正确导致可被匿名访问。
漏洞复现
使用MQTT-PWN尝试匿名访问。
匿名连接命令: connect -o 192.168.111.131 验证命令: system_info

出现MQTT协议基础信息,证明存在MQTT匿名访问漏洞。
先执行 discovery
待出现 finished! 的字样
再执行 scans 查看发现了哪些主题,使用 -i 参数接 id 订阅
scans -i 1
最后执行 messages 可查看通信的消息



具体是怎么执行的,我还没研究,就先到这吧。
修复建议
在配置文件中将 allow_anonymous 参数修改为 flase,若配置文件中没有该参数,添加一个即可。
二、暴力破解攻击
MQTT-PWN自带有暴力破解功能,我们先把MQTT协议的匿名访问配置禁用了,再进行暴力破解测试。
打开mqtt配置文件,修改allow_anonymous参数为false即可,重启mqtt协议即可
sudo vim /etc/mosquitto/mosquitto.conf
sudo systemctl restart mosquitto.service
sudo mosquitto_sub -h 192.168.111.131 -t test -u "test" -P "test"

重启MQTT协议后,启动MQTT-PWN进行暴力破解。
sudo docker-compose run cli
暴力破解的命令如下:
bruteforce --host ip --port port
默认为 1883 端口
MQTT-PWN会根据自带的用户名字典和密码字典进行暴力破解,自带的字典在 mqtt-pwn/resources/wordlists/ 目录下,当然你也可以自定义字典,只需将字典进行替换即可。

得到账号密码,进行账号密码连接即可。
connect -o 192.168.111.131 -u test -w test

完结!撒花!
结语
MQTT-PWN的其他参数还有待研究,对于MQTT协议,截止到发文,我所知道的漏洞即利用方式均已解释完,其实难点不在漏洞复现,而在攻击工具的搭建上,搭建过程中会报错,我翻阅了无数资料均无法解决,最后在debian的官网得到了解决思路,所以在此做一下总结和记录。
不要吝啬你们的小手手,来个三连吧!!!
记录一次对MQTT协议的渗透测试经历的更多相关文章
- MQTT协议(一)
MQTT(Message Queue Telemetry Transport),遥测传输协议,提供订阅/发布模式,更为简约.轻量,易于使用,针对受限环境(带宽低.网络延迟高.网络通信不稳定),可以简单 ...
- MQTT协议的简单介绍和服务器的安装
最近公司做的项目中有用到消息推送,经过多方面的筛选之后确定了使用MQTT协议,相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽. MQTT是IBM推出的一种针对移动终端设备的基于TCP/IP ...
- MQTT协议学习笔记
1.前沿 万物联网的时代即将到来,物联网也由当初的概念开始进一步落实.随着无线网络技术飞速发展,各种设备都可以连接网络,实现远程控制.例如智能家居最近非常火爆,智能插座.智能LED灯.智能摄像头等.在 ...
- 安卓开发之mqtt协议
首先物联网协议mqtt协议是基于tcp/ip协议的,使用了官方的mqttclient框架/**初始化mqttclient*/private void init() { try { //MQTT的连接设 ...
- HTTP协议和XMPP协议、MQTT协议
应用层协议:每个应用层的都是为了解决某一类应用问题.而问题的解决又必须通过位于不同主机中的多个应用进程之间的通信和协同工作来完成.应用进程之间必须遵守严格的规则.应用层协议应当定义如下几个: 应用进程 ...
- MQTT协议学习研究 & Mosquitto简要教程(安装和使用)
若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]——在RESTfu ...
- MQTT协议笔记之消息流
前言 前面的笔记已把所有消息类型都过了一遍,这里从消息流的角度尝试解读一下. 网络故障 在任何网络环境下,都会出现一方连接失败,比如离开公司大门那一刻没有了WIFI信号.但持续连接的另一端-服务器可能 ...
- MQTT协议笔记之发布流程
MQTT协议笔记之发布流程 前言 这次要讲到客户端/服务器的发布消息行为,与PUBLISH相关的消息类型,会在这里看到. PUBLISH 客户端发布消息经由服务器分发到所有对应的订阅者那里.一个订阅者 ...
- MQTT协议实现Eclipse Paho学习总结
MQTT协议实现Eclipse Paho学习总结 摘自:https://www.cnblogs.com/yfliufei/p/4383852.html 2015-04-01 14:57 by 辣椒酱, ...
- Android实现推送方式解决方案 - 长连接+心跳机制(MQTT协议)
本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息. ...
随机推荐
- Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
目录 简介 Spring Boot的基本操作 Spring Boot的构建和部署 Spring Boot工具 Spring Boot的测试 Spring Boot中使用JPA Spring Boot和 ...
- OpenHarmony轻量设备Hi3861芯片开发板启动流程分析
引言 OpenHarmony作为一款万物互联的操作系统,覆盖了从嵌入式实时物联网操作系统到移动操作系统的全覆盖,其中内核包括LiteOS-M,LiteOS-A和Linux.LiteOS-M内核是面向I ...
- Git 13 暂存代码
如果当前分支的功能还没开发完,无法提交代码. 但出现了紧急情况(比如线上BUG),需要立即切换到其他分支进行开发. 此时可以先暂存当前分支代码,等切换回当前分支的时候再恢复. 1.暂存当前分支变更: ...
- Python调用动态库,获取BSTR字符串
今天客户在用Python调用我们的动态库的时候,遇到一个问题,调用动态库中的函数,函数返回的是BSTR字符串,但是客户接收到的是一个8位长度的数字. 动态库函数原型:EXTERN_C BSTR ELO ...
- 使用Helm部署Wikijs
使用 Helm 部署 Wiki.js ️ 参考文档: Wiki.js 官方文档 - 安装 - Kubernetes Wiki.js 使用 Helm 安装 Wiki.js 官方文档 - 安装 - 侧加载 ...
- HDC2021技术分论坛:OpenHarmony驱动框架解读和开发实践
转自:OpenAtom OpenHarmony 作者:yuanbo,华为高级工程师 在IoT时代下,终端设备差异较大.形态各异.尺寸各异.交互方式各异,解决设备适配问题无疑是实现万物互联的一个关 ...
- 定了!12支队伍进入HarmonyOS极客马拉松2023决赛
12支队伍将在8月初,华为开发者大会(HDC.Togerther)上展开巅峰对决!
- 英语 one day
前言 I do not know if it work,but just go. 内容 1.quote vt:摘要,引用 n:引语 He quote a passage from the presid ...
- 单元测试必备:Asp.Net Core代码覆盖率实战,打造可靠应用 !
引言 在前几章我们深度讲解了单元测试和集成测试的基础知识,这一章我们来讲解一下代码覆盖率,代码覆盖率是单元测试运行的度量值,覆盖率通常以百分比表示,用于衡量代码被测试覆盖的程度,帮助开发人员评估测试用 ...
- 融合数据库生态:利用 EventBridge 构建 CDC 应用
简介: 近期,EventBridge 事件流已经支持了基于阿里云 DTS服务的 CDC 能力.本文将从 CDC.CDC 在 EventBridge 上的应用以及若干最佳实践场景等方面,为大家介绍如何利 ...