CVE-2023-46604 Apache ActiveMQ RCE漏洞

一、Apache ActiveMQ简介

Apache ActiveMQ是一个开源的、功能强大的消息代理(Message Broker),由 Apache Software Foundation 所提供。ActiveMQ 支持 Java Message Service(JMS)1.1 和 2.0规范,提供了一个高性能、简单、灵活和支持多种语言(Java, C, C++, Ruby, Python, Perl等)的消息队列系统。
项目地址:https://github.com/apache/activemq

二、影响版本

Apache ActiveMQ < 5.18.3
Apache ActiveMQ < 5.17.6
Apache ActiveMQ < 5.16.7
Apache ActiveMQ < 5.15.16

三、DIFF分析

https://github.com/apache/activemq/compare/activemq-5.15.15…activemq-5.15.16
在这里插入图片描述

根据DIFF可以看到,修复方案里为BaseDataStreamMarshaller类添加了validateIsThrowable()方法,该方法对传入的类名进行校验,校验其是否为Throwable类或其子类。
在这里插入图片描述

由此推测,该漏洞很可能为,没有对clazz进行校验,而引发的反序列化及其他可能出现RCE的因素所导致。

四、漏洞分析

下载版本5.15.15:
https://github.com/apache/activemq/releases/tag/activemq-5.15.15

根据搜索得到父子关系:
BaseDataStreamMarshaller -> BaseCommandMarshaller -> ResponseMarshaller -> ExceptionResponseMarshaller

在ExceptionResponseMarshaller中,其tightUnmarshal/looseUnmarshal方法会调用tightUnmarsalThrowable/looseUnmarsalThrowable,之后向上继续调用。
在这里插入图片描述
在这里插入图片描述

最终调用到BaseDataStreamMarshaller的createThrowable方法,可以调用任意类的带有一个String参数的构造方法,缺乏对clazz的校验,后续使用getConstructor()方法触发反序列化。
在这里插入图片描述
ExceptionResponseMarshaller意为对ExceptionResponse进行反序列化,在该类中,info使用ExceptionResponse类,定义如下:
在这里插入图片描述

因此需要构建一个ExceptionResponse发送给ActiveMQ,之后ActiveMQ会自己触发createThrowable(),在调用getException获取异常对象时,该类使用setException传入一个Throwable类,然后调用onway发送,成功反序列化
在这里插入图片描述

同时,ClassPathXmlApplicationContext可以根据指定xml实例化类,因此可以利用它去extends Exception类去加载xml实现RCE

五、漏洞复现

我的环境及POC整合包
https://github.com/LiritoShawshark/CVE-2023-46604_ActiveMQ_RCE_Recurrence
使用后无视下述搭建过程

使用windows部署activeMQ服务器,61616端口默认开放给openwire

https://activemq.apache.org/activemq-5015015-release
在这里插入图片描述

解压后,在bin目录下进入x64或者x32,以管理员权限执行activemq.bat
如果开启失败则需要查看端口是否被占用,本次复现最开始没有成功因为MQTT端口被占用,后续将conf文件夹下的activemq.xml进行修改即可成功运行
在这里插入图片描述
访问8161端口,证明服务开启(admin/admin)
在这里插入图片描述
构建poc.xml并开启http服务:
在这里插入图片描述
poc执行成功
在这里插入图片描述

相关推荐

  1. CVE-2024-1086漏洞处理

    2023-12-23 23:50:01       31 阅读
  2. CVE-2023-48795漏洞修复方法

    2023-12-23 23:50:01       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-23 23:50:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-23 23:50:01       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-23 23:50:01       82 阅读
  4. Python语言-面向对象

    2023-12-23 23:50:01       91 阅读

热门阅读

  1. hyperf 十八 数据库 一

    2023-12-23 23:50:01       56 阅读
  2. 考研英语语法(二十三)

    2023-12-23 23:50:01       54 阅读
  3. Git常用命令

    2023-12-23 23:50:01       59 阅读
  4. MongoDB聚合管道的限制

    2023-12-23 23:50:01       60 阅读
  5. 每日一题(LeetCode)----栈和队列--逆波兰表达式求值

    2023-12-23 23:50:01       64 阅读
  6. lc1:两数之和

    2023-12-23 23:50:01       62 阅读
  7. 漫谈计算机安全

    2023-12-23 23:50:01       54 阅读