nacos 身份认证绕过漏洞(QVD-2023-6271)

nacos 身份认证绕过漏洞(QVD-2023-6271)

male1a 黑伞安全 2023-08-02 17:50

JWT(Json Web Token)

0x00 JWT构成

Json Web Token
简称
JWT
,用做用户身份验证。那么其结构长什么样呢,下面我会通过一个例子去分析。

上面是一串
JWT
格式的字符串,在线解密查看内容:
https://jwt.io/

从解密的结果可以看到其由三部分组成
(头部、载荷、签名)

为什么说它
(JWT)
的名字里面带有
Json
不难看出,因为其解密出来的内容是按照
Json
格式存储的,下面通过上述的一个
JWT
例子对其三部分简单介绍一下

Header

Header
通常由两部分组成:令牌的类型,即
JWT
和正在使用的散列算法,如
SHA256

RSA

明文

不难看出
typ
为类型的缩写,
alg
为算法的缩写。然后,这个
JSON

Base64
编码,形成
JSON Web Token
的第一部分。
密文

Payload

令牌的第二部分是包含声明的有效负载。声明是关于实体(通常是用户)和其他元数据的声明。
明文

同样对其base64编码得到第二部分
密文

Signature

这部分为创建签名部分,必须采用
header

payload
,密钥三部分处理,利用
header
中指定算法进行签名。

例如
HS256(HMAC SHA256)
,签名的构成为:

然后将这部分同样
base64
编码形成
JWT
第三部分。

一张图看懂加密后的
JWT

0x01 JWT适用场景

Authentication(鉴权):

这是使用
JWT
最常见的情况。一旦用户登录,每个后续请求都将包含
JWT
,允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛使用
JWT
的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。

Information Exchange(信息交换)

JSON Web Tokens
是在各方之间安全传输信息的好方式。因为
JWT
可以签名:例如使用公钥/私钥对,所以可以确定发件人是他们自称的人。此外,由于使用标头和有效载荷计算签名,因此您还可以验证内容是否未被篡改。

现在了解了Json Web Token的组成,下面理解其攻击手法就比较容易了。接下来实战复现一下。

nacos token.secret.key身份认证绕过漏洞(QVD-2023-6271)复现

0x00 简介

Nacos
是一个易于使用的平台,专为动态服务发现和配置以及服务管理而设计。可以帮助您轻松构建云原生应用程序和微服务平台。

0x01 漏洞概述

目前
Nacos
身份认证绕过漏洞
(QVD-2023-6271)
,也叫做
NVDB-CNVDB-2023674205
,暂无
CVE
编号,开源服务管理平台
Nacos
在默认配置下未对
token.secret.key
进行修改,导致远程攻击者可以绕过密钥认证进入后台,造成系统受控等后果。

0x02 影响版本

0.1.0 <= Nacos <= 2.2.0

0x03 环境搭建

漏洞版本从
GitHub
上下载带有漏洞的源码

可以选择2.2.0以下版本,比如下面这个

解压之后,在bin目录下使用cmd使用命令
startup.cmd -m standalone
来启动(java8以上环境运行)

拼接路径
nacos
到路径

0x04 漏洞复现


nacos
中,
token.secret.key
值是固定死的,位置在
conf
下的
application.properties
中:

0x05 获取token

利用该默认
key
可进行
jwt
构造,直接进入后台,构造方法:


https://jwt.io/
中:输入默认
key

然后再
payload
里面输入:

在这里注意:
1690889280
这个值是
unix
时间戳,换算一下,要比你系统当前的时间更晚,比如当前的时间是
2023年08月01日19:28:00
,在这里面的时间戳时间是8月2号:

注意jwt.io中的
secret base64 encoded
,要勾选

复制加密的
jwt

复制上面得到的值,抓包修改包,添加
Authorization

请求包如下:

可以看到返回
200
,说明登录成功,利用这个可以绕过身份认证,进入后台

使用Burp拦截网站请求,并拦截返回包。

0x06 利用获取token登录后台

在这里使用任意账号登录之后,再修改返回包就行了,用
burp
拦截:

0x07 替换返回包

然后
Forward
,这边返回的信息肯定是无效的:

在这里使用刚刚
burp
里面生成的返回包进行替换,全部复制过去:

全部放包

0x08 登录成功

0x09 修复方式

1.自行修改key

2.更新到最新版本