目录
1、Apache Shiro简介
2、漏洞原理
关键因素:
漏洞分析:
漏洞特征:
3、影响版本
4、漏洞复现
任意命令执行
GETSHELL
防御措施
1、Apache Shiro简介
Apache Shiro是一个Java安全框架,执行身份验证、授权、密码和会话管理。
2、漏洞原理
Apache Shiro框架提供了记住我(rememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。Shiro对rememberMe的cookie做了加密处理,shiro在CookieRememberMeManage类中将cookie中rememberMe字段内容分别进行序列化、AES加密、Base64编码。
- 检索RememberMe Cookie的值
- Base 64解码
- AES解密(加密密钥硬编码)
- 进行反序列化操作(未过滤处理)
攻击者可以使用Shiro的默认密钥构造恶意序列化对象进行编码来伪造用户的Cookie,服务端反序列化时触发漏洞,从而执行命令。
关键因素:
AES的加密密钥在Shiro的1.2.4之前版本中使用的是硬编码: KPH+blxk5D2deZilxcaaaA==,只要找到密钥后就可以通过构造恶意的序列化对象进行编码,加密,然后作为Cookie加密发送,服务端接收后会解密并触发反序列化漏洞。在1.2.4之后,ASE秘钥就不为默认了,需要获取到Key才可以进行渗透。
漏洞分析:
Apache Shiro默认使用了CookieRememberMeManage,其处理cookie是的流程是:得到rememberMe的cookie值 > Base64解码 > AES解密 > 反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞
漏洞特征:
在返回包的Set-Cookie中存在rememberMe=deleteMe字段
3、影响版本
Apache Shiro <= 1.2.4
4、漏洞复现
任意命令执行
(这里也可以使用收集的硬编码来做,我使用工具运行,其原理一样的)
漏洞环境搭建采用vulhub,具体方式,这里不在赘述。环境启动后,浏览器访问一下,8080端口映射
使用BP工具查看下数据包,是否存在我们的漏洞条件:
使用工具:
GitHub地址:GitHub - feihong-cs/ShiroExploit-Deprecated: Shiro550/Shiro721 一键化利用工具,支持多种回显方式Shiro550/Shiro721 一键化利用工具,支持多种回显方式. Contribute to feihong-cs/ShiroExploit-Deprecated development by creating an account on GitHub.https://github.com/feihong-cs/ShiroExploit工具使用后,我们可以输入些自己想要输入的命令:
这里我就简单创建个文件,以达到我们想要的效果
进入docker容器,查看创建文件是否成功,很显然,成功创建czz
GETSHELL
不仅可以执行任意命令,也可以反弹shell:
使用kali来进行监听,并用我们的工具来做反弹shell;(这个工具比较简单方便)
在kali下我们成功得到客户端的shell,成功getshell
复现成功!
防御措施
- 升级Shiro到最新版本
- WAF拦截Cookie中长度过大的rememberMe值
通过看了这位大佬的博客,学习到了shiro反序列化漏洞,也推荐给大家。
Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437) – 大鸟安全