GCP - IAM Privesc
IAM
Encuentra más información sobre IAM en:
pageGCP - IAM, Principals & Org Policies Enumiam.roles.update
(iam.roles.get
)
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:
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
)
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
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.
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
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
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
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
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:
Puedes encontrar un script para automatizar la creación, explotación y limpieza de un entorno vulnerable aquí.
iam.serviceAccounts.actAs
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
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:
Entonces puedes usarlo para acceder al servicio con:
Algunos servicios que admiten la autenticación a través de este tipo de tokens son:
Google Cloud Endpoints (si se utiliza Google OIDC)
Puedes encontrar un ejemplo de cómo crear un token OpenID en nombre de una cuenta de servicio aquí.
Referencias
Última actualización