GCP - IAM Privesc

Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

IAM

Encuentra más información sobre IAM en:

pageGCP - IAM, Principals & Org Policies Enum

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

Un atacante con los permisos mencionados podrá actualizar un rol asignado a ti y otorgarte permisos adicionales a otros recursos como:

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

Puedes encontrar un script para automatizar la creación, explotación y limpieza de un entorno vulnerable aquí y un script en python para abusar de este privilegio aquí. Para más información, consulta la investigación original.

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

Un atacante con los permisos mencionados podrá solicitar un token de acceso que pertenece a una Cuenta de Servicio, por lo que es posible solicitar un token de acceso de una Cuenta de Servicio con más privilegios que los nuestros.

Puedes encontrar un script para automatizar la creación, explotación y limpieza de un entorno vulnerable aquí y un script en python para abusar de este privilegio aquí. Para más información, consulta la investigación original.

iam.serviceAccountKeys.create

Un atacante con los permisos mencionados podrá crear una clave gestionada por el usuario para una Cuenta de Servicio, lo que nos permitirá acceder a GCP como esa Cuenta de Servicio.

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

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

Puedes encontrar un script para automatizar la creación, explotación y limpieza de un entorno vulnerable aquí y un script en python para abusar de este privilegio aquí. Para obtener más información, consulta la investigación original.

Nota que iam.serviceAccountKeys.update no funcionará para modificar la clave de un SA porque se necesita también el permiso iam.serviceAccountKeys.create.

iam.serviceAccounts.implicitDelegation

Si tienes el permiso iam.serviceAccounts.implicitDelegation en una Cuenta de Servicio que tiene el permiso iam.serviceAccounts.getAccessToken en una tercera Cuenta de Servicio, entonces puedes usar la delegación implícita para crear un token para esa tercera Cuenta de Servicio. Aquí tienes un diagrama para ayudar a explicar.

Puedes encontrar un script para automatizar la creación, explotación y limpieza de un entorno vulnerable aquí y un script en python para abusar de este privilegio aquí. Para obtener más información, consulta la investigación original.

Nota que según la documentación, la delegación solo funciona para generar un token utilizando el método generateAccessToken().

iam.serviceAccounts.signBlob

Un atacante con los permisos mencionados podrá firmar cargas arbitrarias en GCP. Por lo tanto, será posible crear un JWT no firmado del SA y luego enviarlo como un blob para que el JWT sea firmado por el SA que estamos apuntando. Para obtener más información lee esto.

Puedes encontrar un script para automatizar la creación, explotación y limpieza de un entorno vulnerable aquí y un script en python para abusar de este privilegio aquí y aquí. Para obtener más información, consulta la investigación original.

iam.serviceAccounts.signJwt

Un atacante con los permisos mencionados podrá firmar tokens JSON web (JWTs) bien formados. La diferencia con el método anterior es que en lugar de hacer que Google firme un blob que contiene un JWT, usamos el método signJWT que ya espera un JWT. Esto facilita su uso, pero solo puedes firmar JWT en lugar de cualquier bytes.

Puedes encontrar un script para automatizar la creación, explotación y limpieza de un entorno vulnerable aquí y un script en python para abusar de este privilegio aquí. Para obtener más información, consulta la investigación original.

iam.serviceAccounts.setIamPolicy

Un atacante con los permisos mencionados podrá agregar políticas de IAM a las cuentas de servicio. Puedes abusar de esto para concederte los permisos que necesitas para suplantar la cuenta de servicio. En el siguiente ejemplo nos estamos otorgando el rol roles/iam.serviceAccountTokenCreator sobre la SA de interés:

gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
--member="user:username@domain.com" \
--role="roles/iam.serviceAccountTokenCreator"

Puedes encontrar un script para automatizar la creación, explotación y limpieza de un entorno vulnerable aquí.

iam.serviceAccounts.actAs

El permiso iam.serviceAccounts.actAs es similar al permiso iam:PassRole de AWS. Es esencial para ejecutar tareas, como iniciar una instancia de Compute Engine, ya que otorga la capacidad de "actuar como" una Cuenta de Servicio, asegurando una gestión segura de permisos. Sin esto, los usuarios podrían obtener acceso indebido. Además, explotar el iam.serviceAccounts.actAs implica varios métodos, cada uno requiriendo un conjunto de permisos, a diferencia de otros métodos que solo necesitan uno.

Suplantación de cuenta de servicio

Suplantar una cuenta de servicio puede ser muy útil para obtener nuevos y mejores privilegios. Hay tres formas en las que puedes suplantar otra cuenta de servicio:

  • Autenticación usando claves privadas RSA (mencionado anteriormente)

  • Autorización usando políticas de Cloud IAM (mencionado aquí)

  • Implementar trabajos en servicios de GCP (más aplicable al compromiso de una cuenta de usuario)

iam.serviceAccounts.getOpenIdToken

Un atacante con los permisos mencionados podrá generar un JWT OpenID. Estos se utilizan para afirmar la identidad y no necesariamente llevan implícita ninguna autorización contra un recurso.

Según este interesante post, es necesario indicar la audiencia (servicio donde deseas usar el token para autenticarte) y recibirás un JWT firmado por Google indicando la cuenta de servicio y la audiencia del JWT.

Puedes generar un OpenIDToken (si tienes acceso) con:

# 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

Entonces puedes usarlo para acceder al servicio con:

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

Algunos servicios que admiten la autenticación a través de este tipo de tokens son:

Puedes encontrar un ejemplo de cómo crear un token OpenID en nombre de una cuenta de servicio aquí.

Referencias

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización