目录
这一篇是参考别的师傅的好文章对Shiro550反序列化漏洞的学习和练习
Shiro介绍
Apache Shiro是一个强大易用的java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。
漏洞原理
在Apache shiro的框架中,执行身份验证时提供了一个记住密码的功能(RememberMe),如果用户登录时勾选了这个选项,用户的请求数据包中将会在cookie字段多出一段数据,这一段数据包含了用户的身份信息,且是经过加密的。
加密的过程是:
用户信息=>序列化=>AES加密 (这一步需要用密钥key) =>base64编码=>添加到RememberMe Cookie字段。
勾选记住密码之后,下次登录时,服务端会根据客户端请求包中的cookie值进行身份验证,无需登录即可访问。
那么显然,服务端进行对cookie进行验证的步骤就是:
取出请求包中rememberMe的cookie值 => Base64解码=>AES解密 (用到密key) =>反序列化。
勾选rememberMe后,POST请求包中会有rememberMe字段,而服务端响应包的Set-Cookie中会有rememberMe=deleteMe字段,同时会生成对应的rememberMe字段。
简单来说:
知道密钥,因为Apache提供的密钥写死在代码里面,可以借此恶意构造cookie数据。
攻击者可以创建一个恶意对象,对其进行序列化、编码,然后将其作为cookie的rememberMe字段内容发送,Shiro 将对其解码和反序列化,导致服务器运行一些恶意代码。
判断是否存在漏洞
1.未登录的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段
2.登录失败的话,不管有没有勾选RememberMe字段,返回包都会有 rememberMe= deleteMe 字段
3.不勾选RememberMe,登录成功的话,返回包set-Cookie里有rememberMe=deleteMe字段,但是之后的所有请求中Cookie都不会有RememberMe字段
4.勾选RememberMe,登录成功的话,返回包seLCookie里有rememberMe=deleteMe字段,还会有remember 字段,之后的所有请求中Cookie都会有rememberMe字段
5.或者可以在cookie后面自己加一个rememberMe=1.看返回包有没有rememberMe= deleteMe
移动到如下路径:
/root/vulhub-master/shiro/CVE-2016-4437
然后使用docker-compose up -d来拉取环境:
拉取完成后可以访问一下web页面:
可以看到是一个登录页面
我们抓包查看一下
在返回包当中发现存在rememberMe=deleteMe字样,可以大概确定有配置shiro,下面我们就可以进行漏洞利用了
利用ShiroExploit工具执行命令:
Releases · feihong-cs/ShiroExploit-Deprecated · GitHub
进入工具后,输入漏洞的URL:
点击下一步会让我们选择漏洞的检测方式,我们可以直接选择下一步
然后成功的检测到了漏洞,我们可以执行命令
可以看到命令成功的执行了
利用shiro-exploit工具+综合利用工具执行命令:
GitHub - Ares-X/shiro-exploit: Shiro反序列化利用工具,支持新版本(AES-GCM)Shiro的key爆破,配合ysoserial,生成回显Payload
这个工具是一个命令行工具,需要有python环境,我们可以通过这个工具获取到key,然后在添加到其他shiro利用工具中来进行漏洞利
获取key
加入到漏洞利用工具中进行漏洞利用:
注:也可以只使用该工具,也可以进行密钥的破解
执行命令:
可以看到成功的执行命令了
参考文章:
Shiro550与shiro721反序列化原理及复现解析 - FreeBuf网络安全行业门户