记录一次对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时的推送过来新的消息,很方便的阅读最新的新闻信息. ...
随机推荐
- 直播预告丨 OpenHarmony 标准系统多媒体子系统之相机解读
5 月 26日(周四)晚上 19 点,OpenHarmony 开源开发者成长计划知识赋能第五期"掌握 OpenHarmony 多媒体的框架原理"的第六节直播课,即将开播! 深开鸿资 ...
- DS-Net:可落地的动态网络,实际加速1.62倍,快改造起来 | CVPR 2021 Oral
论文提出能够适配硬件加速的动态网络DS-Net,通过提出的double-headed动态门控来实现动态路由.基于论文提出的高性能网络设计和IEB.SGS训练策略,仅用1/2-1/4的计算量就能达到静态 ...
- IE8发送ajax请求无效
IE是个非常有个性的浏览器,常规的东西在他这个都不太好使. 最开始发送ajax请求,总是不成功,也没啥报错,反正就是请求被忽略了 然后我就考虑用原生的JS来实现,然后就:哎呀 可以了...... x ...
- 第二十篇:cookie和session
一.Cookie是什么鬼 二.基于cookie实现用户登录 三.基于cookie实现定制显示数据条数 四.带签名的cookie 五.CBV和FBV用户认证装饰器
- CentOS 7快速安装配置 Odoo 12
> Coding > CentOS 7快速安装配置 Odoo 12 CentOS 7快速安装配置 Odoo 12 Coding Alan 11个月前 (10-19) 4777次浏览 ...
- IaC:实现持续交付和 DevOps 自动化的关键
基础架构即代码(IaC)和 CI/CD 流水线最初似乎并不匹配.因为它们代表了两种不同的流程.IaC 主要关注基础设施的配置和开发,而 CI/CD 则围绕软件开发.测试和部署. 然而,将 IaC 集成 ...
- 深入分析C++对象模型之移动构造函数
接下来我将持续更新"深度解读<深度探索C++对象模型>"系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表. C++11新标准 ...
- SpringCloud做的微服务项目--外卖订餐系统
本项目用到的组件技术可以参考我上一篇博客,来学习. 项目需求: 客户端:针对普通用户,用户登录,用户退出,菜品订购,我的订单 后台管理系统:针对管理员,管理员登录,管理员退出,添加菜品,查询菜品,修改 ...
- python:在cmd中输入pip install pandas 显示‘pip’不是内部或外部命令,也不是可运行的程序 或批处理文件解决办法
1.首先找到自己文件夹中python的安装位置,一定要在Scripts文件夹下,可以看到pip文件,复制这时候的路径 2.使用快捷键 "win +R"打开cmd窗口,首先进入自己 ...
- 牛客网-SQL专项训练22
①在SQL中如何删除触发器:DROP TRIGGER 解析: 辨别:DROP TRIGGER 和 DELETE TRIGGER 删除触发器操作必须使用DROP语句进行,DELETE是删除行记录. ②请 ...