ShiroAttack2工具实战:剖析Shiro-550漏洞原理与自动化利用

ShiroAttack2工具实战:剖析Shiro-550漏洞原理与自动化利用 1. 项目概述ShiroAttack2一个老漏洞的“新”工具Shiro-550一个2016年就被披露的Apache Shiro框架反序列化漏洞时至今日依然活跃在各大渗透测试报告和红队演练中。这听起来有点不可思议一个八年前的漏洞为什么还能屡试不爽这背后不是漏洞本身有多么高深莫测而是几个非常现实的原因叠加在一起形成了一个顽固的“安全债”。而ShiroAttack2正是针对这个“老而弥坚”的漏洞由社区开发者SummerSec维护的一款高度集成化的综合利用工具。它从最初的GUI图形界面发展到如今支持命令行CLI和结构化JSON输出的双模式工具其核心目标只有一个在获得合法授权的前提下高效、精准地完成对Shiro-550漏洞的检测、利用和后续操作。我第一次接触ShiroAttack2是在一次内部攻防演练中目标系统是一个使用了老旧框架的Web应用。手动构造Payload、尝试各种Gadget链、猜测加密Key的过程繁琐且容易出错。ShiroAttack2的出现将这一系列操作自动化、流程化极大地提升了测试效率。它不仅仅是一个“打点”工具更是一个从漏洞发现到权限维持的完整解决方案涵盖了密钥爆破、命令执行、内存马注入甚至密钥替换等高级利用手法。对于安全研究人员、渗透测试工程师和红队成员而言理解并熟练使用这个工具是应对依然广泛存在的Shiro框架风险的必备技能。接下来我将结合自身使用经验从工具原理到实战操作为你完整拆解ShiroAttack2 v2.2以当前主流版本为例的方方面面。2. 核心原理深度剖析Shiro-550为何经久不衰要真正用好ShiroAttack2必须理解它所要利用的漏洞本质。Shiro-550的根源在于Apache Shiro框架的“记住我”RememberMe功能。2.1 漏洞成因的三重“枷锁”这个漏洞能活这么久可以归结为三个环环相扣的现实因素第一重枷锁默认加密密钥的“原罪”。在Shiro 1.2.4及更早的版本中框架在CookieRememberMeManager类里硬编码了一个AES加密密钥kPHbIxk5D2deZiIxcaaaA。这个Base64编码的密钥就像一把“万能钥匙”被无数早期的开发教程、开源项目脚手架和示例代码原封不动地复制粘贴。即使开发者升级了Shiro版本如果配置文件中的shiro.aesCipherKey没有被主动修改系统依然在使用这个广为人知的默认密钥。这就为攻击者提供了第一个确定的突破口。第二重枷锁密钥更换的“高成本”。RememberMe功能的机制要求客户端浏览器Cookie和服务端使用完全相同的AES密钥来加密和解密身份信息。一旦这个密钥被写入应用的配置文件、打包进Docker镜像、或者提交到了代码仓库要更换它就不是改一个地方那么简单。它涉及到生成新的强随机密钥。更新服务端所有实例的配置文件或环境变量。确保更新过程中所有用户会话失效因为旧Cookie无法用新密钥解密。在分布式环境下需确保所有节点同步更新。 这种全链路的变更成本和可能带来的服务中断风险使得很多团队选择了“只要系统还能跑就不去动它”的鸵鸟策略让默认密钥一直留存。第三重枷锁极低的利用门槛。漏洞利用链Gadget Chain和工具已经高度成熟。攻击者不再需要深厚的Java反序列化知识使用像ShiroAttack2这样的工具只需要输入目标URL点击按钮或执行命令工具就能自动完成探测、密钥爆破、选择Gadget、执行命令的全过程。这种“傻瓜式”的攻击降低了技术门槛变相提高了漏洞的被利用概率。2.2 ShiroAttack2的攻击流程拆解工具的工作流程完美对应了手动利用的每一步并将其自动化探测阶段工具向目标发送一个包含rememberMeyes或任意值的Cookie。关键不在于Cookie的值而在于服务端的响应。如果响应头中包含Set-Cookie: rememberMedeleteMe则基本可以判定目标使用了Shiro 1.x框架并且我们的Cookie触发了反序列化错误因为“yes”无法被正确反序列化Shiro框架会设置此Cookie来通知客户端删除无效的RememberMe信息。这是漏洞存在的必要非充分条件。密钥爆破/验证阶段这是核心步骤。工具会利用一个已知的、可序列化的Java对象通常是SimplePrincipalCollection使用字典如data/shiro_keys.txt中的候选密钥逐个进行AES加密构造出新的rememberMeCookie发送给目标。判断依据是如果服务端返回的响应中没有deleteMe这个Cookie则说明序列化后的数据被成功解密且反序列化过程没有抛出异常即当前使用的密钥是正确的。这个过程完全依赖于Shiro框架的行为特征进行盲注式爆破无需依赖回显信息。Gadget链利用阶段在确认密钥后工具会准备真正的攻击载荷Payload。这个载荷由两部分组成Gadget链一系列精心构造的Java对象链目的是在反序列化时触发危险方法如Runtime.exec()。ShiroAttack2内置了多种CommonsBeanutils库不同版本的利用链变体如1.8.3, 1.9.2, AttrCompare, ObjectToStringComparator以应对目标环境依赖库的差异。回显类为了将命令执行的结果回传到HTTP响应中工具会动态生成或使用预定义的“回显类”如TomcatEcho, SpringEcho。这个类会被序列化并嵌入到Gadget链的最终触发点。命令执行将组装好的恶意序列化数据用正确的AES密钥加密放入rememberMeCookie中发送。需要执行的系统命令通常会被编码后放在HTTP请求的Authorization或Cmd等自定义头部中。服务端反序列化后执行命令并将结果通过回显类写入HTTP响应攻击工具再从响应体中提取结果。内存马注入与密钥替换高级利用在成功执行命令后为了获得更持久的控制权工具可以注入内存马如Filter型、Servlet型。更厉害的一招是“密钥替换”利用内存马注入的机制向目标服务器的Shiro运行时中注入代码动态修改其使用的AES密钥。成功后只有攻击者知道新密钥而其他使用默认密钥的攻击尝试都将失效实现了“独占”后门。注意以上所有操作必须在获得目标系统所有者明确书面授权的前提下进行。未经授权的测试是违法行为违反了《网络安全法》等相关法律法规。3. 工具部署与环境准备ShiroAttack2是一个Java项目运行它需要基本的Java环境。从v5版本开始它提供了GUI和CLI两种模式我们需要根据实际情况选择部署方式。3.1 环境与依赖安装首先确保你的操作系统中安装了Java运行环境JRE或开发工具包JDK。ShiroAttack2 v2.2对应社区版的v5.x需要Java 8或更高版本。我推荐使用JDK 8或JDK 11兼容性最好。可以通过命令行检查java -version接下来是获取工具。通常有两种方式直接下载Release包推荐访问项目的GitHub Release页面下载最新版本的打包文件。Release通常提供两种格式shiro_attack-version-jdk.jar一个独立的、可执行的Fat JAR包包含了大部分依赖。shiro_attack-version-jdk-bundle.zip一个压缩包除了JAR文件还包含了必需的data/字典目录和lib/依赖库目录。从源码编译适用于定制或研究# 1. 克隆代码仓库 git clone https://github.com/SummerSec/ShiroAttack2.git cd ShiroAttack2 # 2. 安装本地依赖一些第三方生成器库 mvn install:install-file -Dfilelibs/jEG-Core-1.0.0.jar -DgroupIdjeg -DartifactIdjeg-core -Dversion1.0.0 -Dpackagingjar mvn install:install-file -Dfilelibs/jmg-sdk-1.0.9.jar -DgroupIdjmg -DartifactIdjmg-sdk -Dversion1.0.9 -Dpackagingjar # 3. 使用Maven打包 mvn clean package -DskipTests编译完成后在target/目录下会生成shiro_attack-5.1.1-all.jar版本号可能不同。3.2 目录结构与关键文件无论哪种方式获取运行前请确保目录结构正确这是工具能正常工作的基础。一个标准的运行目录应如下所示./ ├── shiro_attack-5.1.1-all.jar # 主程序JAR包 ├── data/ │ └── shiro_keys.txt # AES密钥字典文件每行一个Base64编码的密钥 └── lib/ # 可选的依赖库目录包含不同版本的commons-beanutils等JARshiro_keys.txt这是密钥爆破的字典。工具自带的字典已经包含了一些常见密钥如默认的kPHbIxk5D2deZiIxcaaaA。在实际测试中你可以根据目标情况自行添加从其他渠道收集的或根据特定版本、项目特征生成的疑似密钥。lib/目录存放了不同版本的commons-beanutils等库的JAR文件。当工具尝试使用不同Gadget链时可能需要动态加载这些库。如果缺失工具可能会回退到使用其他链或报错。实操心得我习惯在拿到工具后第一时间备份原始的data/shiro_keys.txt然后创建一个自己的字典文件将目标系统可能使用的自定义密钥例如从其他类似项目、泄露的配置中发现的添加进去并放在工具同级目录使用时通过--key-file参数指定能显著提高爆破效率。4. 图形界面GUI模式实战详解对于初学者或需要交互式探索的场景GUI模式是最直观的选择。通过JavaFX构建的界面将复杂的功能模块化呈现。4.1 启动与主界面功能分区在确保Java环境正确后使用以下命令启动GUIjava -jar shiro_attack-5.1.1-all.jar或者如果你下载的是bundle包且位于正确目录直接双击JAR文件也可能启动取决于系统关联。启动后主界面通常分为几个核心区域目标配置区输入目标URL如http://target.com/login设置请求方法GET/POST、超时时间、代理等。漏洞检测区包含“检测”按钮用于初步判断是否为Shiro框架。密钥爆破区选择或加载密钥字典文件执行爆破。利用模块区这是核心功能区标签页形式组织包括命令执行在爆破出密钥后选择Gadget链、回显方式输入要执行的命令。内存马注入选择内存马类型Filter/Servlet等、连接密码对应冰蝎、哥斯拉等Webshell管理工具。密钥替换在已获取权限的基础上修改目标系统的Shiro密钥。日志输出区实时显示工具发送的请求、接收的响应以及操作结果是排查问题的主要依据。4.2 一次完整的GUI攻击流程假设我们对授权测试目标http://192.168.1.100:8080/login进行操作。第一步基础探测在URL框输入目标地址点击“检测”按钮。工具会发送一个携带无效rememberMeCookie的请求。观察日志输出和响应。如果看到返回头中有Set-Cookie: rememberMedeleteMe日志提示“目标可能为Shiro框架”则初步确认。第二步密钥爆破在密钥爆破区域确认字典文件路径默认为data/shiro_keys.txt。点击“开始”按钮。工具会开始遍历字典中的密钥。这个过程是自动的你可以在日志区看到尝试的每一个密钥和响应特征。当发现某个密钥的响应中不再包含deleteMe时工具会高亮提示“找到有效Key[密钥]”例如kPHbIxk5D2deZiIxcaaaA。第三步命令执行切换到“命令执行”标签页。“已获取Key”框会自动填入上一步找到的密钥。Gadget选择这里有技巧。如果不确定目标环境可以勾选“自动选择”。工具会按照内置的优先级通常是无CC依赖的链优先逐个尝试。你也可以根据经验手动选择例如目标系统较老可以尝试CommonsBeanutils1。回显方式根据目标Web容器选择。Tomcat常用TomcatEchoSpringBoot常用SpringEcho。如果都不确定可以选DFS-AllEcho深度优先尝试所有回显。命令输入在命令框输入系统命令如whoami。点击“执行”。观察日志如果成功命令执行的结果会显示在日志区或一个弹出框中。第四步高级利用内存马在命令执行成功后为了持久化可以注入内存马。切换到“内存马”标签页。选择内存马类型例如“Filter型”兼容性较好。设置连接密码和路径。例如类型选“Behinder”冰蝎密码设为pass123路径设为/filter。点击“注入”。成功后日志会提示内存马注入的URL和密码。此时你就可以使用冰蝎客户端连接http://192.168.1.100:8080/filter密码pass123获得一个Webshell管理通道。第五步密钥替换可选这是一个巩固战果的操作。在“密钥替换”标签页输入旧密钥刚才爆破出来的和你想要设置的新密钥建议用工具生成或自己生成一个强随机Base64密钥点击“替换”。如果成功之后只有使用新密钥才能对该目标的Shiro进行有效利用。注意事项网络环境确保你的测试机与目标网络可达且没有防火墙或WAF拦截了你的攻击流量。GUI模式下的流量特征可能比较明显。超时设置对于网络延迟高或不稳定的目标适当增加“超时时间”避免因请求超时误判为失败。Gadget链选择如果“自动选择”失败可以手动尝试其他链。CommonsBeanutilsAttrCompare和CommonsBeanutilsObjectToStringComparator这两个链不依赖外部CC库成功率在特定环境下可能更高。回显问题如果命令执行后无回显可能是回显方式不匹配。尝试更换回显方式或者使用“无回显”模式配合DNSLog等外带通道验证命令执行。5. 命令行CLI模式与自动化集成对于需要批量测试、集成到自动化流水线或远程无图形界面的服务器上使用的场景CLI模式是更佳选择。从v5.0开始ShiroAttack2的CLI模式已经非常强大它与GUI共享同一套核心攻击逻辑AttackService。5.1 CLI核心命令详解CLI模式通过命令行参数驱动结构清晰。基本命令格式如下java -cp shiro_attack-5.1.1-all.jar com.summersec.attack.CLI.MainCLI 命令 [选项]主要命令包括命令功能描述常用选项示例detect探测目标是否为Shiro框架-u http://target.comcrack爆破或验证Shiro AES密钥-u http://target.com --key-file custom_keys.txtexec执行系统命令自动探测Gadget-u http://target.com -k found_key --cmd whoamimemshell注入内存马-u http://target.com -k found_key --type filter --password rebeyondchangekey替换目标Shiro密钥-u http://target.com -k old_key --new-key new_base64_keygui启动图形界面(无参数)每个命令都有丰富的选项来定制行为例如指定代理(--proxy)、设置超时(--timeout)、选择加密模式(--cbc/--gcm)、自定义请求头等。5.2 实战CLI操作流程我们以一次完整的CLI攻击为例假设目标同上(http://192.168.1.100:8080)。1. 探测目标java -cp shiro_attack-5.1.1-all.jar com.summersec.attack.CLI.MainCLI detect -u http://192.168.1.100:8080/login输出会明确告知是否检测到Shiro特征。2. 爆破密钥java -cp shiro_attack-5.1.1-all.jar com.summersec.attack.CLI.MainCLI crack -u http://192.168.1.100:8080/login --key-file data/shiro_keys.txt如果找到密钥输出会类似于[] Found valid key: kPHbIxk5D2deZiIxcaaaA。3. 执行命令使用上一步找到的密钥执行命令。--gadget和--echo可以留空让工具自动选择。java -cp shiro_attack-5.1.1-all.jar com.summersec.attack.CLI.MainCLI exec -u http://192.168.1.100:8080/login -k kPHbIxk5D2deZiIxcaaaA --cmd whoami成功后会输出命令执行的结果。4. 注入内存马Filter型冰蝎java -cp shiro_attack-5.1.1-all.jar com.summersec.attack.CLI.MainCLI memshell -u http://192.168.1.100:8080/login -k kPHbIxk5D2deZiIxcaaaA --type filter --password rebeyond --path /evilfilter成功后会给出内存马的连接地址和密码。5.3 JSON输出与自动化集成CLI模式最强大的特性之一是--json选项。启用后工具的输出会分为两个通道结构化日志以{开头的行是JSON格式的日志包含了操作步骤、状态、结果等结构化信息非常适合被脚本Python, Bash或AI Agent解析。原始输出不以{开头的行是传统的、人类可读的输出。例如使用JSON模式执行命令java -cp shiro_attack-5.1.1-all.jar com.summersec.attack.CLI.MainCLI exec -u http://target.com -k found_key --cmd id --json你可以用grep或jq轻松提取最终结果# 提取最后一条结果通常是命令输出 java -cp ... MainCLI exec ... --json 2/dev/null | tail -1 | jq -r .result这种设计使得ShiroAttack2可以无缝集成到自动化扫描平台或渗透测试工作流中。实操心得在编写自动化脚本时我强烈建议结合使用--json输出和超时控制。可以将CLI命令封装在一个函数中解析其JSON输出来判断每一步是否成功并决定后续流程。同时对于crack命令可以将其与自定义字典生成脚本结合实现针对性的密钥爆破。6. 高级技巧与深度利用场景掌握了基本操作后一些高级技巧和特定场景的应对策略能让你在实战中更加游刃有余。6.1 绕过WAF与流量隐蔽公开的漏洞利用工具流量特征明显很容易被WAFWeb应用防火墙拦截。ShiroAttack2提供了一些绕过机制但更需要测试者自己调整策略。自定义请求头与Cookie合并工具允许自定义HTTP头。你可以添加一些看似正常的头如X-Forwarded-For或将攻击载荷拆分到多个自定义头中。Cookie合并功能可以让你将rememberMe与其他正常Cookie合并发送降低可疑度。POST型探测有些WAF只严格检查GET请求的Cookie。ShiroAttack2支持使用POST方法发送探测请求有时可以绕过简单的规则。加密模式选择Shiro 1.2.5及以上版本默认使用AES-GCM加密模式而旧版使用CBC模式。工具支持--cbc和--gcm参数来强制指定。如果自动模式失败可以手动指定尝试。Gadget链选择WAF可能对常见的CommonsBeanutils1链有规则。尝试使用AttrCompare或ObjectToStringComparator这些变体链它们的序列化数据流有所不同可能绕过基于特征匹配的WAF。代理与延时使用--proxy参数设置代理将流量导向一个中间代理服务器该服务器可以对流量进行编码、分块等变形处理。在自动化脚本中在请求之间添加随机延时模拟人类操作。6.2 无Gadget依赖场景的利用这是一个比较棘手的场景目标系统存在Shiro-550漏洞也有正确的密钥但是环境中没有可用的commons-beanutils等库来构造Gadget链。ShiroAttack2的文档(docs/NoGadget.md)探讨了这种可能性。核心思路是寻找其他存在于目标classpath中的、可序列化的、能够构造出利用链的类。这需要测试者对目标应用的依赖库有深入了解。一种可行的方法是在通过其他途径如文件上传、信息泄露获取了部分权限后向目标classpath中注入必要的JAR文件然后再利用ShiroAttack2。这已经超出了标准工具的能力范围需要手动进行。6.3 内存马的深入理解与管理内存马是驻留在服务器内存中的后门重启即失效但隐蔽性强。ShiroAttack2支持注入多种类型Filter型最通用兼容性好通过动态注册Filter实现。Servlet型注册新的Servlet。Interceptor型针对Spring MVC框架。HandlerMethod型针对Spring Controller。Tomcat Valve型针对Tomcat容器底层。注入后的管理 注入内存马后你获得了一个Webshell通道。但需要注意内存马冲突重复注入同类型、同路径的内存马可能导致冲突或异常。内存马查杀目前主流的安全防护软件和HIDS主机入侵检测系统具备检测常见内存马的能力。冰蝎、哥斯拉等工具的流量特征也可能被识别。密钥替换的持久化通过changekey命令替换密钥是一种更深度的持久化。即使内存马被清除只要你持有新密钥依然可以重新利用Shiro漏洞进入。但要注意如果目标应用重启配置文件中若仍是旧密钥则你的新密钥会失效。6.4 与第三方生成器的集成ShiroAttack2 v5集成了jEG回显生成器和jMG内存马生成器。当内置的Payload生成失败时工具会尝试调用这些第三方生成器。这提高了在复杂环境下的兼容性和成功率。你需要确保运行目录下libs/中存在相应的JAR文件在bundle包中已包含。如果集成调用失败工具会自动回退到使用传统的Legacy方式生成Payload。7. 常见问题排查与实战避坑指南在实际使用中你肯定会遇到各种问题。下面是我总结的一些常见故障场景和排查思路。7.1 探测阶段常见问题问题1发送探测请求后没有任何deleteMe响应工具报告“未检测到Shiro”。可能原因与排查目标根本不是Shiro框架用其他方式确认目标技术栈。路径错误Shiro的过滤器可能只配置在特定路径如/admin/*。尝试更换不同的URL路径进行探测。网络问题请求被防火墙、负载均衡或WAF丢弃。检查网络连通性尝试使用代理或抓包查看请求是否真正到达目标。Shiro版本为1.2.5且配置了非默认密钥这种情况下即使发送错误的rememberMe如果密钥错误响应里也可能没有deleteMe行为因版本和配置而异。不能单纯以此判断非Shiro。问题2探测显示是Shiro但爆破密钥时所有密钥尝试后都返回deleteMe。可能原因与排查字典不全目标使用了非常冷门或自定义的密钥。扩大字典范围尝试使用弱密钥生成脚本如基于目标域名、公司名等特征生成扩充字典。加密模式不匹配Shiro 1.2.5使用GCM模式。尝试在爆破或执行时显式指定--gcm参数。反之对于老版本指定--cbc。WAF干扰WAF可能识别了爆破流量返回了统一的错误页面或拦截了请求。观察响应内容是否一致尝试降低请求频率添加随机延时。7.2 利用阶段常见问题问题3密钥爆破成功但执行命令时失败无回显或报错。可能原因与排查Gadget链不兼容目标环境缺少工具所选Gadget链依赖的类库。在GUI中尝试手动选择其他Gadget链如换用AttrCompare或在CLI中通过--gadget参数指定。回显方式不匹配目标Web容器不是Tomcat或Spring。尝试使用DFS-AllEcho让工具自动遍历所有回显方式或尝试NoEcho模式配合DNSLog外带数据验证命令是否执行。Java安全策略限制目标JVM可能设置了严格的安全管理器SecurityManager禁止执行命令。这种情况下可能需要寻找其他利用链或利用方式如文件读写。命令本身问题在命令执行框输入echo test或whoami这类简单命令确认。有时需要处理命令中的特殊字符或空格。问题4注入内存马成功但用冰蝎/哥斯拉连接不上。可能原因与排查路径或密码错误仔细核对注入时设置的路径和密码连接时确保完全一致。路径需要以/开头。内存马类型不兼容Filter型内存马可能被目标应用的现有过滤器链拦截或冲突。尝试注入Servlet型或Tomcat Valve型。杀软或RASP拦截内存马的类加载或执行过程被主机安全软件或运行时应用自我保护RASP拦截。查看工具日志是否有注入失败的异常信息。流量被拦截Webshell管理工具的流量特征可能被WAF或IDS识别。尝试使用这些工具提供的加密传输或自定义协议功能。7.3 性能与稳定性问题问题5爆破密钥速度很慢。优化建议使用CLI模式并考虑将字典精简。将最常用的密钥如默认Key、4AvVhmFLUs0KTA3Kprsdag等放在字典文件开头。如果是在内网测试可以适当减少超时时间(--timeout)。问题6工具运行报Java内存不足OutOfMemoryError错误。解决方案在启动Java时指定更大的堆内存。例如java -Xmx1024m -jar shiro_attack-5.1.1-all.jar或者对于CLI模式java -Xmx1024m -cp shiro_attack-5.1.1-all.jar com.summersec.attack.CLI.MainCLI ...7.4 法律与合规红线这是最重要也是最容易被忽视的“问题”。我必须再次强调授权是前提没有书面授权一切测试都是非法的。范围要明确授权测试的范围必须清晰不得越界。数据要保密测试过程中获取的任何数据都必须严格保密测试完成后应妥善清理。工具要管好此类工具只能在受控的环境如自家实验室、授权靶场中使用严禁传播给未授权人员或用于任何非法目的。ShiroAttack2是一个极其高效的工具它将一个经典漏洞的利用过程产品化、自动化。但工具越强大责任也越大。作为使用者我们不仅要掌握其技术细节以用于防御加固例如检查自己公司的系统是否使用了默认密钥更必须时刻绷紧法律和道德的弦。在合规的范围内让技术为我们所用去发现和修复问题这才是安全工作的真正价值所在。