Apache Shiro简介

Apache Shiro 是一个功能强大、灵活的开源安全框架,它能很好地处理身份验证、授权、企业会话管理和加密等功能。以下是它可以完成的一些功能:

验证用户,核实身份
对用户进行访问控制,例如:
	1、确定是否为用户分配了特定的安全角色
	2、确定是否允许用户执行某些操作
在任何环境中使用Session API,即使在非web或EJB环境下。
在身份验证、访问控制或会话的生命周期,对事件做出响应。
聚合一个或多个用户安全数据的数据源,并作为一个单一的复合用户"视图"。
启用单点登录(SSO)功能
为没有关联到登陆的用户启用"Remember Me”服务
……

漏洞原理

Apache Shiro是一个Java安全框架,执行身份验证、授权、密码和会话管理。

Apache Shiro框架提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。
Shiro对rememberMe的cookie做了加密处理,shiro在CookieRememberMeManaer类中将cookie中rememberMe字段内容分别进行序列化、AES加密、Base64编码操作。
在识别身份的时候,需要对Cookie里的rememberMe字段解密。根据加密的顺序,不难知道解密的顺序为:

获取rememberMe cookie

base64 decode

解密AES(加密密钥硬编码)

反序列化(未作过滤处理)

但是,AES加密的密钥Key被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。

影响版本:Apache Shiro <= 1.2.4

漏洞环境

执行如下命令启动一个使用了Apache Shiro 1.2.4的Web服务:

docker-compose up -d

服务启动后,访问http://your-ip:8080即可看到下面的界面,环境启动成功

漏洞利用条件

抓取数据包查看信息,可以看到可以看到存在rememberMe=remember-me字段,可以针对该漏洞进行利用。

在漏洞利用中,就像漏洞原理上面说到的那样,需要获取AES算法所使用的KEY,常见的KEY如下:

4AvVhmFLUs0KTA3Kprsdag==
3AvVhmFLUs0KTA3Kprsdag==
2AvVhdsgUs0FSA3SDFAdag==
6ZmI6I2j5Y+R5aSn5ZOlAA==
wGiHplamyXlVB11UXWol8g==
cmVtZW1iZXJNZQAAAAAAAA==
Z3VucwAAAAAAAAAAAAAAAA==
ZnJlc2h6Y24xMjM0NTY3OA==
L7RioUULEFhRyxM7a2R/Yg==
RVZBTk5JR0hUTFlfV0FPVQ==
fCq+/xW488hMTCD+cmJ3aQ==
WkhBTkdYSUFPSEVJX0NBVA==
1QWLxg+NYmxraMoxAXu/Iw==
WcfHGU25gNnTxTlmJMeSpw==
a2VlcE9uR29pbmdBbmRGaQ==
bWluZS1hc3NldC1rZXk6QQ==
5aaC5qKm5oqA5pyvAAAAAA==
kPH+bIxk5D2deZiIxcaaaA==
r0e3c16IdVkouZgk1TKVMg==
ZUdsaGJuSmxibVI2ZHc9PQ==
U3ByaW5nQmxhZGUAAAAAAA==
LEGEND-CAMPUS-CIPHERKEY==

也可以去GitHub搜索相关KEY,也会有所收获

漏洞复现

使用Shiro_exploit的poc进行漏洞利用;注意下面的脚本需要装python包,记得阅读readme

GitHub地址:https://github.com/insightglacier/Shiro_exploit

python shiro_exploit.py -t 3 -u http://192.168.157.128:8080 -p "touch plumstar.txt"

敲完命令这个脚本会去跑AES算法的密钥,找到对应密钥后就会进行下面的操作了,建立文件

回到docker进入容器去查看a.txt是否被建立,可以看到a.txt建立成功

poc及利用原理

这里我们用另一个工具gorailgun来进行抓包演示,

可以看到这里出现的很多选项,check就是跟上方脚本一样去一个一个跑去判断KEY,我们开启代理去bp看一眼数据包

可以看到我们login.jsp出现了四个数据包,这就是gorailgun跑的数据包,跑出来后我们再去用工具执行一下命令看一看数据包是什么样子的

执行完成后可以看到这里数据包很大,这就是gorailgun为了去执行我们的命令进行的加密以及编码而产生的数据包;

那么就很显而易见了,原理为:攻击者会构造一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。其实顺序就跟上方Shiro的相反,便可达到任意执行命令的目的

修复建议

升级Apache Shiro框架到>=1.2.5

更换默认KEY值,并注意不要泄露

可以不使用硬编码