# GCP - IAM, Principes & Enumération des Politiques d'Organisation

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

## Comptes de Service

Pour une introduction sur ce qu'est un compte de service, consultez :

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

### Énumération

Un compte de service appartient toujours à un projet :
```bash
gcloud iam service-accounts list --project <project>
```
## Utilisateurs & Groupes

Pour une introduction sur le fonctionnement des Utilisateurs & Groupes dans GCP, consultez :

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

### Énumération

Avec les permissions **`serviceusage.services.enable`** et **`serviceusage.services.use`**, il est possible d'**activer des services** dans un projet et de les utiliser.

> [!CAUTION]
> Notez qu'en règle générale, les utilisateurs de Workspace se voient attribuer le rôle **Créateur de Projet**, leur donnant accès à **créer de nouveaux projets**. Lorsqu'un utilisateur crée un projet, il se voit attribuer le rôle **`owner`** sur celui-ci. Ainsi, il pourrait **activer ces services sur le projet pour pouvoir énumérer Workspace**.
>
> Cependant, notez qu'il est également nécessaire d'avoir **suffisamment de permissions dans Workspace** pour pouvoir appeler ces API.

Si vous pouvez **activer le service `admin`** et si votre utilisateur a **suffisamment de privilèges dans Workspace**, vous pourriez **énumérer tous les groupes & utilisateurs** avec les lignes suivantes.\
Même s'il est indiqué **`identity groups`**, cela retourne également **des utilisateurs sans aucun groupe** :
```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]
> Dans les exemples précédents, le paramètre `--labels` est requis, donc une valeur générique est utilisée (ce n'est pas requis si vous utilisez l'API directement comme [**PurplePanda le fait ici**](https://github.com/carlospolop/PurplePanda/blob/master/intel/google/discovery/disc_groups_users.py).

Même avec le service admin activé, il est possible que vous rencontriez une erreur lors de leur énumération car votre utilisateur de workspace compromis n'a pas suffisamment de permissions :

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

## IAM

Consultez [**ceci pour des informations de base sur IAM**](../gcp-basic-information/#iam-roles).

### Permissions par défaut

D'après les [**docs**](https://cloud.google.com/resource-manager/docs/default-access-control) : Lorsqu'une ressource d'organisation est créée, tous les utilisateurs de votre domaine se voient accorder par défaut les rôles **Créateur de compte de facturation** et **Créateur de projet**. Ces rôles par défaut permettent à vos utilisateurs de commencer à utiliser Google Cloud immédiatement, mais ne sont pas destinés à être utilisés dans le fonctionnement régulier de votre ressource d'organisation.

Ces **rôles** accordent les **permissions** :

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

De plus, lorsqu'un utilisateur crée un projet, il est **automatiquement accordé propriétaire de ce projet** selon les [docs](https://cloud.google.com/resource-manager/docs/access-control-proj). Par conséquent, par défaut, un utilisateur pourra créer un projet et exécuter n'importe quel service dessus (mineurs ? énumération de Workspace ? ...)

> [!CAUTION]
> Le plus haut privilège dans une organisation GCP est le rôle **Administrateur d'organisation**.

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

Dans la plupart des services, vous pourrez modifier les permissions sur une ressource en utilisant la méthode **`add-iam-policy-binding`** ou **`set-iam-policy`**. La principale différence est que **`add-iam-policy-binding` ajoute un nouveau lien de rôle** à la politique IAM existante tandis que **`set-iam-policy`** va **supprimer les permissions précédemment** accordées et **définir uniquement celles** indiquées dans la commande.

### Énumération
```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

Il existe différentes manières de vérifier toutes les autorisations d'un utilisateur dans différentes ressources (telles que des organisations, des dossiers, des projets...) en utilisant ce service.

- L'autorisation **`cloudasset.assets.searchAllIamPolicies`** peut demander **toutes les politiques IAM** à l'intérieur d'une ressource.
```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
```
- La permission **`cloudasset.assets.analyzeIamPolicy`** peut demander **toutes les politiques iam** d'un principal à l'intérieur d'une ressource.
```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'
```
- La permission **`cloudasset.assets.searchAllResources`** permet de lister toutes les ressources d'une organisation, d'un dossier ou d'un projet. Les ressources liées à IAM (comme les rôles) sont incluses.
```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
```
- La permission **`cloudasset.assets.analyzeMove`** peut également être utile pour récupérer les politiques affectant une ressource comme un projet.
```bash
gcloud asset analyze-move --project=<proj-name> \
--destination-organization=609216679593
```
- Je suppose que la permission **`cloudasset.assets.queryIamPolicy`** pourrait également donner accès pour trouver les permissions des principaux.
```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]
> Si vous **ne pouvez pas accéder aux informations IAM** en utilisant les méthodes précédentes et que vous êtes dans une Red Team. Vous pourriez **utiliser l'outil** [**https://github.com/carlospolop/bf_my_gcp_perms**](https://github.com/carlospolop/bf_my_gcp_perms) **pour forcer vos permissions actuelles.**
>
> Cependant, notez que le service **`cloudresourcemanager.googleapis.com`** doit être activé.

### Privesc

Dans la page suivante, vous pouvez vérifier comment **abuser des permissions IAM pour escalader les privilèges** :

{{#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

Si vous avez des privilèges élevés, vous pourriez :

- Créer de nouveaux SAs (ou utilisateurs si dans Workspace)
- Donner aux principaux contrôlés par vous plus de permissions
- Donner plus de privilèges aux SAs vulnérables (SSRF dans vm, vuln Cloud Function…)
- …

## Org Policies

Pour une introduction sur ce que sont les Org Policies, consultez :

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

Les politiques IAM indiquent les permissions que les principaux ont sur les ressources via des rôles, qui se voient attribuer des permissions granulaires. Les politiques d'organisation **restreignent la manière dont ces services peuvent être utilisés ou quelles fonctionnalités sont désactivées**. Cela aide à améliorer le principe du moindre privilège de chaque ressource dans l'environnement 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

Dans la page suivante, vous pouvez vérifier comment **abuser des autorisations des politiques d'organisation pour élever les privilèges** :

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

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