CVE2022-0735复现
https://gitlab.com/gitlab-org/gitlab/-/issues/353529官方给出的复现文档信息(触发的功能点的位置是在issues评论的位置),可以获取runner token,这里不做过多赘述,通过这里可以直接获取项目的runner-token.
Runner-token的利用
此处需要了解CI/CD部署流程!需要大家自行学习
了解Gitlab-runner机制,这是gitlab官方给出的runner执行图 官方文档:https://gitlab.cn/docs/runner/
第一步:客户端机器的gitlab-runner 携带cve-2022-0735获取的runner-token通过/api/v4/runners接口注册到gitlab服务端上,会返回一个token被用做第二步轮巡jobs。
第二步:当代码变动触发CI/CD部署时,客户端的gitlab-runner轮巡服务(反复请求/api/v4/jobs/request接口)携带第一步中的token,获取有代码变动触发的CI/CD部署任务并拉取项目代码在gitlab-runner客户端这台机器上读取项目中的gitlab-ci.yml配置文件并实施,完成部署任务。
这里的gitlab-runner我使用的是docker部署的客户端,gitlab-runner里面实际步骤也是按照图里面的第一步和第二步以及后续的部署集成到了一体
进入部署的docker镜像中,并执行gitlab-runner register(这里就是我们分析的第一步的操作),这里偷个懒之前没截图这里用的别人文章里面的截图
这里有一个非常重要的点也是利用条件之一就是这里的tag_list这个参数列表里面的值必须要和CI/CD部署文件.gitlab-ci.yml中的tags一致不然获取的token后续的轮训是获取不到job的,注册上之后才能有后续的利用
这时你可以去gitlab平台上(需要是管理员),后台上看到注册的gitlab-runner客户端有被注册
此时你去修改你的项目代码后,这里就会触发部署job,然后客户端的gitlab-runner轮巡发现后就会开始部署,为了大家方便理解这里用burp intruder来模仿轮巡,会获取到项目最新修改后的源码获取地址等信息。
这是我创建的测试项目
在我们的客户端gitlab-runner中部署时获取到项目源码