Shiro550漏洞原理分析-java反序列化ndayshiro550漏洞原理分析
slug
series-status
status
summary
date
series
type
password
icon
tags
category
引言
Shiro-550 反序列化漏洞大约在 2016 年就被披露了,但感觉直到近一两年,在各种攻防演练中这个漏洞才真正走进了大家的视野,Shiro-550 反序列化应该可以算是这一两年最好用的 RCE 漏洞之一,原因有很多:Shiro 框架使 用广泛,漏洞影响范围广;攻击payload经过AES加密,很多安全防护设备无法识别/拦截攻击
环境
- 注意,这里要用idea打开
./shiro/samples/web
目录不要搞错了~
编辑pom.xml文件,修改如下信息:
- 然后编译、基于tomcat运行即可

漏洞分析
漏洞点
首先进入测试的登录页面输入账密并点击remember me登录:

观察响应包:

可以看到这里返回了一长串的cookie,一般来说cookie或者token不会特别的长,但是它这里返回的cookie这么长就说明它里边一定是存了一定的信息。而这里存储信息最常用的方法就是序列化反序列化。
cookie分析
回到我们的源码中,可以利用idea去查找有哪些cookie相关的类:

最后我们找到这个CookieRememberMeManager这个类:

观察源码可以看到,这里获取cookie以后赋值名字为base64的变量后对其进行base64解码:

然后我们要进一步看它base64以后做了什么:

可以看到这里它会对base64解码后的字节码进行转换,转换成认证信息:

而在这个convert函数里,它则会先对字节码进行解密后反序列化:

接下来我们来观察这个解密方法:

可以看到它首先在487行获取了一个解密服务然后在489行进行解密,进入解密函数:

这里可以看到它的第一个参数为要解密的加密字节码,第二个就是密钥,那我们再回来看看这个函数的实参传入的是什么:


发现传入的就是这个decryptionCipherKey属性,find usage再去找到赋值它的地方:


再继续找:

可以看到这里实际传入的key就是一个常量:

然后利用这个密钥进行aes加密。
因此,这里的调用流程就应该是:
- 构造可以利用的payload代码
- 序列化
- 将序列化后的字节码aes加密
- 将加密后的base64编码
接下来,我们来看看该如何构造这个payload代码。
网上大部分shiro的教程也都是教的cc链,但是这个原生的shiro项目里虽然包含cc的包,但是我们利用
maven helper
插件可以看到,这里调用的cc包其实是用于test的,实际在攻击的过程中是无法使用的:
因此原生的话只能用cb链~

这一篇主要验证shiro的原理,因此不对这两个利用链做过多的纠结,直接用jdk自带的urldns利用链进行一下测试~
我们这次就直接用burp自带的dnslog:

然后利用我们之前的dns利用链的代码生成一份序列化payload:
再利用python写一份aes+base64加密脚本:
运行后得到结果:

将结果复制到Cookie的部分:

发包后拉取dns记录:

这里要注意,在我们的python代码中其实也能看出来,aes加密是需要一个初始向量的,就是那个iv。
而这个iv的设置也是根据shiro代码逻辑来定的。
这里可以看到,其实这个iv就是获取了加密字符串的初始的几个字节:

因此我们只需要随意传入一些字符即可。
Loading...