ShiroAttack2实战指南:Apache Shiro漏洞检测与利用的技术实现
【免费下载链接】ShiroAttack2shiro反序列化漏洞综合利用,包含(回显执行命令/注入内存马)修复原版中NoCC的问题 https://github.com/j1anFen/shiro_attack项目地址: https://gitcode.com/gh_mirrors/sh/ShiroAttack2
Apache Shiro作为Java安全框架广泛用于身份验证和会话管理,但其默认配置中的rememberMe功能存在长期未修复的安全隐患。ShiroAttack2正是针对这一漏洞场景开发的综合利用工具,能够帮助企业安全团队快速检测和验证Shiro-550漏洞风险。
Shiro-550漏洞的持久性根源
Shiro框架的rememberMe功能自2016年公开漏洞以来,至今仍在大量生产环境中存在风险。这种现象源于三个技术现实:
默认密钥的硬编码问题:Shiro 1.2.4及之前版本在CookieRememberMeManager中固定使用AES密钥kPH+bIxk5D2deZiIxcaaaA==。这个值被无数教程和脚手架代码复制传播,形成了广泛的安全盲点。
密钥替换的部署复杂性:rememberMe机制要求客户端和服务端使用相同的AES密钥。一旦密钥被写入配置文件、Docker镜像或源码仓库,要替换就需要所有节点同步更新,这在分布式系统中实施困难。
利用工具的易用性:GUI点击几下或CLI一行命令就能获取shell,使得攻击门槛极低,而防御成本相对较高。
技术实现原理:从加密到反序列化的完整链条
AES加密模式的技术适配
ShiroAttack2的核心挑战在于处理不同Shiro版本的加密机制差异。通过分析Apache Shiro的版本演进,工具实现了两种加密模式的智能切换:
CBC模式(Shiro ≤1.2.4):使用随机IV和硬编码默认密钥,采用链式块加密。工具通过CbcEncrypt类实现这一模式的支持,确保与旧版本Shiro的兼容性。
GCM模式(Shiro ≥1.2.5):引入IV和认证标签(AAD)机制,提供更强的安全性。GcmEncrypt类专门处理GCM模式的加密需求,自动检测目标系统的Shiro版本并选择相应模式。
这种设计避免了因加密模式不匹配导致的rememberMeCookie解密失败问题,确保攻击的兼容性。
反序列化利用链的多版本兼容
在src/main/java/com/summersec/attack/deser/payloads/目录下,ShiroAttack2实现了多种CommonsBeanutils利用链:
// CommonsBeanutils1.java - 标准利用链 // CommonsBeanutils1_183.java - 适配1.8.3版本 // CommonsBeanutilsString.java - 字符串触发利用链每个利用链类都实现统一的ObjectPayload接口,通过getObject方法生成攻击载荷。这种标准化设计使得新利用链的添加变得简单,同时确保与现有系统的兼容性。
核心功能模块:六步攻击流程的技术实现
1. 检测阶段:通过发送rememberMe=yes请求并检查Set-Cookie: rememberMe=deleteMe响应,快速识别Shiro框架存在。这一步骤利用了Shiro 1.x版本在遇到非法Cookie时必定返回deleteMe的技术特性。
2. 密钥爆破:使用SimplePrincipalCollection序列化数据配合候选密钥逐个尝试加密,通过响应中是否出现deleteMe来判断密钥正确性。工具内置了data/shiro_keys.txt字典,支持自定义扩展。
3. 利用链测试:自动探测可用的Gadget链,优先尝试String/AttrCompare/ObjectToStringComparator变体(无需commons-collections依赖),回退到依赖ComparableComparator的CB变体。
4. 命令执行:将Gadget链与TemplatesImpl回显类结合,生成加密的rememberMeCookie,命令通过Authorization头传递。
5. 内存马注入:使用相同的Gadget链注入Filter/Servlet/Interceptor等Web组件,实现持久化后门。
6. 密钥替换:通过内存马机制修改Shiro的AES密钥,使旧密钥失效,确保攻击的持久性。
架构设计:GUI与CLI的统一实现
ShiroAttack2在架构设计上的一个重要创新是通过类继承实现GUI和CLI的统一:
基础类(JavaFX TextArea):提供appendText等基础方法,作为整个输出系统的基石。
自定义子类(ConsoleTextArea):继承TextArea并重写appendText方法,通过OutputSink接口路由输出到不同目标。这一设计使得攻击逻辑代码零修改即可支持双模式。
核心服务(AttackService):处理所有业务逻辑,包括攻击执行、事件生成等核心功能。这个1000+行的类是工具的核心协调器,负责解析用户输入、调用加密模块、选择合适的Payload生成攻击载荷。
输出目标:支持GUI(桌面应用)和CLI(命令行)两种输出模式,通过ControllersFactory注册表注入假的MainController实现逻辑复用。
模块化生成器系统:适配器模式的应用
ShiroAttack2的生成器模块采用了创新的适配器模式设计,确保攻击载体的灵活性和兼容性:
GeneratorFacade统一入口:作为生成器系统的门面,GeneratorFacade类提供了统一的API接口,上层模块无需关心底层实现细节。
多生成器适配:
LegacyMemshellGeneratorAdapter:内置旧版内存马生成器JegEchoGeneratorAdapter:外部JAR集成的回显生成器JmgMemshellGeneratorAdapter:外部JAR集成的内存马生成器
自动回退机制:当任一模块失败时,系统会自动回退到其他可用模块,确保攻击的连续性。这种设计通过虚线箭头表示的回退路径实现。
实战应用场景:从检测到持久化的完整操作
命令行模式的技术实现
ShiroAttack2的CLI模式展示了工具从图形界面向自动化脚本集成的技术演进:
核心命令架构:
detect:探测目标是否为Shiro框架crack:爆破或验证Shiro AES密钥exec:执行系统命令(自动探测Gadget链)memshell:注入内存马(支持哥斯拉/冰蝎/蚁剑等)changekey:替换目标Shiro密钥
JSON输出模式:通过--json参数启用结构化输出,所有以{开头的行都是JSON格式的日志,便于脚本和AI系统解析。这种设计使得工具可以轻松集成到自动化安全测试流程中。
实际攻击示例
# 探测目标 java -cp shiro_attack-5.1.0-all.jar com.summersec.attack.CLI.MainCLI detect -u http://192.168.1.100:8080/login # 爆破密钥 java -cp shiro_attack-5.1.0-all.jar com.summersec.attack.CLI.MainCLI crack -u http://192.168.1.100:8080/login --cbc # 执行命令 java -cp shiro_attack-5.1.0-all.jar com.summersec.attack.CLI.MainCLI exec -u http://192.168.1.100:8080/login -c "whoami" --cbc # 注入内存马 java -cp shiro_attack-5.1.0-all.jar com.summersec.attack.CLI.MainCLI memshell -u http://192.168.1.100:8080/login -t Filter技术演进路线:从工具到平台
第一阶段(2023,5.0.x):工具最初作为JavaFX GUI桌面应用出现,主要解决Shiro-550漏洞的基础利用问题。这一阶段的核心挑战是如何在单一界面中集成多种攻击功能。
第二阶段(2024,5.1.x-5.2.x):引入GUI+CLI双模式架构,通过ConsoleTextArea类的设计创新,实现了攻击逻辑的完全复用。AttackService作为核心服务层,通过继承JavaFX的TextArea并重写appendText方法,实现了GUI和CLI的无缝切换。
第三阶段(2025+,5.3.x+):向Server API、CI/CD集成和AI智能代理演进,标志着工具从手动操作向自动化安全测试的转变。
部署与构建:快速上手指南
环境要求与目录结构
# 环境要求 - Java 8(推荐 Zulu JDK 8) - 无需额外安装,下载 fat JAR 直接运行 # 目录结构 ./ ├── shiro_attack-{version}-SNAPSHOT-all.jar ├── data/ │ └── shiro_keys.txt # Key 字典,每行一个 Base64 Key └── lib/ # CommonsBeanutils 各版本 JAR ├── commons-beanutils-1.8.3.jar └── commons-beanutils-1.9.2.jar构建流程
# 安装本地 JAR(仅首次需要) mvn install:install-file -Dfile=libs/jEG-Core-1.0.0.jar -DgroupId=jeg -DartifactId=jeg-core -Dversion=1.0.0 -Dpackaging=jar mvn install:install-file -Dfile=libs/jmg-sdk-1.0.9.jar -DgroupId=jmg -DartifactId=jmg-sdk -Dversion=1.0.9 -Dpackaging=jar # 打包 fat JAR(Java 8) mvn clean package -DskipTests # 产物: target/shiro_attack-5.1.0-all.jar技术选型与设计决策
为什么选择JavaFX而不是Swing或Web技术?
JavaFX提供了现代化的UI组件和CSS样式支持,同时保持了与Java生态系统的紧密集成。更重要的是,JavaFX的TextArea组件可以被继承和扩展,为GUI和CLI的统一输出架构提供了技术基础。
为什么采用适配器模式设计生成器系统?
适配器模式允许系统在不修改现有代码的情况下集成新的生成器实现。当新的回显或内存马生成技术出现时,只需实现相应的适配器接口即可集成到现有系统中,保持了系统的开放性和可扩展性。
如何处理不同Shiro版本的兼容性问题?
通过CbcEncrypt和GcmEncrypt两个独立的加密实现类,工具能够自动检测目标系统的Shiro版本并选择相应的加密模式。这种设计避免了"一刀切"的解决方案,提高了攻击的成功率。
实际应用中的技术挑战与解决方案
挑战一:反序列化利用链的版本兼容性
问题:不同环境中的CommonsBeanutils版本差异导致利用链失效。
解决方案:实现多版本CommonsBeanutils gadget链,包括1.8.3、1.9.2以及String/AttrCompare/ObjectToStringComparator变体。通过自动探测机制选择最合适的利用链。
挑战二:加密模式的自适应切换
问题:Shiro 1.2.5版本引入了GCM加密模式,与旧版CBC模式不兼容。
解决方案:实现双重加密尝试机制,CBC和GCM模式各走一遍,哪个命中锁哪个。这种"试错"策略虽然增加了请求次数,但确保了兼容性。
挑战三:输出系统的统一管理
问题:GUI和CLI需要共享相同的攻击逻辑但输出到不同目标。
解决方案:通过继承JavaFX的TextArea并重写appendText方法,将输出路由到不同的OutputSink实现。这种设计使得攻击逻辑代码无需修改即可支持多种输出模式。
扩展性与维护性设计
模块化设计
ShiroAttack2采用分层架构设计,将加密、Payload生成、HTTP通信、UI展示等关注点分离。这种设计使得每个模块可以独立开发和测试,提高了代码的可维护性。
接口标准化
所有Payload生成器都实现统一的ObjectPayload接口,所有输出目标都实现OutputSink接口。这种标准化设计使得系统易于扩展,新的功能模块只需实现相应的接口即可集成。
配置外部化
攻击参数、密钥字典、代理设置等都通过外部文件或命令行参数配置,避免了硬编码。这种设计使得工具可以灵活适应不同的使用场景。
总结:技术创新的实际价值
ShiroAttack2的技术创新不仅体现在功能实现上,更重要的是其架构设计的先进性:
- 关注点分离:UI、加密、攻击逻辑等模块独立设计,便于维护和扩展
- 接口标准化:统一的Payload生成接口设计,支持快速集成新利用链
- 多版本兼容:智能处理不同Shiro版本和加密模式的技术挑战
- 自动化集成:JSON输出和CLI模式支持自动化安全测试流程
通过深入分析ShiroAttack2的技术实现,我们可以看到一款优秀安全工具的技术演进路径:从解决具体问题出发,通过创新的架构设计,最终形成完整的技术解决方案。这种从实践到理论,再从理论指导实践的技术演进模式,值得所有安全工具开发者学习和借鉴。
对于企业安全团队而言,理解ShiroAttack2的技术实现不仅有助于更好地使用这款工具,更重要的是能够借鉴其设计思路,构建更加健壮和可维护的安全检测系统。
【免费下载链接】ShiroAttack2shiro反序列化漏洞综合利用,包含(回显执行命令/注入内存马)修复原版中NoCC的问题 https://github.com/j1anFen/shiro_attack项目地址: https://gitcode.com/gh_mirrors/sh/ShiroAttack2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考