GCP - IAM, Principais e Enumeração de Políticas de Org

Reading time: 9 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Contas de Serviço

Para uma introdução sobre o que é uma conta de serviço, veja:

GCP - Basic Information

Enumeração

Uma conta de serviço sempre pertence a um projeto:

bash
gcloud iam service-accounts list --project <project>

Usuários e Grupos

Para uma introdução sobre como Usuários e Grupos funcionam no GCP, consulte:

GCP - Basic Information

Enumeração

Com as permissões serviceusage.services.enable e serviceusage.services.use, é possível habilitar serviços em um projeto e usá-los.

caution

Observe que, por padrão, os usuários do Workspace recebem a função Criador de Projetos, dando-lhes acesso para criar novos projetos. Quando um usuário cria um projeto, ele recebe a função owner sobre ele. Assim, ele poderia habilitar esses serviços sobre o projeto para poder enumerar o Workspace.

No entanto, observe que também é necessário ter permissões suficientes no Workspace para poder chamar essas APIs.

Se você puder habilitar o serviço admin e se seu usuário tiver privilegios suficientes no workspace, você poderia enumerar todos os grupos e usuários com as seguintes linhas.
Mesmo que diga identity groups, também retorna usuários sem nenhum grupo:

bash
# Enable admin
gcloud services enable admin.googleapis.com
gcloud services enable cloudidentity.googleapis.com

# Using admin.googleapis.com
## List all users
gcloud organizations list #The DIRECTORY_CUSTOMER_ID is the Workspace ID
gcloud beta identity groups preview --customer <workspace-id>

# Using cloudidentity.googleapis.com
## List groups of a user (you can list at least the groups you belong to)
gcloud identity groups memberships search-transitive-groups --member-email <email> --labels=cloudidentity.googleapis.com/groups.discussion_forum

## List Group Members (you can list at least the groups you belong to)
gcloud identity groups memberships list --group-email=<email>
### Make it transitive
gcloud identity groups memberships search-transitive-memberships --group-email=<email>

## Get a graph (if you have enough permissions)
gcloud identity groups memberships get-membership-graph --member-email=<email> --labels=cloudidentity.googleapis.com/groups.discussion_forum

tip

