漏洞简介
(Shiro-550 CVE-2016-4437)
1.1 漏洞原理
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
那么,Payload产生的过程:
命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值
在整个漏洞利用过程中,比较重要的是AES加密的密钥,如果没有修改默认的密钥那么就很容易就知道密钥了,Payload构造起来也是十分的简单。攻击者可以使用Shiro的默认密钥构造恶意序列化对象进行编码来伪造用户的Cookie,服务端反序列化时触发漏洞,从而执行命令。
1.2 影响版本:Apache Shiro < 1.2.4
1.3 特征判断:
登录界面有remember me的功能
返回包中包含rememberMe=deleteMe字段。
1.4获取正确的key
可以尝试构造好一个包含用户凭证组信息的伪造rememberMe的值,然后经过AES加密后进行请求。经过一系列的解码解密操作后,若此时返回包不返回Set-Cookie: rememberMe=deleteMe,说明当前的key是正确的。可以以此作为判断标准,使用不同密钥对这串序列化数据进行加密并发包,即可快速爆破获取到Shiro加密密钥。
1.4 防御措施
升级Shiro到最新版本
WAF拦截Cookie中长度过大的rememberMe值
搭建docker容器
先查看linux内核版本,需要大于3.10才行,我这里是5.14,因此符合条件
uname -a
安装docker
apt-get install docker docker-compose
建议kali使用国内的源进行安装
启动docker服务,同时查看镜像,我这里是没有一个镜像的
直接拉取docker靶场镜像,结果太慢了,因此去更换docker的源
注册一个阿里云账号,打开以下链接
找到镜像加速器,这里有个人专属的加速器,这里的最下面有配置的方法,可以直接复制粘贴到kali上面。
配置加速器,先创建文件夹
daemon.json就是用来配置docker加速器的配置文件
配置完成之后,先重启docker,然后再查看docker的运行状态
systemctl restart docker
docker info
这里说明加速器配置成功
然后再次去尝试拉去镜像,这次很快就拉取成功了,简直飞一般的感觉
docker pull medicean/vulapp:s_shiro_1
启动靶场,将原本默认的8080端口给更换成了1111
访问本地的1111端口,访问成功。
Liqunkit工具利用该漏洞
docker启动靶场
访问kali的1111端口 ,点击里面的蓝色字体 Log in
可以看见这里有一个Remember Me 这是该漏洞的标志之一
抓包后查看返回包,发现这里有一个 rememberMe=deleteMe 这个就是可能存在shiro反序列化漏洞的标志
命令执行
先输入目标的url,默认为AES-CBC模式,然后点击内置--key检测(也可以使用自定义的),点击内置key检测后就会进行爆破,最后找出正确的key,随后点击命令执行即可。
反弹shell
先启动监听,监听本地1234端口
成功反弹了shell