GCP - IAM Privesc

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

IAM

Pour plus d’informations sur IAM :

GCP - IAM, Principals & Org Policies Enum

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

Un attaquant disposant des permissions mentionnĂ©es pourra mettre Ă  jour un rĂŽle qui vous est assignĂ© et vous attribuer des permissions supplĂ©mentaires sur d’autres ressources telles que :

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

Vous pouvez trouver un script pour automatiser la crĂ©ation, l’exploit et le nettoyage d’un vuln environment ici et un script python pour abuser de ce privilĂšge ici. Pour plus d’informations, consultez la recherche originale.

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

iam.roles.create & iam.serviceAccounts.setIamPolicy

La permission iam.roles.create permet la crĂ©ation de rĂŽles personnalisĂ©s dans un projet/une organisation. Entre les mains d’un attaquant, cela est dangereux car cela lui permet de dĂ©finir de nouveaux ensembles d’autorisations qui peuvent ensuite ĂȘtre attribuĂ©s Ă  des entitĂ©s (par exemple, en utilisant la permission iam.serviceAccounts.setIamPolicy) dans le but d’obtenir une Ă©lĂ©vation de privilĂšges.

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

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

Un attaquant disposant des permissions mentionnĂ©es pourra demander un access token appartenant Ă  un Service Account, il est donc possible de demander un access token d’un Service Account disposant de privilĂšges supĂ©rieurs aux nĂŽtres.

Pour une variante resource-driven oĂč du code contrĂŽlĂ© par l’attaquant vole un managed Vertex AI Agent Engine runtime token depuis le metadata service et le rĂ©utilise en tant que Vertex AI service agent, consultez :

GCP - Vertex AI Post Exploitation

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

Vous pouvez trouver un script pour automatiser la creation, exploit and cleaning of a vuln environment here et un script python pour abuser de ce privilùge here. Pour plus d’informations, consultez la original research.

iam.serviceAccountKeys.create

Un attaquant disposant des permissions mentionnĂ©es pourra crĂ©er une clĂ© gĂ©rĂ©e par l’utilisateur pour un Service Account, ce qui nous permettra d’accĂ©der Ă  GCP en tant que ce Service Account.

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

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

Vous pouvez trouver un script pour automatiser la creation, exploit and cleaning of a vuln environment here et un script python pour abuser de ce privilùge here. Pour plus d’informations, consultez la original research.

Notez que iam.serviceAccountKeys.update ne permettra pas de modifier la clĂ© d’un SA car, pour cela, la permission iam.serviceAccountKeys.create est Ă©galement nĂ©cessaire.

iam.serviceAccounts.implicitDelegation

Si vous disposez de la permission iam.serviceAccounts.implicitDelegation sur un compte de service qui possÚde la permission iam.serviceAccounts.getAccessToken sur un troisiÚme compte de service, alors vous pouvez utiliser implicitDelegation pour créer un token pour ce troisiÚme compte de service. Voici un diagramme pour aider à expliquer.

Notez que d’aprĂšs la documentation, la dĂ©lĂ©gation de gcloud ne fonctionne que pour gĂ©nĂ©rer un token en utilisant la mĂ©thode generateAccessToken(). Voici donc comment obtenir un token en utilisant l’API directement:

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

Vous pouvez trouver un script pour automatiser la creation, exploit and cleaning of a vuln environment here et un python script pour exploiter ce privilùge here. Pour plus d’informations, consultez la original research.

iam.serviceAccounts.signBlob

Un attaquant disposant des permissions mentionnĂ©es pourra signer des payloads arbitraires dans GCP. Il sera donc possible de crĂ©er un JWT non signĂ© du SA puis de l’envoyer en tant que blob pour faire signer le JWT par le SA ciblĂ©. Pour plus d’informations read this.

Vous pouvez trouver un script pour automatiser la creation, exploit and cleaning of a vuln environment here et un python script pour exploiter ce privilùge here et here. Pour plus d’informations, consultez la original research.

iam.serviceAccounts.signJwt

Un attaquant disposant des permissions mentionnĂ©es pourra signer des JSON Web Tokens (JWTs) bien formĂ©s. La diffĂ©rence avec la mĂ©thode prĂ©cĂ©dente est que au lieu de faire signer par google un blob contenant un JWT, nous utilisons la mĂ©thode signJWT qui attend dĂ©jĂ  un JWT. Cela la rend plus simple Ă  utiliser mais vous ne pouvez signer que des JWT au lieu de n’importe quels octets.

Vous pouvez trouver un script pour automatiser la creation, exploit and cleaning of a vuln environment here et un python script pour exploiter ce privilùge here. Pour plus d’informations, consultez la original research.

iam.serviceAccounts.setIamPolicy

Un attaquant disposant des permissions mentionnĂ©es pourra ajouter des politiques IAM aux comptes de service. Vous pouvez en abuser pour vous attribuer les permissions nĂ©cessaires pour vous faire passer pour le compte de service. Dans l’exemple suivant, nous nous attribuons le rĂŽle roles/iam.serviceAccountTokenCreator sur le SA intĂ©ressant :

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"

Vous pouvez trouver un script pour automatiser la creation, exploit and cleaning of a vuln environment here.

iam.serviceAccounts.actAs

La permission iam.serviceAccounts.actAs est comme la permission iam:PassRole permission from AWS. Elle est essentielle pour exĂ©cuter des tĂąches, comme lancer une instance Compute Engine, car elle accorde la capacitĂ© de “actAs” un Service Account, garantissant une gestion sĂ©curisĂ©e des permissions. Sans cela, des utilisateurs pourraient obtenir un accĂšs indĂ». De plus, exploiter iam.serviceAccounts.actAs implique diverses mĂ©thodes, chacune nĂ©cessitant un ensemble de permissions, contrairement Ă  d’autres mĂ©thodes qui n’en nĂ©cessitent qu’une seule.

Service account impersonation

Impersonating a service account can be very useful to obtain new and better privileges. Il existe trois façons dont vous pouvez impersonate another service account:

  • Authentication using RSA private keys (covered above)
  • Authorization using Cloud IAM policies (covered here)
  • Deploying jobs on GCP services (more applicable to the compromise of a user account)

iam.serviceAccounts.getOpenIdToken

Un attaquant disposant des permissions mentionnĂ©es pourra gĂ©nĂ©rer un OpenID JWT. Ceux-ci sont utilisĂ©s pour affirmer une identitĂ© et n’apportent pas nĂ©cessairement d’autorisation implicite sur une ressource.

Selon ce interesting post, il est nĂ©cessaire d’indiquer l’audience (le service auprĂšs duquel vous souhaitez utiliser le token pour vous authentifier) et vous recevrez un JWT signĂ© par google indiquant le service account et l’audience du JWT.

Vous pouvez gĂ©nĂ©rer un OpenIDToken (si vous avez l’accĂšs) avec:

# 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

Ensuite, vous pouvez simplement l’utiliser pour accĂ©der au service avec :

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

Certains services prenant en charge l’authentification via ce type de tokens sont :

Vous pouvez trouver un exemple montrant comment crĂ©er un OpenID token au nom d’un service account ici.

Références

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks