GCP - IAM, Principals & Org Unauthenticated Enum

Suporte ao HackTricks

Iam & Principais GCP

Para mais informações, confira:

O domínio é usado no Workspace?

  1. Verifique os registros DNS

Se houver um registro google-site-verification, é provável que esteja (ou tenha estado) usando o 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"

Se algo como include:_spf.google.com também aparecer, isso confirma (note que se não aparecer, não nega, pois um domínio pode estar no Workspace sem usar o gmail como provedor de e-mail).

  1. Tente configurar um Workspace com esse domínio

Outra opção é tentar configurar um Workspace usando o domínio; se ele reclamar que o domínio já está em uso (como na imagem), você sabe que já está em uso!

Para tentar configurar um domínio do Workspace, siga: https://workspace.google.com/business/signup/welcome

  1. Tente recuperar a senha de um e-mail usando esse domínio

Se você souber de algum endereço de e-mail válido sendo usado nesse domínio (como: admin@email.com ou info@email.com), você pode tentar recuperar a conta em https://accounts.google.com/signin/v2/recoveryidentifier, e se a tentativa não mostrar um erro indicando que o Google não tem ideia sobre essa conta, então está usando o Workspace.

Enumerar e-mails e contas de serviço

É possível enumerar e-mails válidos de um domínio do Workspace e e-mails de SA tentando atribuir permissões a eles e verificando as mensagens de erro. Para isso, você só precisa ter permissões para atribuir permissões a um projeto (que pode ser apenas de sua propriedade).

Note que para verificá-los, mas mesmo que existam, não conceda a eles uma permissão, você pode usar o tipo serviceAccount quando for um user e user quando for um 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.

Uma maneira mais rápida de enumerar Contas de Serviço em projetos conhecidos é apenas tentar acessar a URL: https://iam.googleapis.com/v1/projects/<project-id>/serviceAccounts/<sa-email> Por exemplo: https://iam.googleapis.com/v1/projects/gcp-labs-3uis1xlx/serviceAccounts/appengine-lab-1-tarsget@gcp-labs-3uis1xlx.iam.gserviceaccount.com

Se a resposta for 403, isso significa que a Conta de Serviço existe. Mas se a resposta for 404, isso significa que não 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 como quando o e-mail do usuário era válido, a mensagem de erro indicou que o tipo não é, então conseguimos descobrir que o e-mail support@hacktricks.xyz existe sem conceder a ele quaisquer privilégios.

Você pode fazer o mesmo com Contas de Serviço usando o tipo user: em vez 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.
Suporte ao HackTricks

Last updated