Nos exemplos anteriores, o parâmetro --labels é obrigatório, então um valor genérico é usado (não é necessário se você usar a API diretamente como PurplePanda faz aqui.

Mesmo com o serviço de administrador habilitado, é possível que você receba um erro ao enumerá-los porque seu usuário de workspace comprometido não tem permissões suficientes:

IAM

Verifique isso para informações básicas sobre IAM.

Permissões Padrão

De acordo com os docs: Quando um recurso de organização é criado, todos os usuários em seu domínio recebem as funções de Criador de Conta de Cobrança e Criador de Projeto por padrão. Essas funções padrão permitem que seus usuários comecem a usar o Google Cloud imediatamente, mas não são destinadas ao uso na operação regular do recurso de organização.

Essas funções concedem as permissões:

  • billing.accounts.create e resourcemanager.organizations.get
  • resourcemanager.organizations.get e resourcemanager.projects.create

Além disso, quando um usuário cria um projeto, ele é concedido como proprietário desse projeto automaticamente de acordo com os docs. Portanto, por padrão, um usuário poderá criar um projeto e executar qualquer serviço nele (mineradores? Enumeração de Workspace? ...)

caution

O maior privilégio em uma Organização GCP é a função de Administrador da Organização.

set-iam-policy vs add-iam-policy-binding

Na maioria dos serviços, você poderá alterar as permissões sobre um recurso usando o método add-iam-policy-binding ou set-iam-policy. A principal diferença é que add-iam-policy-binding adiciona uma nova vinculação de função à política IAM existente, enquanto set-iam-policy irá deletar as permissões anteriormente concedidas e definir apenas as que estão indicadas no comando.

Enumeração

bash
# Roles
## List roles
gcloud iam roles list --project $PROJECT_ID # List only custom roles
gcloud iam roles list --filter='etag:AA=='

## Get perms and description of role
gcloud iam roles describe roles/container.admin
gcloud iam roles describe --project <proj-name> <role-name>

# Policies
gcloud organizations get-iam-policy <org_id>
gcloud resource-manager folders get-iam-policy <folder-id>
gcloud projects get-iam-policy <project-id>

# MISC
## Testable permissions in resource
gcloud iam list-testable-permissions --filter "NOT apiDisabled: true" <resource>
## Grantable roles to a resource
gcloud iam list-grantable-roles <project URL>

cloudasset IAM Enumeration

Existem diferentes maneiras de verificar todas as permissões de um usuário em diferentes recursos (como organizações, pastas, projetos...) usando este serviço.

  • A permissão cloudasset.assets.searchAllIamPolicies pode solicitar todas as políticas iam dentro de um recurso.
bash
gcloud asset search-all-iam-policies #By default uses current configured project
gcloud asset search-all-iam-policies --scope folders/1234567
gcloud asset search-all-iam-policies --scope organizations/123456
gcloud asset search-all-iam-policies --scope projects/project-id-123123
  • A permissão cloudasset.assets.analyzeIamPolicy pode solicitar todas as políticas iam de um principal dentro de um recurso.
bash
# Needs perm "cloudasset.assets.analyzeIamPolicy" over the asset
gcloud asset analyze-iam-policy --organization=<org-id> \
--identity='user:email@hacktricks.xyz'
gcloud asset analyze-iam-policy --folder=<folder-id> \
--identity='user:email@hacktricks.xyz'
gcloud asset analyze-iam-policy --project=<project-name> \
--identity='user:email@hacktricks.xyz'
  • A permissão cloudasset.assets.searchAllResources permite listar todos os recursos de uma organização, pasta ou projeto. Recursos relacionados ao IAM (como funções) incluídos.
bash
gcloud asset search-all-resources --scope projects/<proj-name>
gcloud asset search-all-resources --scope folders/1234567
gcloud asset search-all-resources --scope organizations/123456
  • A permissão cloudasset.assets.analyzeMove pode ser útil para também recuperar políticas que afetam um recurso como um projeto.
bash
gcloud asset analyze-move --project=<proj-name> \
--destination-organization=609216679593
  • Eu suponho que a permissão cloudasset.assets.queryIamPolicy também poderia dar acesso para encontrar permissões de principais.
bash
# But, when running something like this
gcloud asset query --project=<proj> --statement='SELECT * FROM compute_googleapis_com_Instance'
# I get the error
ERROR: (gcloud.asset.query) UNAUTHENTICATED: QueryAssets API is only supported for SCC premium customers. See https://cloud.google.com/security-command-center/pricing

testIamPermissions enumeration

caution

Se você não consegue acessar informações do IAM usando os métodos anteriores e está em uma Red Team. Você pode usar a ferramenta https://github.com/carlospolop/bf_my_gcp_perms para forçar suas permissões atuais.

No entanto, observe que o serviço cloudresourcemanager.googleapis.com precisa estar habilitado.

Privesc

Na página a seguir, você pode verificar como abusar das permissões do IAM para escalar privilégios:

GCP - IAM Privesc

Unauthenticated Enum

GCP - IAM, Principals & Org Unauthenticated Enum

Post Exploitation

GCP - IAM Post Exploitation

Persistence

Se você tiver altos privilégios, você pode:

  • Criar novas SAs (ou usuários se estiver no Workspace)
  • Dar a principais controlados por você mais permissões
  • Dar mais privilégios a SAs vulneráveis (SSRF em vm, Cloud Function vulnerável…)

Org Policies

Para uma introdução sobre o que são Org Policies, verifique:

GCP - Basic Information

As políticas do IAM indicam as permissões que os principais têm sobre os recursos por meio de funções, que são atribuídas a permissões granulares. As políticas de organização restrigem como esses serviços podem ser usados ou quais recursos estão desativados. Isso ajuda a melhorar o menor privilégio de cada recurso no ambiente GCP.

bash
gcloud resource-manager org-policies list --organization=ORGANIZATION_ID
gcloud resource-manager org-policies list --folder=FOLDER_ID
gcloud resource-manager org-policies list --project=PROJECT_ID

Privesc

Na página a seguir, você pode verificar como abusar das permissões de políticas organizacionais para escalar privilégios:

GCP - Orgpolicy Privesc

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks