0x00、前言
Nacos身份认证绕过漏洞(QVD-2023-6271)复现与分析
0x01、Nacos描述
Nacos是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
官网:https://nacos.io/
github项目:https://github.com/alibaba/nacos
0x02、漏洞描述
开源服务管理平台 Nacos 中存在身份认证绕过漏洞,在默认配置下未对 token.secret.key 进行修改,导致远程攻击者可以绕过密钥认证进入后台,造成系统受控等后果。
0x03、漏洞范围
0.1.0 <= Nacos <= 2.2.0
0x04、复现
环境搭建
下载漏洞版本:(0.1.0 <= Nacos <= 2.2.0均可)
https://github.com/alibaba/nacos/releases/tag/2.2.0.1
bin目录下启动startup.cmd -m standalone
即可
漏洞复现
默认NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789
使用默认key进行jwt认证构造
构造的jwt数据进行认证即可获取cookie
header: |
0x05、分析
本质上还是secretkey密钥硬编码导致可以构造jwt身份数据,核心还是在jwt的鉴权上面。
0.1.0 <= Nacos <= 2.2.0版本中
使用鉴权插件默认token.secret.key:可参考官方文档
nacos使用的jwt认证由三部分构成:
1、header:声明加密格式
{ |
2、PAYLOAD data数据:身份数据,由sub对象(用户角色)+exp(时间戳)构成
确保时间戳在当前时间范围内即可
{ |
3、签名:由header加密格式加密secretkey形成的签名,用于验证数据是否正确
至于选择secret base64 encoded选项
在源码中,位置plugin-default-impl\src\main\java\com\alibaba\nacos\plugin\auth\impl\JwtTokenManager.java中,针对secret会先从配置文件中获取key值
然后将获取的key值进行base64_decode()解码,因此默认key(SecretKey012345678901234567890123456789012345678901234567890123456789)实际上在程序处理中是作为已经被base64编码过后的值,再将base64解码过后的secret值使用hs256签名
当sub对象为nacos,并且签名正确,即可通过nacos鉴权认证,因此由上面部分,使用默认key生成的jwt即可绕过nacos的鉴权
0x06、修复
1、官方更新补丁:https://github.com/alibaba/nacos/releases/tag/2.2.0.1
修复方式:移除了默认key,部署新版本时必须要输入自定义的有效token.secret.key
2、缓解办法:application.properties文件中token.secret.key默认值进行更改。
0x07、参考链接
https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
https://github.com/alibaba/nacos/issues/10060
https://avd.aliyun.com/detail?id=AVD-2023-1655789
https://nox.qianxin.com/article/541