# GCP - IAM, Principes & Enumération Non Authentifiée de l'Org

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

## Iam & Principes GCP

Pour plus d'informations, consultez :

{{#ref}}
../gcp-services/gcp-iam-and-org-policies-enum.md
{{#endref}}

### Le domaine est-il utilisé dans Workspace ?

1. **Vérifiez les enregistrements DNS**

S'il a un enregistrement **`google-site-verification`**, il est probable qu'il utilise (ou ait utilisé) Workspace :
```
dig txt hacktricks.xyz

[...]
hacktricks.xyz.		3600	IN	TXT	"google-site-verification=2mWyPXMPXEEy6QqWbCfWkxFTcQhyYdwHrOxee1Yeo-0"
hacktricks.xyz.		3600	IN	TXT	"google-site-verification=C19PtLcZ1EGyzUYYJTX1Tp6bOGessxzN9gqE-SVKhRA"
hacktricks.xyz.		300	IN	TXT	"v=spf1 include:usb._netblocks.mimecast.com include:_spf.google.com include:_spf.psm.knowbe4.com include:_spf.salesforce.com include:spf.mandrillapp.com ~all"
```
Si quelque chose comme **`include:_spf.google.com`** apparaît également, cela le confirme (notez que si cela n'apparaît pas, cela ne le nie pas car un domaine peut être dans Workspace sans utiliser gmail comme fournisseur de messagerie).

2. **Essayez de configurer un Workspace avec ce domaine**

Une autre option est d'essayer de configurer un Workspace en utilisant le domaine, si cela **se plaint que le domaine est déjà utilisé** (comme sur l'image), vous savez qu'il est déjà utilisé !

Pour essayer de configurer un domaine Workspace, suivez : [https://workspace.google.com/business/signup/welcome](https://workspace.google.com/business/signup/welcome)

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

3. **Essayez de récupérer le mot de passe d'un email utilisant ce domaine**

Si vous connaissez une adresse email valide utilisée dans ce domaine (comme : admin@email.com ou info@email.com), vous pouvez essayer de **récupérer le compte** sur [https://accounts.google.com/signin/v2/recoveryidentifier](https://accounts.google.com/signin/v2/recoveryidentifier), et si l'essai ne montre pas une erreur indiquant que Google n'a aucune idée de ce compte, alors il utilise Workspace.

### Énumérer les emails et les comptes de service

Il est possible d'**énumérer les emails valides d'un domaine Workspace et les emails de comptes de service** en essayant de leur attribuer des permissions et en vérifiant les messages d'erreur. Pour cela, vous devez juste avoir les permissions pour attribuer des permissions à un projet (qui peut être juste détenu par vous).

Notez que pour les vérifier mais même s'ils existent, ne leur accordez pas de permission, vous pouvez utiliser le type **`serviceAccount`** quand c'est un **`user`** et **`user`** quand c'est un **`SA`** :
```bash
# Try to assign permissions to user 'unvalid-email-34r434f@hacktricks.xyz'
# but indicating it's a service account
gcloud projects add-iam-policy-binding <project-controlled-by-you> \
--member='serviceAccount:unvalid-email-34r434f@hacktricks.xyz' \
--role='roles/viewer'
## Response:
ERROR: (gcloud.projects.add-iam-policy-binding) INVALID_ARGUMENT: User unvalid-email-34r434f@hacktricks.xyz does not exist.

# Now try with a valid email
gcloud projects add-iam-policy-binding <project-controlled-by-you> \
--member='serviceAccount:support@hacktricks.xyz' \
--role='roles/viewer'
# Response:
ERROR: (gcloud.projects.add-iam-policy-binding) INVALID_ARGUMENT: Principal support@hacktricks.xyz is of type "user". The principal should appear as "user:support@hacktricks.xyz". See https://cloud.google.com/iam/help/members/types for additional documentation.
```
Une méthode plus rapide pour énumérer les Comptes de Service dans des projets connus est simplement d'essayer d'accéder à l'URL : `https://iam.googleapis.com/v1/projects/<project-id>/serviceAccounts/<sa-email>`\
Par exemple : `https://iam.googleapis.com/v1/projects/gcp-labs-3uis1xlx/serviceAccounts/appengine-lab-1-tarsget@gcp-labs-3uis1xlx.iam.gserviceaccount.com`

Si la réponse est un 403, cela signifie que le SA existe. Mais si la réponse est un 404, cela signifie qu'il n'existe pas :
```json
// Exists
{
"error": {
"code": 403,
"message": "Method doesn't allow unregistered callers (callers without established identity). Please use API Key or other form of API consumer identity to call this API.",
"status": "PERMISSION_DENIED"
}
}

// Doesn't exist
{
"error": {
"code": 404,
"message": "Unknown service account",
"status": "NOT_FOUND"
}
}
```
Notez comment, lorsque l'email de l'utilisateur était valide, le message d'erreur indiquait que le type ne l'était pas, nous avons donc réussi à découvrir que l'email support@hacktricks.xyz existe sans lui accorder de privilèges.

Vous pouvez faire **la même chose avec les Comptes de Service** en utilisant le type **`user:`** au lieu de **`serviceAccount:`** :
```bash
# Non existent
gcloud projects add-iam-policy-binding <project-controlled-by-you> \
--member='serviceAccount:<invalid-sa-name>@<proj-uniq-name>.iam.gserviceaccount.com' \
--role='roles/viewer'
# Response
ERROR: (gcloud.projects.add-iam-policy-binding) INVALID_ARGUMENT: User <invalid-sa-name>@<proj-uniq-name>.iam.gserviceaccount.com does not exist.

# Existent
gcloud projects add-iam-policy-binding <project-controlled-by-you> \
--member='serviceAccount:<sa-name>@<proj-uniq-name>.iam.gserviceaccount.com' \
--role='roles/viewer'
# Response
ERROR: (gcloud.projects.add-iam-policy-binding) INVALID_ARGUMENT: Principal testing@digital-bonfire-410512.iam.gserviceaccount.com is of type "serviceAccount". The principal should appear as "serviceAccount:testing@digital-bonfire-410512.iam.gserviceaccount.com". See https://cloud.google.com/iam/help/members/types for additional documentation.
```
{{#include ../../../banners/hacktricks-training.md}}
