记录一次对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时的推送过来新的消息,很方便的阅读最新的新闻信息. ...
随机推荐
- 1开幕在即 | “万物互联,使能千行百业”2022开放原子全球开源峰会OpenAtom OpenHarmony分论坛
7月27日下午,聚焦开源产业与生态的2022开放原子全球开源峰会OpenAtom OpenHarmony分论坛将在北京亦创国际会展中心盛大开幕. 作为OpenHarmony工作委员会联合生态合作伙伴为 ...
- MogDB 操作系统优化指南
MogDB 操作系统优化指南 本文出处:https://www.modb.pro/db/413280 在性能调优过程中,可以根据实际业务情况修改关键操作系统(OS)配置参数,以提升 MogDB 数据库 ...
- Unity 音频资源优化
1.声道设置 (1).不设置 单声道 音频大小为下图 (2).设置单声道 音频大小为下图 2.加载类型 (1).Decompress On Load 使用内存8.1M (2).Compressed I ...
- 抓包整理————ip 协议二[十三]
前言 介绍一下什么是nat协议和napt协议,和简单带一下LVS. 正文 什么是nat(Network Address Translation) 协议呢? 比如现在你家分配了一个ip,但是你家有10个 ...
- nginx重新整理——————编译nginx[二]
前言 简单编译一下nginx. 正文 为什么我们要去编译nginx. 系统安装,比如yum安装,会把nginx 模块直接编译进来. 这意味着,我们无法使用第三方的包.如果我们需要使用第三方包,那么需要 ...
- FPGA技术助手,notepad++ 两个插件
DS的时间很珍贵的 ,尤其是过了32岁以后,一身的病,扛不住996的制度.为了增加速度,只能想办法怎么在fpga工作上面降低时间.你有心思点来点去的GUI的界面.还不如用一个脚本完全做完.notepa ...
- (节流)js防止重复频繁点击或者点击过快方法
1.方法一:用定时器定时,没跑完定时器,点击按钮无效 <script> var isClick = true; $("button").on("click&q ...
- Linux下安装配置OpenResty服务器
OpenResty是一款基于Nginx和Lua的高性能Web平台,在nginx基础之上集成了大量的lua库,第三方模块等,以便搭建各种处理高并发.可扩展的Web应用.服务或网关,并且OpenResty ...
- 「开源人说」|AI普惠,阿里灵杰开源历程与思考
简介: 施兴 阿里巴巴资深技术专家 阿里巴巴开源项目EasyRec负责人 以下为开发者社区「开源人说」第四期--大数据&AI专场的主题分享,点击链接了解更多精彩详情 https://devel ...
- [GPT] 怎么查看我的 macbook 有多少显存
您可以按照以下步骤查看您MacBook的显存大小: 点击屏幕左上角的苹果图标,选择"关于本机". 在弹出的窗口中,点击"系统报告". 在左侧栏中选择&quo ...