vlambda博客
学习文章列表

CVE-2016-4437(Apache Shiro 反序列化漏洞)

点击蓝字




CVE-2016-4437(Apache Shiro 反序列化漏洞)复现


一、漏洞描述

Apache Shiro是一个Java安全框架,执行身份验证、授权、密码和会话管理。只要rememberMe的AES加密秘钥泄露,无论shiro是什么版本都会导致反序列化漏洞。


二、漏洞原理

Apache Shiro框架提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。
Shiro对rememberMe的cookie做了加密处理,shiro在CookieRememberMeManager类中将cookie中rememberMe字段内容分别进行序列化、AES加密、Base64编码操作。


在识别身份的时候,需要对Cookie里的rememberMe字段解密。根据加密的顺序,不难知道解密的顺序为:
获取rememberMe cookiebase64 decode解密AES(加密秘钥硬编码)反序列化(未作过滤处理)
但是,AES加密的秘钥Key被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的秘钥。因此,攻击者做一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。 


三、影响版本

影响Shiro<1.2.5版本,当未设置用于“remember me” 特性的AES密钥时,存在反序列化漏洞,可远程命令执行。


四、环境准备

  1. 进入vulhub/shiro/CVE-2016-4437目录下

cd vulhub/shiro/CVE-2016-4437/

  2.docker环境启动

systemctl start dockerservice docker startsudo docker-compose up -d

CVE-2016-4437(Apache Shiro 反序列化漏洞)


  3.浏览器访问http://192.168.204.128:8080,出现以下界面说明环境搭建成功。

CVE-2016-4437(Apache Shiro 反序列化漏洞)


  4.下载ysoserial工具以及POC

https://github.com/insightglacier/Shiro_exploit


五、漏洞复现

这里我的漏洞机ip地址:192.168.204.128(kali1)
攻击机ip地址:192.168.204.129(kali2)
下载地址:https://github.com/feihong-cs/ShiroExploit/releases/tag/v2.3


CVE-2016-4437(Apache Shiro 反序列化漏洞)

前台登录,注意需要勾选Remember Me ,截获数据包(判断:将cookie改为 rememberMe=1 发包,响应包中有 rememberMe=deleteMe 一般就是Apache shiro代码搭建的站点)

CVE-2016-4437(Apache Shiro 反序列化漏洞)

证明存在shiro漏洞。

打开下载好的ShiroExploit.jar

CVE-2016-4437(Apache Shiro 反序列化漏洞)

进入图形化Shiro检测界面,输入测试网址,点击下一步。

CVE-2016-4437(Apache Shiro 反序列化漏洞)

选择第一个使用ceye.io进行漏洞检测,点击下一步。

CVE-2016-4437(Apache Shiro 反序列化漏洞)

开始执行检测

CVE-2016-4437(Apache Shiro 反序列化漏洞)

在攻击机kali2上进行监听

CVE-2016-4437(Apache Shiro 反序列化漏洞)

同时在图形界面中勾选第一个反弹shell,填入相应信息,点击执行。

CVE-2016-4437(Apache Shiro 反序列化漏洞)

执行结束后的结果如下图所示:

CVE-2016-4437(Apache Shiro 反序列化漏洞)

查看攻击机上监听的信息,发现攻击机成功连接到kali1上

六、漏洞修补方案

1.升级Shiro版本到1.2.5及以上
2.现在使用的rememberMe的AES加密密钥泄露,请自己base64一个AES的密钥,或者利用官方提供的方法生成密钥

org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey()