nacos未授权访问漏洞 原理扫描

```html nacos未授权访问漏洞 原理扫描

nacos未授权访问漏洞 原理扫描

Nacos 的授权扫描默认端口是 8848,这个数字本身没什么特殊,访问但如果你在浏览器里直接敲上 http://目标IP:8848/nacos/v1/auth/users?漏洞pageNo=1&pageSize=9,页面返回了一串 JSON,原理里面带着用户名和密码的授权扫描哈希,那基本可以确定——这个 Nacos 没设防。访问我去年在一个客户的漏洞测试环境里就碰到过,当时他们以为内网没人会扫,原理结果我随手一请求,授权扫描nacos 这个默认用户名和它对应的访问 BCrypt 哈希就躺在响应体里,连翻页参数都不用改。漏洞

漏洞的原理根子不在认证逻辑,而在“默认信任”

Nacos 早期版本(1.x 到 2.0.0 之前的授权扫描部分版本)对 /nacos/v1/auth/ 下的接口没有强制鉴权。更准确地说,访问它把“是漏洞否开启鉴权”这个开关交给了 application.properties 里的 nacos.core.auth.enabled,而默认值是 false。这意味着你装完 Nacos,不做任何额外配置,任何人都能通过 HTTP 接口读取用户列表、新建用户、甚至删除用户。这不是代码写错了,是设计上默认把门敞开了。

我见过一个更离谱的场景:某公司的运维在 K8s 里用 Helm 装 Nacos,values.yaml 里 auth.enabled 写的是 true,但启动参数里又加了个 --nacos.core.auth.enabled=false,结果容器里的实际配置被覆盖,鉴权根本没生效。他们直到被扫描器扫出漏洞才反应过来。

扫描这件事,不需要多高深的技术

写个 Python 脚本,循环请求几个关键路径就行。比如 /nacos/v1/auth/users 返回用户列表,/nacos/v1/console/namespaces 返回命名空间,/nacos/v1/cs/configs?search=accurate&dataId=&group=&pageNo=1&pageSize=100 能直接拉配置。配置里经常藏着数据库密码、Redis 连接串、第三方 API Key。我试过在一个未授权的 Nacos 上翻到阿里云 AK/SK,虽然只是测试环境,但足够说明问题。

扫描器一般会先发一个 GET /nacos/,看返回的 HTML 里有没有 Nacos 字样和版本号。有版本号就能直接匹配 CVE。比如 1.4.1 之前的版本存在 /nacos/v1/auth/users/?pageNo=&pageSize= 未授权,2.0.0 到 2.0.3 有 User-Agent 绕过鉴权的漏洞。这些细节在 GitHub 的 issue 里都能翻到,扫描器作者只是把它们自动化了。

真实环境里,这个洞往往不是孤立的

去年某次攻防演练,我通过一个未授权的 Nacos 拿到了生产配置,里面有一个 spring.datasource.url 指向内网 MySQL,用户名 root,密码是弱口令 root123。接着用 Nacos 的 /nacos/v1/cs/configs 接口修改了一个服务的配置,把 logging.level.root 改成 DEBUG,然后观察日志里有没有敏感信息。整个过程没用到任何 0day,全是默认配置和未授权接口的组合。

更麻烦的是,Nacos 的未授权不止读,还能写。你可以往配置里注入一个恶意类,或者直接改数据库连接串指向自己的服务器。有些团队把 Nacos 当配置中心,也当服务注册中心,一旦被控,整个微服务架构的通信拓扑就暴露了。

怎么扫,怎么防

扫描的话,nuclei 有现成的模板:nuclei -t http/cves/2021/CVE-2021-29441.yaml -u http://target:8848。或者用 nacos-vuln-scanner 这种小工具,直接跑一遍 /nacos/v1/auth/users 和 /nacos/v1/auth/login,看返回码和内容长度。如果 /nacos/v1/auth/users 返回 200 且 body 里有 username 字段,基本就中了。

防护上,别只改 nacos.core.auth.enabled=true。还要改默认的 nacos.core.auth.default.token.secret.key,这个值在 2.2.0 之前是硬编码的 SecretKey012345678901234567890123456789012345678901234567890123456789,不改的话 JWT 能被伪造。另外,把 Nacos 的 8848 端口限制在内网访问,别暴露到公网。如果非要用公网,前面挂个 Nginx 做 Basic Auth 也比裸奔强。

我自己的习惯是,每次看到 8848 端口开放,先发一个 curl -s http://ip:8848/nacos/v1/auth/users?pageNo=1&pageSize=1,如果返回 { "username":"nacos","password":"$2a$10$..."},就在笔记里记一笔。这个动作花不了两秒钟,但能省掉后面一堆麻烦。

```
百科
上一篇:关于数据库注入攻击的说法正确的是
下一篇:游戏网站链接大全