Shiro 不出网怎么利用
1. 利用内存马
这是最常见且有效的方法之一。内存马是一种将恶意代码直接注入到目标服务器内存中的技术,它不会在磁盘上留下任何文件,因此难以被传统的杀毒软件和文件监控系统发现
实现思路:
- 注入 WebShell: 通过 Shiro 反序列化漏洞执行一个内存中的 Shell 代码。这个 Shell 通常是一个 Servlet、Filter 或者 JSP 的形式。它接收你的 HTTP 请求,然后执行命令并将结果通过 HTTP 响应返回
- 通信方式: 你需要找到一个能够与目标服务器交互的 HTTP 端点(Endpoint)。例如,你可以注入一个 Filter,它会监听特定的 URL 路径,当你的请求命中这个路径时,Filter 就会被触发,执行你传入的命令,然后将命令执行结果作为 HTTP 响应的一部分返回给你
优点:
- 隐蔽性高,不依赖外网连接
- 可以绕过很多安全检测
- 可以实现双向通信,方便后续操作
缺点:
- 需要一定的 Java 基础和内存马编写能力
- 服务器重启后,内存马会消失
2. 利用 JRMP 协议进行反向连接
如果目标服务器能够出网,但限制了 HTTP/HTTPS 协议,你还可以尝试通过其他协议进行反向连接。JRMP(Java Remote Method Protocol)是 Java RMI (Remote Method Invocation) 的底层协议,可以用于远程调用对象
实现思路:
- 创建 JRMPListener: 在你的攻击机上运行一个 JRMPListener,这个 Listener 监听一个端口,等待目标服务器连接
- Shiro 利用链: 使用 Shiro 反序列化漏洞,在目标服务器上执行一段代码,这段代码会去连接你的 JRMPListener
- 获取 Shell: 一旦连接建立,你可以通过这个通道在目标服务器上执行命令或者进行其他操作
优点:
- 利用 JRMP 协议,绕过一些基于 HTTP/HTTPS 的网络限制
缺点:
- 依然需要目标服务器能够出网
- 需要编写或使用专门的 JRMP 利用工具
3. 利用文件操作
虽然不能出网,但我们仍然可以利用 Shiro 反序列化漏洞来操作服务器上的文件
实现思路:
- 写入 WebShell: 通过反序列化漏洞,执行文件写入操作,将一个 WebShell 文件(例如
webshell.jsp
)写入到目标服务器的 Web 目录下 - 利用已有的 WebShell: 如果你发现服务器上已经存在一个可写的目录,或者存在一些可以被利用的日志文件等,也可以将命令执行的结果写入到这些文件中
具体步骤:
- 使用
URLDNS
或者其他利用链来验证漏洞存在性 - 找到一个可写的路径,例如
webapps/ROOT/
目录 - 构造一个恶意的序列化 payload,其中包含写入文件的操作。例如,可以使用
CommonsCollections
或者Jdk7u21
等利用链,然后调用Runtime.exec()
来执行echo "恶意代码" > /path/to/shell.jsp
命令
优点:
- 不需要服务器出网
- 操作直观,容易理解
缺点:
- 权限问题: 需要目标服务器用户具有写入权限
- 路径问题: 需要知道 Web 目录的绝对路径,或者通过其他方式推测
4. 命令执行带回显
如果目标服务器不出网,但我们仍然可以执行命令,那么如何看到命令执行的结果呢?
实现思路:
- 写入文件,然后读取: 执行命令,并将命令执行的结果重定向到一个可读的目录,例如 Web 目录下的一个新文件。然后,你再通过浏览器访问这个文件,就可以看到命令执行的结果了
- 利用报错: 构造一个特殊的命令,使得命令执行结果作为错误信息输出。例如,一些命令在执行失败时会返回有用的信息
具体步骤:
- 写入文件:
ls -la > /tmp/result.txt
- 再读取文件: 再次构造反序列化 payload,执行
cat /tmp/result.txt
,然后将结果写入到可访问的 Web 文件中,或者通过其他方式带出
优点:
- 不依赖网络连接
缺点:
- 操作繁琐,需要多次构造 payload
- 容易被检测