前言

由于工作需要,特意翻查了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协议的渗透测试经历的更多相关文章

  1. MQTT协议(一)

    MQTT(Message Queue Telemetry Transport),遥测传输协议,提供订阅/发布模式,更为简约.轻量,易于使用,针对受限环境(带宽低.网络延迟高.网络通信不稳定),可以简单 ...

  2. MQTT协议的简单介绍和服务器的安装

    最近公司做的项目中有用到消息推送,经过多方面的筛选之后确定了使用MQTT协议,相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽. MQTT是IBM推出的一种针对移动终端设备的基于TCP/IP ...

  3. MQTT协议学习笔记

    1.前沿 万物联网的时代即将到来,物联网也由当初的概念开始进一步落实.随着无线网络技术飞速发展,各种设备都可以连接网络,实现远程控制.例如智能家居最近非常火爆,智能插座.智能LED灯.智能摄像头等.在 ...

  4. 安卓开发之mqtt协议

    首先物联网协议mqtt协议是基于tcp/ip协议的,使用了官方的mqttclient框架/**初始化mqttclient*/private void init() { try { //MQTT的连接设 ...

  5. HTTP协议和XMPP协议、MQTT协议

    应用层协议:每个应用层的都是为了解决某一类应用问题.而问题的解决又必须通过位于不同主机中的多个应用进程之间的通信和协同工作来完成.应用进程之间必须遵守严格的规则.应用层协议应当定义如下几个: 应用进程 ...

  6. MQTT协议学习研究 & Mosquitto简要教程(安装和使用)

    若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]——在RESTfu ...

  7. MQTT协议笔记之消息流

    前言 前面的笔记已把所有消息类型都过了一遍,这里从消息流的角度尝试解读一下. 网络故障 在任何网络环境下,都会出现一方连接失败,比如离开公司大门那一刻没有了WIFI信号.但持续连接的另一端-服务器可能 ...

  8. MQTT协议笔记之发布流程

    MQTT协议笔记之发布流程 前言 这次要讲到客户端/服务器的发布消息行为,与PUBLISH相关的消息类型,会在这里看到. PUBLISH 客户端发布消息经由服务器分发到所有对应的订阅者那里.一个订阅者 ...

  9. MQTT协议实现Eclipse Paho学习总结

    MQTT协议实现Eclipse Paho学习总结 摘自:https://www.cnblogs.com/yfliufei/p/4383852.html 2015-04-01 14:57 by 辣椒酱, ...

  10. Android实现推送方式解决方案 - 长连接+心跳机制(MQTT协议)

    本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息. ...

随机推荐

  1. 深入理解HashMap和TreeMap的区别

    目录 简介 HashMap和TreeMap本质区别 排序区别 Null值的区别 性能区别 共同点 深入理解HashMap和TreeMap的区别 简介 HashMap和TreeMap是Map家族中非常常 ...

  2. 从入门到精通:C++ 学习路线指南,附详细学习计划

    C++是一种高级编程语言,广泛用于开发操作系统.应用程序.游戏和各种工具.如果你想学习这门语言,以下是一个适合初学者的学习路线: 第一步:学习C++基础知识 在学习C++之前,你需要掌握一些基础知识, ...

  3. Python - 字典2

    Python - 访问字典项 您可以通过在方括号内引用其键名来访问字典的项: 示例,获取 "model" 键的值: thisdict = { "brand": ...

  4. 标签栏切换效果 JS

    标签栏切换效果 JS 要求:class为tab-box的元素用于实现标签栏的外边框,,分别实现标签栏的标签部分和内容部分. html <div class="tab-box" ...

  5. HarmonyOS应用事件打点开发指导

      简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志,难以识别其中的关键信息.因此,应用开发者需要一种数据打点机制,用来评估如访问数.日活.用户操作习惯以及影响用户使用的关键因素等关键 ...

  6. 重新整理.net core 计1400篇[七] (.net core 中的依赖注入)

    前言 请阅读第六篇,对于理解.net core 中的依赖注入很关键. 和我们上一篇不同的是,.net core服务注入保存在IServiceCollection 中,而将集合创建的依赖注入容器体现为I ...

  7. 重新整理数据结构与算法(c#)——算法套路贪心算法[二十八]

    前言 贪心算法,记得学的时候还是大学的时候,再次来总结一下吧. 贪心算法并不是指具体的固定代码,而是指一种思路,加入我们每次都选最好的选择,那么很大可能会得到最好的结果. 题目: 正文 思路,加入把k ...

  8. 前端之多线程 ---webworker

    一.啥是workerJavaScript为单线程,worker则为JavaScript创建多线程环境.使用场景如:计算文件hash,计算大于1G的文件hash过程是很慢的,但由于要将hash传给后端, ...

  9. 如何基于Django中的WebSockets和异步视图来实现实时通信功能

    本文分享自华为云社区<结合Django中的WebSockets和异步视图实现实时通信功能的完整指南>,作者: 柠檬味拥抱. 在现代Web应用程序中,实时通信已经成为了必不可少的功能之一.无 ...

  10. 【Oracle笔记】递归以及索引的一丢丢使用

    [笔记]递归以及索引的一丢丢使用 递归写法,树查询 connect by nocycle prior START WITH XXX CONNECT BY PRIOR XXX ORDER BY XXX ...