cicd-goat靶场解题记录Part4
本篇是cicd-goat靶场系列的第四篇文章,涉及cicd-goat靶场环境是如何构建的和配置的。
解题记录参见[第一篇文章][1]和[第二篇文章][2],靶场环境中CI/CD的工作流解析参见[第三篇文章][3]。
cicd-goat靶场构成
cicd-goat的架构图如下:
在本地运行cicd-goat靶场环境只需要使用项目README中给出的[命令][4]即可:
mkdir cicd-goat; cd cicd-goat |
上述命令的意思是,下载项目的docker-compose文件到本地,将文件中的网络类型由bridge替换成nat,然后使用docker compose运行环境。
上面的命令有两个可能的错误:
- 修改网络类型的命令并没有将修改的结果写入
docker-compose.yaml文件 - 在Docker官方文档[Networking overview][5]和[Network drivers][6]中,取消了
nat类型的网络驱动器。
这两个错误结合在一起,命令却可以正常的工作🤣。
另外,我测试时发现Docker Hub对pull镜像进行了[请求限制][7],不登录情况下每个IPv4地址每小时只允许pull 10次,略离谱。
概述
靶场由容器组成:答题环境,源代码管理,CICD环境和其他组件。
ctfd答题环境
ctfd是独立的答题环境,与靶场的CICD部分没有交互。通过给出任务说明和提示信息指引玩家进行攻击尝试,并校验flag信息、提供成就感。
其在docker-compose.yml文件中的配置信息如下:
ctfd: |
cicd-goat环境中的FLAG字段通过硬编码的形式给出:
- 硬编码的flag对应于[ctfd文档][8]中的静态flag。
- 而如果想要使用动态flag,需要使用Saas化部署的ctfd或者企业版的ctfd,大概率需要花钱;也可以考虑尝试[CTFdOnlineChallenge][9]插件。
- 对于cicd-goat这种自己练习的环境来说,动态flag没特别大的必要。
ctfd的配置模式类似于虚拟机快照的模式:
- 根据[管理员账号密码台账][10]以
admin/ciderland5#登录之后,进行题目、提示和flag的配置,然后将整个环境保存下来,形成Docker镜像以便后续使用。 - 根据Git的变更记录,配置信息可能是存储在[CTFd/ctfd.db][11]中。
- 上传的其他内容(如首页图片,logo信息等)则位于[CTFd/uploads][12]文件夹内。
源代码管理Gitea/Gitlab
靶场环境使用Gitea和Gitlab进行源代码管理,大部分项目都托管在Gitea上,少数需要使用Gitlab CI/CD能力的项目托管在Gitlab上。
Gitea
Gitea的配置信息如下:
gitea: |
项目中对Gitea的用户设置和repo内容、权限配置等,采用了配置即代码的理念,通过Yaml文件即可完成所有设置,整个实现十分优雅👍。
Gitea子目录中的Dockerfile文件主要内容如下:
FROM gitea/gitea:1.16.5 AS base |
check_git.py用于对repositories文件夹中的各个项目进行检测,确保项目不包含not.git文件夹。
run.sh为主要的配置代码,其功能是待gitea初始化完成之后,新建管理员信息,并使用giteacasc库根据gitea.yaml对gitea进行配置。
其内容如下:
|
[giteacasc][13]是一个专门为Gitea实现Configuration as Code的Python库,它通过调用Gitea的API接口实现了用户、组织和代码仓库的创建及代码的同步。
在run.sh中,实际起Gitea配置功能的代码前后,先将/usr/bin/entrypoint进程置于后台,配置完成之后再置于前台,这种单独的设置是为了避免环境变量中的用户名和密码泄露吗?🤔
todo:这里需要单独再测试验证一下。
Gitlab
Gitlab不仅是一个源代码管理仓库,而且还包含了CI/CD工具、镜像仓库等,提供了相对完成的集成环境。
Gitlab的配置如下:
gitlab: |
cicd-goat环境中的gitlab使用[Terraform][14]进行依据gitlab/gitlab.tf配置,代码仓库使用gitlab/repositories.sh进行push。
Terraform是一个很强大的多云环境下基础设置即代码的工具,可以文件声明的形式创建各种资源。
我自己还未深入使用这个工具,找到了一些可能有用的资料,后续可以尝试下:
- introduction-terraform,这本书有个很奇怪的“马驰排除条款”,然后还有人提问。
- 关于Terraform的一本书:《Terraform 101 从入门到实践》
CICD环境
Jenkins
jenkins-server是用来部署大部分CI/CD任务的Jenkins服务器,具体的CICD任务则在对应的jenkins-agent节点上运行。
他们的配置信息如下:
jenkins-server: |
配置中服务端除了开放8080端口用于WEB界面访问之外,还开放了50000端口用于服务端与Agent端的通信。
代码配置层面jenkins-server使用了configuration-as-code: 1346.ve8cfa_3473c94[代码即配置插件][15],通过文件对Jenkins进行配置。
根据本系列的[第三篇文章][3]中的探索,Jenkins上大部分CICD任务都是通过事件/变更来触发的,基本没有定时任务。这些任务都是使用Groovy文件编写,存放于jenkins-server/jobdsl文件夹内。
其他组件
待补充。。。
- 1.https://mark0.pw/2024/12/29/cicd-goat%E9%9D%B6%E5%9C%BA%E8%A7%A3%E9%A2%98%E8%AE%B0%E5%BD%95Part1/ ↩
- 2.https://mark0.pw/2024/12/30/cicd-goat%E9%9D%B6%E5%9C%BA%E8%A7%A3%E9%A2%98%E8%AE%B0%E5%BD%95Part2/ ↩
- 3.https://mark0.pw/2025/01/06/cicd-goat%E9%9D%B6%E5%9C%BA%E8%A7%A3%E9%A2%98%E8%AE%B0%E5%BD%95Part3/ ↩
- 4.https://github.com/cider-security-research/cicd-goat/tree/main?tab=readme-ov-file#windows-powershell ↩
- 5.https://docs.docker.com/engine/network/ ↩
- 6.https://docs.docker.com/engine/network/drivers/ ↩
- 7.https://docs.docker.com/docker-hub/usage/ ↩
- 8.https://docs.ctfd.io/docs/challenges/flags/ ↩
- 9.https://github.com/XuCcc/CTFdOnlineChallenge ↩
- 10.https://github.com/cider-security-research/cicd-goat/blob/main/break-glass.md ↩
- 11.https://github.com/cider-security-research/cicd-goat/blob/main/ctfd/data/CTFd/CTFd/ctfd.db ↩
- 12.https://github.com/cider-security-research/cicd-goat/tree/main/ctfd/data/CTFd/CTFd/uploads ↩
- 13.https://github.com/cider-security-research/cicd-goat/tree/main/gitea/giteacasc ↩
- 14.https://developer.hashicorp.com/terraform?product_intent=terraform ↩
- 15.https://www.jenkins.io/doc/book/managing/casc/ ↩

