GCP <--> Workspace Pivoting
Reading time: 12 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
De GCP Ă GWS
Notions de base sur la délégation à l'échelle du domaine
La délégation à l'échelle du domaine de Google Workspace permet à un objet d'identité, soit une application externe du Google Workspace Marketplace, soit un compte de service GCP interne, d'accéder aux données à travers le Workspace au nom des utilisateurs.
note
Cela signifie essentiellement que les comptes de service Ă l'intĂ©rieur des projets GCP d'une organisation pourraient ĂȘtre capables d'imiter les utilisateurs de Workspace de la mĂȘme organisation (ou mĂȘme d'une diffĂ©rente).
Pour plus d'informations sur le fonctionnement exact de cela, consultez :
GCP - Understanding Domain-Wide Delegation
Compromettre une délégation existante
Si un attaquant compromet un accÚs sur GCP et connaßt un email d'utilisateur Workspace valide (de préférence super admin) de l'entreprise, il pourrait énumérer tous les projets auxquels il a accÚs, énumérer tous les SA des projets, vérifier à quels comptes de service il a accÚs, et répéter toutes ces étapes avec chaque SA qu'il peut imiter.
Avec une liste de tous les comptes de service auxquels il a accĂšs et la liste des emails Workspace, l'attaquant pourrait essayer d'imiter l'utilisateur avec chaque compte de service.
caution
Notez que lors de la configuration de la délégation à l'échelle du domaine, aucun utilisateur Workspace n'est nécessaire, donc il suffit de connaßtre un valide pour l'imitation.
Cependant, les privilÚges de l'utilisateur imité seront utilisés, donc s'il s'agit d'un Super Admin, vous pourrez accéder à tout. S'il n'a aucun accÚs, cela sera inutile.
GCP Générer un jeton de délégation
Ce script simple va générer un jeton OAuth en tant qu'utilisateur délégué que vous pouvez ensuite utiliser pour accéder à d'autres API Google avec ou sans gcloud
:
# Impersonate indicated user
python3 gen_delegation_token.py --user-email <user-email> --key-file <path-to-key-file>
# Impersonate indicated user and add additional scopes
python3 gen_delegation_token.py --user-email <user-email> --key-file <path-to-key-file> --scopes "https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/cloud-platform, https://www.googleapis.com/auth/admin.directory.group, https://www.googleapis.com/auth/admin.directory.user, https://www.googleapis.com/auth/admin.directory.domain, https://mail.google.com/, https://www.googleapis.com/auth/drive, openid"
DelePwn
Basé sur l'outil DeleFriend suivant, mais avec quelques ajouts comme la capacité d'énumérer le domaine, le drive, gmail, le calendrier et d'effectuer d'autres opérations.
DeleFriend
C'est un outil qui peut effectuer l'attaque en suivant ces étapes :
- ĂnumĂ©rer les projets GCP en utilisant l'API Resource Manager.
- Itérer sur chaque ressource de projet, et énumérer les ressources de compte de service GCP auxquelles l'utilisateur IAM initial a accÚs en utilisant GetIAMPolicy.
- Itérer sur chaque rÎle de compte de service, et trouver les rÎles intégrés, de base et personnalisés avec la permission serviceAccountKeys.create sur la ressource de compte de service cible. Il convient de noter que le rÎle d'éditeur possÚde intrinsÚquement cette permission.
- Créer une nouvelle clé privée
KEY_ALG_RSA_2048
pour chaque ressource de compte de service qui est trouvée avec la permission pertinente dans la politique IAM. - Itérer sur chaque nouveau compte de service et créer un objet
JWT
pour celui-ci qui est composé des informations d'identification de la clé privée SA et d'un scope OAuth. Le processus de création d'un nouvel objet JWT itérera sur toutes les combinaisons existantes de scopes OAuth de la liste oauth_scopes.txt, afin de trouver toutes les possibilités de délégation. La liste oauth_scopes.txt est mise à jour avec tous les scopes OAuth que nous avons trouvés pertinents pour abuser des identités Workspace. - La méthode
_make_authorization_grant_assertion
révÚle la nécessité de déclarer un utilisateur de workspace cible, appelé subject, pour générer des JWT sous DWD. Bien que cela puisse sembler nécessiter un utilisateur spécifique, il est important de réaliser que DWD influence chaque identité au sein d'un domaine. Par conséquent, créer un JWT pour tout utilisateur de domaine affecte toutes les identités dans ce domaine, conformément à notre vérification d'énumération de combinaison. En d'autres termes, un utilisateur valide de Workspace est suffisant pour avancer.
Cet utilisateur peut ĂȘtre dĂ©fini dans le fichier config.yaml de DeleFriend. Si un utilisateur de workspace cible n'est pas dĂ©jĂ connu, l'outil facilite l'identification automatique des utilisateurs de workspace valides en scannant les utilisateurs de domaine avec des rĂŽles sur les projets GCP. Il est essentiel de noter (encore une fois) que les JWT sont spĂ©cifiques au domaine et ne sont pas gĂ©nĂ©rĂ©s pour chaque utilisateur ; par consĂ©quent, le processus automatique cible une seule identitĂ© unique par domaine. - ĂnumĂ©rer et crĂ©er un nouveau jeton d'accĂšs bearer pour chaque JWT et valider le jeton contre l'API tokeninfo.
Script Python de Gitlab
Gitlab a créé ce script Python qui peut faire deux choses - lister le répertoire des utilisateurs et créer un nouveau compte administratif tout en indiquant un json avec les informations d'identification SA et l'utilisateur à usurper. Voici comment vous l'utiliseriez :
# Install requirements
pip install --upgrade --user oauth2client
# Validate access only
./gcp_delegation.py --keyfile ./credentials.json \
--impersonate steve.admin@target-org.com \
--domain target-org.com
# List the directory
./gcp_delegation.py --keyfile ./credentials.json \
--impersonate steve.admin@target-org.com \
--domain target-org.com \
--list
# Create a new admin account
./gcp_delegation.py --keyfile ./credentials.json \
--impersonate steve.admin@target-org.com \
--domain target-org.com \
--account pwned
Créer une nouvelle délégation (Persistance)
Il est possible de vérifier les délégations à l'échelle du domaine dans https://admin.google.com/u/1/ac/owl/domainwidedelegation.
Un attaquant ayant la capacité de créer des comptes de service dans un projet GCP et des privilÚges de super administrateur sur GWS pourrait créer une nouvelle délégation permettant aux SAs d'usurper l'identité de certains utilisateurs de GWS :
- GĂ©nĂ©ration d'un nouveau compte de service et d'une paire de clĂ©s correspondante : Sur GCP, de nouvelles ressources de compte de service peuvent ĂȘtre produites soit de maniĂšre interactive via la console, soit de maniĂšre programmatique en utilisant des appels API directs et des outils CLI. Cela nĂ©cessite le rĂŽle
iam.serviceAccountAdmin
ou tout rÎle personnalisé équipé de la permissioniam.serviceAccounts.create
. Une fois le compte de service créé, nous procéderons à la génération d'une paire de clés associée (permissioniam.serviceAccountKeys.create
). - CrĂ©ation d'une nouvelle dĂ©lĂ©gation : Il est important de comprendre que seul le rĂŽle de Super Administrateur possĂšde la capacitĂ© de configurer une dĂ©lĂ©gation Ă l'Ă©chelle du domaine dans Google Workspace et que la dĂ©lĂ©gation Ă l'Ă©chelle du domaine ne peut pas ĂȘtre configurĂ©e de maniĂšre programmatique. Elle ne peut ĂȘtre créée et ajustĂ©e manuellement via la console de Google Workspace.
- La crĂ©ation de la rĂšgle peut ĂȘtre trouvĂ©e sous la page ContrĂŽles API â GĂ©rer la dĂ©lĂ©gation Ă l'Ă©chelle du domaine dans la console d'administration de Google Workspace.
- Attacher les privilÚges des portées OAuth : Lors de la configuration d'une nouvelle délégation, Google exige seulement 2 paramÚtres, l'ID client, qui est l'ID OAuth de la ressource de compte de service GCP, et les portées OAuth qui définissent quels appels API la délégation nécessite.
- La liste complĂšte des portĂ©es OAuth peut ĂȘtre trouvĂ©e ici, mais voici une recommandation :
https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/cloud-platform, https://www.googleapis.com/auth/admin.directory.group, https://www.googleapis.com/auth/admin.directory.user, https://www.googleapis.com/auth/admin.directory.domain, https://mail.google.com/, https://www.googleapis.com/auth/drive, openid
- Agir au nom de l'identité cible : à ce stade, nous avons un objet délégué fonctionnel dans GWS. Maintenant, en utilisant la clé privée du compte de service GCP, nous pouvons effectuer des appels API (dans la portée définie dans le paramÚtre de portée OAuth) pour le déclencher et agir au nom de toute identité existant dans Google Workspace. Comme nous l'avons appris, le compte de service générera des jetons d'accÚs selon ses besoins et en fonction des permissions qu'il a pour les applications REST API.
- Consultez la section précédente pour quelques outils permettant d'utiliser cette délégation.
Délégation inter-organisationnelle
L'ID SA OAuth est global et peut ĂȘtre utilisĂ© pour la dĂ©lĂ©gation inter-organisationnelle. Aucune restriction n'a Ă©tĂ© mise en place pour empĂȘcher la dĂ©lĂ©gation inter-groupe. En termes simples, les comptes de service de diffĂ©rentes organisations GCP peuvent ĂȘtre utilisĂ©s pour configurer une dĂ©lĂ©gation Ă l'Ă©chelle du domaine sur d'autres organisations Workspace. Cela signifierait qu'il suffit d'un accĂšs de Super Administrateur Ă Workspace, et non d'un accĂšs au mĂȘme compte GCP, car l'adversaire peut crĂ©er des comptes de service et des clĂ©s privĂ©es sur son compte GCP personnel.
Création d'un projet pour énumérer Workspace
Par défaut, les utilisateurs de Workspace ont la permission de créer de nouveaux projets, et lorsqu'un nouveau projet est créé, le créateur obtient le rÎle de Propriétaire sur celui-ci.
Par conséquent, un utilisateur peut créer un projet, activer les API pour énumérer Workspace dans son nouveau projet et essayer de l'énumérer.
caution
Afin qu'un utilisateur puisse énumérer Workspace, il a également besoin de suffisamment de permissions Workspace (tous les utilisateurs ne pourront pas énumérer le répertoire).
# Create project
gcloud projects create <uniq-projec-name> --name=proj-name
# Set project
gcloud config set project <uniq-projec-name>
# Enable svcs
gcloud services enable admin.googleapis.com
gcloud services enable cloudidentity.googleapis.com
# Get org ID
gcloud organizations list
# Get currents email user groups (at least you can check the groups and members of the groups you belong to)
gcloud identity groups memberships search-transitive-groups --member-email <email> --labels=cloudidentity.googleapis.com/groups.discussion_forum
gcloud identity groups memberships list --group-email=g<group-email>
# FROM HERE THE USER NEEDS TO HAVE ENOUGH WORKSPACE ACCESS
gcloud beta identity groups preview --customer <org-cust-id>
Vérifiez plus d'énumération dans :
GCP - IAM, Principals & Org Policies Enum
Abus des identifiants Gcloud
Vous pouvez trouver plus d'informations sur le flux gcloud
pour se connecter Ă :
Comme expliqué là -bas, gcloud peut demander la portée https://www.googleapis.com/auth/drive
qui permettrait à un utilisateur d'accéder au drive de l'utilisateur.
En tant qu'attaquant, si vous avez compromis physiquement l'ordinateur d'un utilisateur et que l'utilisateur est toujours connecté avec son compte, vous pourriez vous connecter en générant un jeton avec accÚs au drive en utilisant :
gcloud auth login --enable-gdrive-access
Si un attaquant compromet l'ordinateur d'un utilisateur, il pourrait également modifier le fichier google-cloud-sdk/lib/googlecloudsdk/core/config.py
et ajouter dans le CLOUDSDK_SCOPES
la portée 'https://www.googleapis.com/auth/drive'
:
.png)
warning
Par consĂ©quent, la prochaine fois que l'utilisateur se connectera, il crĂ©era un token avec accĂšs Ă drive que l'attaquant pourrait abuser pour accĂ©der au drive. Ăvidemment, le navigateur indiquera que le token gĂ©nĂ©rĂ© aura accĂšs Ă drive, mais comme l'utilisateur se connectera lui-mĂȘme avec gcloud auth login
, il ne soupçonnera probablement rien.
Pour lister les fichiers drive : curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://www.googleapis.com/drive/v3/files"
De GWS Ă GCP
Accéder aux utilisateurs privilégiés de GCP
Si un attaquant a un accĂšs complet Ă GWS, il pourra accĂ©der Ă des groupes avec un accĂšs privilĂ©giĂ© Ă GCP ou mĂȘme Ă des utilisateurs, donc passer de GWS Ă GCP est gĂ©nĂ©ralement plus "simple" simplement parce que les utilisateurs dans GWS ont des privilĂšges Ă©levĂ©s sur GCP.
Escalade de privilĂšges Google Groups
Par défaut, les utilisateurs peuvent rejoindre librement les groupes Workspace de l'Organisation et ces groupes peuvent avoir des permissions GCP assignées (vérifiez vos groupes sur https://groups.google.com/).
En abusant de la privesc des groupes google, vous pourriez ĂȘtre en mesure d'escalader vers un groupe avec un certain type d'accĂšs privilĂ©giĂ© Ă GCP.
Références
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.