heapdump泄露Shiro key从而RCE
字数 1442 2025-08-26 22:11:57
Heapdump泄露Shiro Key导致RCE漏洞分析与利用
1. 漏洞概述
本漏洞是一个组合漏洞,通过Spring应用的heapdump文件泄露获取Shiro的加密密钥,进而实现远程代码执行(RCE)。该漏洞需要满足以下条件:
- 目标系统使用Spring框架并集成了Apache Shiro作为安全框架
- 存在heapdump文件泄露(通常通过/actuator/heapdump端点)
- 系统中存在可利用的反序列化链
2. 漏洞原理
2.1 背景知识
-
Shiro RememberMe功能:Apache Shiro提供了"记住我"功能,使用CookieRememberMeManager管理,通过AES加密存储用户身份信息。
-
Shiro密钥生成机制:
- Shiro 1.2.4及以上版本默认使用随机生成的密钥
- 密钥在每次Web环境启动时生成,重启前保持不变
- 密钥存储在JVM内存中
-
Heapdump文件:
- 是JVM内存的完整快照
- 包含运行时的所有对象和变量信息
- Spring Actuator可能暴露heapdump端点
2.2 漏洞成因
通过分析heapdump文件可以提取出Shiro的加密密钥,结合Shiro的反序列化漏洞实现RCE。
3. 环境搭建
测试环境已在GitHub开源:
https://github.com/P4r4d1se/heapdump_shiro_vuln
4. 漏洞利用步骤
4.1 获取heapdump文件
访问目标系统的heapdump端点(通常为/actuator/heapdump)下载heapdump文件。
4.2 提取Shiro密钥
有两种主要方法从heapdump中提取Shiro密钥:
方法一:使用JDumpSpider工具
- 下载工具:
https://github.com/whwlsfb/JDumpSpider - 运行命令:
java -jar JDumpSpider.jar heapdump - 在输出中查找
ShiroKey字段
方法二:使用jvisualvm工具
- 打开Java自带的jvisualvm工具(位于JDK目录/bin/jvisualvm.exe)
- 加载heapdump文件
- 在过滤器中输入:
org.apache.shiro.web.mgt.CookieRememberMeManager - 查找16字节的密钥值
4.3 密钥格式转换
获取到的密钥通常需要转换为base64编码格式才能用于利用。使用以下Python脚本转换:
import base64
import struct
print(base64.b64encode(struct.pack('<bbbbbbbbbbbbbbbb', 109, -96, 12, -115, 33, 59, 24, 112, 44, 124, 56, 110, -15, 59, 1, -41)))
4.4 利用密钥进行RCE
使用获取到的Shiro密钥,结合Shiro反序列化漏洞利用工具(如shiro-exploit)进行攻击。
5. 验证与防御
5.1 漏洞验证
- 重启服务器后再次获取heapdump,验证密钥是否变化
- 使用新密钥测试是否仍可利用
5.2 防御措施
-
保护heapdump端点:
- 禁用或限制访问Spring Actuator的heapdump端点
- 添加认证和授权机制
-
Shiro安全配置:
- 自定义强密钥而非使用随机生成
- 定期轮换密钥
- 禁用RememberMe功能(如不需要)
-
JVM安全:
- 限制敏感信息在内存中的存储时间
- 考虑使用内存加密技术
-
反序列化防护:
- 更新Shiro到最新版本
- 配置反序列化过滤器
6. 补充说明
- 该漏洞不特定于Shiro版本,只要有密钥泄露风险就可能存在
- 每次服务器重启会生成新的随机密钥,之前的密钥将失效
- 实际利用需要目标系统存在可用的反序列化利用链
7. 参考工具
- JDumpSpider: https://github.com/whwlsfb/JDumpSpider
- jvisualvm: JDK自带工具
- Shiro反序列化利用工具: 如shiro-exploit等