shiro反序列化漏洞原理
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会将用户信息加密,加密过程:用户信息=>序列化=>AES加密=>base64编码=>RememberMe Cookie值。如果用户勾选记住密码,那么在请求中会携带cookie,并且将加密信息存放在cookie的rememberMe字段里面,在服务端收到请求对rememberMe值,先base64解码然后AES解密再反序列化,这个加密过程如果我们知道AES加密的密钥,那么我们把用户信息替换成恶意命令,就导致了反序列化RCE漏洞。在shiro版本<=1.2.4中使用了默认密钥kPH+bIxk5D2deZiIxcaaaA==,这就更容易触发RCE漏洞。
vulhub靶场的搭建
(1)安装docker
搭建Vulhub漏洞靶场环境,首先需要安装Docker。在这里,我们使用Vulhub官方的Docker安装方法,执行命令:
curl -s https://get.docker.com/ | sh
因为这边作者已经安装过,所以它提示已经安装
输入命令之后,接着输入命令docker --version
docker --version
如果出现版本号,则说明docker安装成功。
(2)安装vulhub
请注意,自 2022 年 4 月起,docker compose
已合并到 Docker 中作为一个子命令,即 Docker Compose V2,Python 版本的 docker-compose 将在 2023 年 6 月后被弃用。因此,Vulhub 不再需要额外安装 docker-compose
,所有文档都将修改为使用 docker compose
命令。
对于其他操作系统的 Docker 和 Docker Compose 的安装步骤可能略有不同,请参考 Docker 文档 获取详细信息。
# 下载项目
wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip
unzip vulhub-master.zip
cd vulhub-master
# 进入漏洞/环境目录
cd flask/ssti
# 构建环境
docker compose build
# 运行环境(后台模式)
docker compose up -d
如果有师傅和我的kali一样访问不了github,可以使用物理机先将vulhub的压缩包先下载解压,随后拖入kali。记得输入上述命令时,确保kali是root权限。
进入漏洞相应的路径,然后运行环境。
cd /vulhub-master/shiro/CVE-2016-4437
docker-compose up -d
访问8080,如下环境搭建成功
验证是否为shiro框架
使用bp抓却数据包,勾选上界面的Remember me,输入任意用户名和密码,点击登录,如果返回包中存在rememberMe=deleteMe字段,说明使用了shiro框架。
漏洞验证
作者这边是使用jar工具进行验证
链接: https://pan.baidu.com/s/1wYE2Xtw3XH8JB6VsdscYZA 提取码: ktt5
使用方法:先确认本机是否安装java环境,解压进入该路径
在上方路径框中输入cmd进入命令行
进入命令行后输入命令
java -jar shiro_attack-2.2.jar
启动该工具
依照下图顺序,输入目标地址的路径,修改请求方法后,点击爆破秘钥。
漏洞利用
图形化界面的漏洞利用方式是比较简单的,在上图的基础上点击检测当前利用链。
点到命令执行的界面,输入命令,点击执行。这边看到,我们已经拿到了root的权限。
该漏洞复现完成!