GCP - Federation Abuse

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipo Rojo de HackTricks en AWS)!

Otras formas de apoyar a HackTricks:

OIDC - Abuso de Acciones de Github

GCP

Para dar acceso a las Acciones de Github desde un repositorio de Github a una cuenta de servicio de GCP, se necesitan los siguientes pasos:

  • Crear la Cuenta de Servicio para acceder desde las acciones de Github con los permisos deseados:

projectId=FIXME
gcloud config set project $projectId

# Create the Service Account
gcloud iam service-accounts create "github-demo-sa"
saId="github-demo-sa@${projectId}.iam.gserviceaccount.com"

# Enable the IAM Credentials API
gcloud services enable iamcredentials.googleapis.com

# Give permissions to SA

gcloud projects add-iam-policy-binding $projectId \
--member="serviceAccount:$saId" \
--role="roles/iam.securityReviewer"
  • Generar un nuevo grupo de identidades de carga de trabajo:

# Create a Workload Identity Pool
poolName=wi-pool

gcloud iam workload-identity-pools create $poolName \
--location global \
--display-name $poolName

poolId=$(gcloud iam workload-identity-pools describe $poolName \
--location global \
--format='get(name)')
  • Genera un nuevo proveedor de identidad de carga de trabajo OIDC que confíe en las acciones de github (por nombre de org/repo en este escenario):

attributeMappingScope=repository # could be sub (GitHub repository and branch) or repository_owner (GitHub organization)

gcloud iam workload-identity-pools providers create-oidc $poolName \
--location global \
--workload-identity-pool $poolName \
--display-name $poolName \
--attribute-mapping "google.subject=assertion.${attributeMappingScope},attribute.actor=assertion.actor,attribute.aud=assertion.aud,attribute.repository=assertion.repository" \
--issuer-uri "https://token.actions.githubusercontent.com"

providerId=$(gcloud iam workload-identity-pools providers describe $poolName \
--location global \
--workload-identity-pool $poolName \
--format='get(name)')
  • Finalmente, permita que el principal del proveedor utilice un principal de servicio:

gitHubRepoName="repo-org/repo-name"
gcloud iam service-accounts add-iam-policy-binding $saId \
--role "roles/iam.workloadIdentityUser" \
--member "principalSet://iam.googleapis.com/${poolId}/attribute.${attributeMappingScope}/${gitHubRepoName}"

Observa cómo en el miembro anterior estamos especificando el org-name/repo-name como condiciones para poder acceder a la cuenta de servicio (otros parámetros que lo hacen más restrictivo como la rama también podrían ser utilizados).

Sin embargo, también es posible permitir que todo GitHub acceda a la cuenta de servicio creando un proveedor como el siguiente utilizando un comodín:

# Crear un grupo de identidades de carga de trabajo
poolName=wi-pool2

gcloud iam workload-identity-pools create $poolName \
--location global \
--display-name $poolName

poolId=$(gcloud iam workload-identity-pools describe $poolName \
--location global \
--format='get(name)')

gcloud iam workload-identity-pools providers create-oidc $poolName \
--project="${projectId}" \
--location="global" \
--workload-identity-pool="$poolName" \
--display-name="Proveedor de demostración" \
--attribute-mapping="google.subject=assertion.sub,attribute.actor=assertion.actor,attribute.aud=assertion.aud" \
--issuer-uri="https://token.actions.githubusercontent.com"

providerId=$(gcloud iam workload-identity-pools providers describe $poolName \
--location global \
--workload-identity-pool $poolName \
--format='get(name)')

# VERIFICAR EL COMODÍN
gcloud iam service-accounts add-iam-policy-binding "${saId}" \
--project="${projectId}" \
--role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/${poolId}/*"

En este caso, cualquiera podría acceder a la cuenta de servicio desde las acciones de GitHub, por lo que siempre es importante verificar cómo se define el miembro. Siempre debería ser algo como esto:

attribute.{custom_attribute}:principalSet://iam.googleapis.com/projects/{project}/locations/{location}/workloadIdentityPools/{pool}/attribute.{custom_attribute}/{value}

Github

Recuerda cambiar ${providerId} y ${saId} por sus respectivos valores:

name: Check GCP action
on:
workflow_dispatch:
pull_request:
branches:
- main

permissions:
id-token: write

jobs:
Get_OIDC_ID_token:
runs-on: ubuntu-latest
steps:
- id: 'auth'
name: 'Authenticate to GCP'
uses: 'google-github-actions/auth@v0.3.1'
with:
create_credentials_file: 'true'
workload_identity_provider: '${providerId}'
service_account: '${saId}'
- id: 'gcloud'
name: 'gcloud'
run: |-
gcloud auth login --brief --cred-file="${{ steps.auth.outputs.credentials_file_path }}"
gcloud auth list
gcloud projects list
Aprende a hackear AWS de cero a héroe con htARTE (Experto en Red Team de HackTricks AWS)!

Otras formas de apoyar a HackTricks:

Última actualización