# GCP - IAM, Principali e Politiche Organizzative Enum

{{#include ../../../banners/hacktricks-training.md}}

## Account di Servizio

Per un'introduzione su cosa sia un account di servizio, controlla:

{{#ref}}
../gcp-basic-information/
{{#endref}}

### Enumerazione

Un account di servizio appartiene sempre a un progetto:
```bash
gcloud iam service-accounts list --project <project>
```
## Utenti e Gruppi

Per un'introduzione su come funzionano Utenti e Gruppi in GCP, controlla:

{{#ref}}
../gcp-basic-information/
{{#endref}}

### Enumerazione

Con i permessi **`serviceusage.services.enable`** e **`serviceusage.services.use`** è possibile **abilitare i servizi** in un progetto e usarli.

> [!CAUTION]
> Nota che per impostazione predefinita, gli utenti di Workspace ricevono il ruolo **Project Creator**, che consente loro di **creare nuovi progetti**. Quando un utente crea un progetto, gli viene assegnato il ruolo **`owner`** su di esso. Quindi, potrebbe **abilitare questi servizi sul progetto per poter enumerare Workspace**.
>
> Tuttavia, nota che è anche necessario avere **sufficienti permessi in Workspace** per poter chiamare queste API.

Se puoi **abilitare il servizio `admin`** e se il tuo utente ha **sufficienti privilegi in workspace,** potresti **enumerare tutti i gruppi e gli utenti** con le seguenti righe.\
Anche se dice **`identity groups`**, restituisce anche **utenti senza alcun gruppo**:
```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]
> Negli esempi precedenti, il parametro `--labels` è richiesto, quindi viene utilizzato un valore generico (non è richiesto se si utilizza l'API direttamente come [**PurplePanda fa qui**](https://github.com/carlospolop/PurplePanda/blob/master/intel/google/discovery/disc_groups_users.py).

Anche con il servizio admin abilitato, è possibile che tu riceva un errore nell'enumerarli perché il tuo utente di workspace compromesso non ha abbastanza permessi:

<figure><img src="../../../images/image (193).png" alt=""><figcaption></figcaption></figure>

## IAM

Controlla [**questo per informazioni di base su IAM**](../gcp-basic-information/#iam-roles).

### Permessi Predefiniti

Dalla [**documentazione**](https://cloud.google.com/resource-manager/docs/default-access-control): Quando viene creato una risorsa dell'organizzazione, a tutti gli utenti nel tuo dominio vengono concessi i ruoli di **Creatore di Account di Fatturazione** e **Creatore di Progetti** per impostazione predefinita. Questi ruoli predefiniti consentono ai tuoi utenti di iniziare a utilizzare Google Cloud immediatamente, ma non sono destinati all'uso nell'operazione regolare della risorsa della tua organizzazione.

Questi **ruoli** concedono i **permessi**:

- `billing.accounts.create` e `resourcemanager.organizations.get`
- `resourcemanager.organizations.get` e `resourcemanager.projects.create`

Inoltre, quando un utente crea un progetto, gli viene **automaticamente concesso il ruolo di proprietario di quel progetto** secondo la [documentazione](https://cloud.google.com/resource-manager/docs/access-control-proj). Pertanto, per impostazione predefinita, un utente sarà in grado di creare un progetto e eseguire qualsiasi servizio su di esso (miner? enumerazione di Workspace? ...)

> [!CAUTION]
> Il privilegio più alto in un'Organizzazione GCP è il ruolo di **Amministratore dell'Organizzazione**.

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

Nella maggior parte dei servizi, sarai in grado di modificare i permessi su una risorsa utilizzando il metodo **`add-iam-policy-binding`** o **`set-iam-policy`**. La principale differenza è che **`add-iam-policy-binding` aggiunge un nuovo binding di ruolo** alla policy IAM esistente, mentre **`set-iam-policy`** **elimina i permessi precedentemente** concessi e **imposta solo quelli** indicati nel comando.

### Enumerazione
```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

Ci sono diversi modi per controllare tutti i permessi di un utente in diverse risorse (come organizzazioni, cartelle, progetti...) utilizzando questo servizio.

- Il permesso **`cloudasset.assets.searchAllIamPolicies`** può richiedere **tutte le politiche IAM** all'interno di una risorsa.
```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
```
- Il permesso **`cloudasset.assets.analyzeIamPolicy`** può richiedere **tutte le politiche iam** di un principale all'interno di una risorsa.
```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'
```
- Il permesso **`cloudasset.assets.searchAllResources`** consente di elencare tutte le risorse di un'organizzazione, cartella o progetto. Risorse relative a IAM (come i ruoli) incluse.
```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
```
- Il permesso **`cloudasset.assets.analyzeMove`** può essere utile anche per recuperare le politiche che influenzano una risorsa come un progetto.
```bash
gcloud asset analyze-move --project=<proj-name> \
--destination-organization=609216679593
```
- Suppongo che il permesso **`cloudasset.assets.queryIamPolicy`** potrebbe anche dare accesso per trovare i permessi dei principali.
```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 **non puoi accedere alle informazioni IAM** utilizzando i metodi precedenti e sei in un Red Team. Potresti **utilizzare lo strumento**[ **https://github.com/carlospolop/bf_my_gcp_perms**](https://github.com/carlospolop/bf_my_gcp_perms) **per forzare le tue attuali autorizzazioni.**
>
> Tuttavia, nota che il servizio **`cloudresourcemanager.googleapis.com`** deve essere abilitato.

### Privesc

Nella pagina seguente puoi controllare come **abuse IAM permissions to escalate privileges**:

{{#ref}}
../gcp-privilege-escalation/gcp-iam-privesc.md
{{#endref}}

### Unauthenticated Enum <a href="#service-account-impersonation" id="service-account-impersonation"></a>

{{#ref}}
../gcp-unauthenticated-enum-and-access/gcp-iam-principals-and-org-unauthenticated-enum.md
{{#endref}}

### Post Exploitation <a href="#service-account-impersonation" id="service-account-impersonation"></a>

{{#ref}}
../gcp-post-exploitation/gcp-iam-post-exploitation.md
{{#endref}}

### Persistence

Se hai privilegi elevati potresti:

- Creare nuovi SAs (o utenti se in Workspace)
- Dare ai principi controllati da te più autorizzazioni
- Dare più privilegi a SAs vulnerabili (SSRF in vm, vuln Cloud Function…)
- …

## Org Policies

Per un'introduzione su cosa sono le Org Policies controlla:

{{#ref}}
../gcp-basic-information/
{{#endref}}

Le politiche IAM indicano le autorizzazioni che i principi hanno sulle risorse tramite ruoli, ai quali sono assegnate autorizzazioni granulari. Le politiche di organizzazione **ristretta come possono essere utilizzati quei servizi o quali funzionalità sono disabilitate**. Questo aiuta a migliorare il principio del minor privilegio per ciascuna risorsa nell'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

Nella pagina seguente puoi controllare come **abusare dei permessi delle politiche organizzative per escalare i privilegi**:

{{#ref}}
../gcp-privilege-escalation/gcp-orgpolicy-privesc.md
{{#endref}}

{{#include ../../../banners/hacktricks-training.md}}
