CVE-2023-33246
产品介绍
RocketMQ是阿里巴巴在2012年开发的分布式消息中间件,后捐献给Apache软件基金会并成为Apache的顶级项目。RocketMQ专为万亿级超大规模的消息处理而设计,具有高吞吐量、低延迟、海量堆积、顺序收发等特点。
漏洞概述
RocketMQ 5.1.0及以下版本,在一定条件下,存在远程命令执行风险。漏洞源于RocketMQ的NameServer、Broker、Controller等多个组件暴露在公网中且缺乏权限校验。攻击者可以利用该漏洞利用更新配置功能以RocketMQ运行的系统用户身份执行任意操作系统命令。
受影响版本
5.0.0 <= Apache RocketMQ < 5.1.1
4.0.0 <= Apache RocketMQ < 4.9.6
漏洞分析
测试环境搭建
调试环境
访问项目官方仓库获取受影响漏洞版本源码
1
| https://github.com/apache/rocketmq/releases
|
使用idea导入项目后配置运行时环境变量ROCKETMQ_HOME

ROCKETMQ_HOME
为ROCKETMQ运行家目录,配置好环境变量后在ROCKETMQ_HOME
指向的目录行新建文件夹conf
,进入conf
目录并新建文件logback_broker.xml
,将以下内容复制到该文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true"> <property name="CATALINA_BASE" value="**/logs"></property> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder charset="UTF-8"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE1" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${CATALINA_BASE}/aa.%d{yyyyMMdd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder charset="UTF-8"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE2" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${CATALINA_BASE}/bb.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${CATALINA_BASE}/bb.%d{yyyyMMdd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder charset="UTF-8"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="CUSTOM" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${CATALINA_BASE}/custom.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${CATALINA_BASE}/custom.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder charset="UTF-8"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="ERROR"> <appender-ref ref="CONSOLE" /> </root> <logger name="file1" level="DEBUG"> <appender-ref ref="FILE1" /> </logger> <logger name="file1" level="INFO"> <appender-ref ref="FILE2" /> </logger> <logger name="custom" level="INFO"> <appender-ref ref="CUSTOM" /> </logger> </configuration>
|
环境配置完成后运行主类org.apache.rocketmq.broker.BrokerStartup
启动ROCKETMQ Brocker,控制台输出以下内容则Brocker启动成功

靶场搭建
使用vulhub靶场一键搭建
https://github.com/vulhub/vulhub/tree/master/rocketmq/CVE-2023-33246
详情
Broker在启动时会首先创建一个BrokerController
然后运行它

BrockerController创建过程中主要进行了配置文件解析、命令行解析、网络服务配置、日志配置等操作。
Controller启动时相继启动以下服务,其中在启动remotingServer
服务时会启动broker
监听在默认的10911
端口

在进行filterServerManager
启动过程中会以30S的频率轮询创建filterServer

创建filterServer
时调用方法org.apache.rocketmq.broker.filtersrv.FilterServerManager#buildStartCommand
解析数据拼接参数

在进行参数拼接过程中会从brokerConfig
中获取rocketmqHome
与namesrvAddr
两个值。
我们可以通过模拟RocketMQ协议向10911端口发送特制的数据包来影响rocketmqHome
的值为可控的值,又因应用在进行命令拼接过程中未对用户的输入值进行有效的过滤,从而导致任意命令执行,此时我们使用网络上公开的PoC向10911端口发送数据然后调试


可以看到,此时获取的rocketmqHome
值已经变更为我们输入的Payload
在buildStartCommand
方法调用完毕后,会返回拼接的字符串然后调用org.apache.rocketmq.broker.filtersrv.FilterServerUtil#callShell
方法进行命令执行
整个流程的调用栈为

修复措施
1、非必须勿向互联网开放不必要的服务端口,控制暴露面;
2、关键服务增加用户权限校验;
3、升级软件到不受影响的版本或最新版。
参考链接
软安解决方案