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

Trouvez plus d’informations sur IAM dans:

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 accorder 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’exploitation et le nettoyage d’un environnement vulnĂ©rable ici et un script python pour abuser de ce privilĂšge here. Pour plus d’informations, consultez la original research.

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/organisation. Entre les mains d’un attaquant, c’est dangereux car elle 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’escalader les 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 d’obtenir un access token d’un Service Account ayant des privilĂšges supĂ©rieurs aux nĂŽtres.

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 compte de service, ce qui nous permettra d’accĂ©der Ă  GCP en tant que ce compte de service.

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 fonctionnera pas pour modifier la clĂ© d’un SA car pour cela la permission iam.serviceAccountKeys.create est Ă©galement nĂ©cessaire.

iam.serviceAccounts.implicitDelegation

Si vous avez la permission iam.serviceAccounts.implicitDelegation sur un Service Account qui dispose de la permission iam.serviceAccounts.getAccessToken sur un troisiÚme Service Account, alors vous pouvez utiliser implicitDelegation pour créer un token pour ce troisiÚme Service Account. Voici un diagramme pour aider à expliquer.

Notez que selon 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 script python pour abuser de 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 que le JWT soit signĂ© 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 script python pour abuser de 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 facile Ă  utiliser, mais vous pouvez seulement signer 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 script python pour abuser de 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 accorder les autorisations nĂ©cessaires pour vous faire passer pour le compte de service. Dans l’exemple suivant, nous nous accordons 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 crĂ©ation, exploitation et nettoyage d’un environnement vulnĂ©rable ici.

iam.serviceAccounts.actAs

La iam.serviceAccounts.actAs permission est similaire Ă  la iam:PassRole permission from AWS. Elle est essentielle pour exĂ©cuter des tĂąches, comme dĂ©marrer 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 indu. De plus, exploiter la 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 (traitĂ© ci‑dessus)
  • Authorization using Cloud IAM policies (traitĂ© ici)
  • Deploying jobs on GCP services (plus applicable Ă  la compromission d’un compte utilisateur)

iam.serviceAccounts.getOpenIdToken

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

Selon cet article intĂ©ressant, 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 y avez 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 qui prennent en charge l’authentification via ce type de jetons sont :

Vous pouvez trouver un exemple montrant comment crĂ©er un token OpenID au nom d’un compte de service 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