GCP - Federation Abuse

Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

OIDC - Κατάχρηση των Github Actions

GCP

Για να δοθεί πρόσβαση στις Github Actions από ένα αποθετήριο Github σε έναν λογαριασμό υπηρεσίας GCP, απαιτούνται τα εξής βήματα:

  • Δημιουργία του λογαριασμού υπηρεσίας για πρόσβαση από τις Github Actions με τα επιθυμητά δικαιώματα:

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"
  • Δημιουργήστε ένα νέο πιστοποιητικό πιστοποίησης φορτίου εργασίας:

# 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)')
  • Δημιουργήστε έναν νέο πάροχο OIDC για την πιστοποίηση ταυτότητας της workload identity pool που εμπιστεύεται τις ενέργειες του GitHub (ανάλογα με το όνομα του οργανισμού/αποθετηρίου σε αυτό το σενάριο):

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)')
  • Τέλος, επιτρέψτε στον κύριο από τον πάροχο να χρησιμοποιήσει έναν υπηρεσιακό κύριο:

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}"

Σημειώστε ότι στο προηγούμενο μέλος καθορίζουμε το org-name/repo-name ως προϋπόθεση για να έχουμε πρόσβαση στον λογαριασμό υπηρεσίας (μπορούν επίσης να χρησιμοποιηθούν άλλες παράμετροι που το καθιστούν πιο περιοριστικό, όπως ο κλάδος).

Ωστόσο, είναι επίσης δυνατόν να επιτραπεί η πρόσβαση όλων των github στον λογαριασμό υπηρεσίας δημιουργώντας έναν πάροχο όπως ο παρακάτω χρησιμοποιώντας μια μπαλαντέρ:

# Δημιουργία ενός Workload Identity Pool
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="Πάροχος επίδειξης" \
--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)')

# ΕΛΕΓΞΤΕ ΤΗΝ ΜΠΑΛΑΝΤΕΡ
gcloud iam service-accounts add-iam-policy-binding "${saId}" \
--project="${projectId}" \
--role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/${poolId}/*"

Σε αυτήν την περίπτωση, οποιοσδήποτε μπορεί να έχει πρόσβαση στον λογαριασμό υπηρεσίας από τις ενέργειες του github, επομένως είναι σημαντικό να ελέγχετε πάντα πώς ορίζεται το μέλος. Πρέπει πάντα να είναι κάτι τέτοιο:

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

Github

Θυμηθείτε να αλλάξετε τα ${providerId} και ${saId} με τις αντίστοιχες τιμές τους:

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
Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated