GCP - IAM, Principals & Org Unauthenticated Enum

Apoya a HackTricks

Iam y Principales de GCP

Para más información consulta:

GCP - IAM, Principals & Org Policies Enum

¿Se utiliza el dominio en Workspace?

  1. Verifica los registros DNS

Si tiene un registro google-site-verification, es probable que esté (o haya estado) utilizando Workspace:

dig txt hacktricks.xyz

[...]
hacktricks.xyz.		3600	IN	TXT	"google-site-verification=2mWyPXMPXEEy6QqWbCfWkxFTcQhyYdwHrOxee1Yeo-0"
hacktricks.xyz.		3600	IN	TXT	"google-site-verification=C19PtLcZ1EGyzUYYJTX1Tp6bOGessxzN9gqE-SVKhRA"
hacktricks.xyz.		300	IN	TXT	"v=spf1 include:usb._netblocks.mimecast.com include:_spf.google.com include:_spf.psm.knowbe4.com include:_spf.salesforce.com include:spf.mandrillapp.com ~all"

Si algo como include:_spf.google.com también aparece, lo confirma (ten en cuenta que si no aparece, no lo niega, ya que un dominio puede estar en Workspace sin usar Gmail como proveedor de correo).

  1. Intenta configurar un Workspace con ese dominio

Otra opción es intentar configurar un Workspace usando el dominio; si se queja de que el dominio ya está en uso (como en la imagen), ¡sabes que ya está en uso!

Para intentar configurar un dominio de Workspace sigue: https://workspace.google.com/business/signup/welcome

  1. Intenta recuperar la contraseña de un correo electrónico usando ese dominio

Si conoces alguna dirección de correo electrónico válida que se esté utilizando en ese dominio (como: admin@email.com o info@email.com), puedes intentar recuperar la cuenta en https://accounts.google.com/signin/v2/recoveryidentifier, y si al intentar no muestra un error que indique que Google no tiene idea sobre esa cuenta, entonces está usando Workspace.

Enumerar correos electrónicos y cuentas de servicio

Es posible enumerar correos electrónicos válidos de un dominio de Workspace y correos electrónicos de SA intentando asignarles permisos y verificando los mensajes de error. Para esto, solo necesitas tener permisos para asignar permisos a un proyecto (que puede ser solo de tu propiedad).

Ten en cuenta que para verificarlos, pero incluso si existen, no les otorgues un permiso, puedes usar el tipo serviceAccount cuando es un user y user cuando es un SA:

# Try to assign permissions to user 'unvalid-email-34r434f@hacktricks.xyz'
# but indicating it's a service account
gcloud projects add-iam-policy-binding <project-controlled-by-you> \
--member='serviceAccount:unvalid-email-34r434f@hacktricks.xyz' \
--role='roles/viewer'
## Response:
ERROR: (gcloud.projects.add-iam-policy-binding) INVALID_ARGUMENT: User unvalid-email-34r434f@hacktricks.xyz does not exist.

# Now try with a valid email
gcloud projects add-iam-policy-binding <project-controlled-by-you> \
--member='serviceAccount:support@hacktricks.xyz' \
--role='roles/viewer'
# Response:
ERROR: (gcloud.projects.add-iam-policy-binding) INVALID_ARGUMENT: Principal support@hacktricks.xyz is of type "user". The principal should appear as "user:support@hacktricks.xyz". See https://cloud.google.com/iam/help/members/types for additional documentation.

Una forma más rápida de enumerar Cuentas de Servicio en proyectos conocidos es simplemente intentar acceder a la URL: https://iam.googleapis.com/v1/projects/<project-id>/serviceAccounts/<sa-email> Por ejemplo: https://iam.googleapis.com/v1/projects/gcp-labs-3uis1xlx/serviceAccounts/appengine-lab-1-tarsget@gcp-labs-3uis1xlx.iam.gserviceaccount.com

Si la respuesta es un 403, significa que la CA existe. Pero si la respuesta es un 404, significa que no existe:

// Exists
{
"error": {
"code": 403,
"message": "Method doesn't allow unregistered callers (callers without established identity). Please use API Key or other form of API consumer identity to call this API.",
"status": "PERMISSION_DENIED"
}
}

// Doesn't exist
{
"error": {
"code": 404,
"message": "Unknown service account",
"status": "NOT_FOUND"
}
}

Note cómo cuando el correo electrónico del usuario era válido, el mensaje de error indicaba que el tipo no lo es, así que logramos descubrir que el correo electrónico support@hacktricks.xyz existe sin otorgarle ningún privilegio.

Puedes hacer lo mismo con Cuentas de Servicio usando el tipo user: en lugar de serviceAccount::

# Non existent
gcloud projects add-iam-policy-binding <project-controlled-by-you> \
--member='serviceAccount:<invalid-sa-name>@<proj-uniq-name>.iam.gserviceaccount.com' \
--role='roles/viewer'
# Response
ERROR: (gcloud.projects.add-iam-policy-binding) INVALID_ARGUMENT: User <invalid-sa-name>@<proj-uniq-name>.iam.gserviceaccount.com does not exist.

# Existent
gcloud projects add-iam-policy-binding <project-controlled-by-you> \
--member='serviceAccount:<sa-name>@<proj-uniq-name>.iam.gserviceaccount.com' \
--role='roles/viewer'
# Response
ERROR: (gcloud.projects.add-iam-policy-binding) INVALID_ARGUMENT: Principal testing@digital-bonfire-410512.iam.gserviceaccount.com is of type "serviceAccount". The principal should appear as "serviceAccount:testing@digital-bonfire-410512.iam.gserviceaccount.com". See https://cloud.google.com/iam/help/members/types for additional documentation.
Apoya a HackTricks

Last updated