GCP - IAM, Principals & Org Policies Enum

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Comptes de Service

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

pageGCP - Basic Information

Énumération

Un compte de service appartient toujours à un projet :

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

Utilisateurs & Groupes

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

pageGCP - Basic Information

Énumération

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

Notez qu'en général, les utilisateurs de Workspace se voient accorder le rôle de Créateur de projet par défaut, ce qui leur donne accès à la création de nouveaux projets. Lorsqu'un utilisateur crée un projet, il se voit attribuer le rôle de propriétaire. Ainsi, il pourrait activer ces services sur le projet pour pouvoir énumérer Workspace.

Cependant, il est également nécessaire d'avoir suffisamment d'autorisations 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 et utilisateurs avec les lignes suivantes. Même si cela indique groupes d'identité, cela renvoie également des utilisateurs sans aucun groupe :

# 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

Dans les exemples précédents, le paramètre --labels est requis, donc une valeur générique est utilisée (il n'est pas nécessaire si vous utilisez directement l'API comme le fait PurplePanda ici.

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

IAM

Consultez ceci pour des informations de base sur IAM.

Autorisations par défaut

D'après les docs : Lorsqu'une ressource d'organisation est créée, tous les utilisateurs de votre domaine se voient accorder les rôles de Créateur de compte de facturation et de Créateur de projet par défaut. 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 la ressource de votre organisation.

Ces rôles accordent les autorisations :

  • 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. Par conséquent, par défaut, un utilisateur pourra créer un projet et exécuter n'importe quel service dessus (miners ? Énumération de l'espace de travail ? ...)

Le plus haut privilège dans une organisation GCP est le rôle Administrateur de l'organisation.

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

Dans la plupart des services, vous pourrez modifier les autorisations 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 stratégie IAM existante tandis que set-iam-policy va supprimer les autorisations précédemment accordées et définir uniquement celles indiquées dans la commande.

Énumération

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

Enumération IAM cloudasset

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

  • La permission cloudasset.assets.searchAllIamPolicies peut demander toutes les politiques IAM à l'intérieur d'une ressource.

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.

# 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 répertorier toutes les ressources d'une organisation, d'un dossier ou d'un projet, y compris les ressources liées à IAM (comme les rôles).

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 être utile pour récupérer également les politiques affectant une ressource comme un projet

gcloud asset analyze-move --project=<proj-name> \
--destination-organization=609216679593
  • Je suppose que l'autorisation cloudasset.assets.queryIamPolicy pourrait également donner accès à la recherche des autorisations des principaux

# 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

Énumération des autorisations testIamPermissions

Si vous ne pouvez pas accéder aux informations IAM en utilisant les méthodes précédentes et que vous êtes dans une équipe Red, vous pourriez utiliser l'outil https://github.com/carlospolop/bf_my_gcp_perms pour forcer vos autorisations actuelles.

Cependant, notez que le service cloudresourcemanager.googleapis.com doit être activé.

Élévation de privilèges

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

pageGCP - IAM Privesc

Énumération non authentifiée

pageGCP - IAM, Principals & Org Unauthenticated Enum

Post-exploitation

pageGCP - IAM Post Exploitation

Persistance

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

  • Créer de nouveaux SA (ou utilisateurs si dans Workspace)

  • Donner plus d'autorisations aux principaux contrôlés par vous-même

  • Accorder plus de privilèges aux SA vulnérables (SSRF dans vm, vuln Cloud Function…)

  • ...

Politiques d'organisation

Pour une introduction sur ce que sont les politiques d'organisation, consultez :

pageGCP - Basic Information

Les politiques IAM indiquent les autorisations que les principaux ont sur les ressources via des rôles, qui sont des autorisations granulaires attribuées. 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.

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

Élévation de privilèges

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

pageGCP - Orgpolicy Privesc
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Dernière mise à jour