# GCP - IAM, Principals & Org Policies Enum

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

## Diensrekening

Vir 'n inleiding oor wat 'n diensrekening is, kyk:

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

### Enumerasie

'n Diensrekening behoort altyd aan 'n projek:
```bash
gcloud iam service-accounts list --project <project>
```
## Gebruikers & Groepe

Vir 'n inleiding oor hoe Gebruikers & Groepe in GCP werk, kyk:

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

### Enumerasie

Met die toestemmings **`serviceusage.services.enable`** en **`serviceusage.services.use`** is dit moontlik om **dienste** in 'n projek te **aktiveer** en dit te gebruik.

> [!CAUTION]
> Let daarop dat Workspace-gebruikers standaard die rol **Project Creator** toegeken kry, wat hulle toegang gee om **nuwe projekte te skep**. Wanneer 'n gebruiker 'n projek skep, word hy die **`owner`** rol oor dit toegeken. So, hy kan **hierdie dienste oor die projek aktiveer om in staat te wees om Workspace te enumerate**.
>
> Dit is egter ook nodig om **voldoende toestemmings in Workspace** te hê om hierdie API's aan te roep.

As jy die **`admin` diens** kan **aktiveer** en as jou gebruiker **voldoende voorregte in workspace** het, kan jy **alle groepe & gebruikers** met die volgende lyne **enumerate**.\
Selfs al sê dit **`identity groups`**, keer dit ook **gebruikers sonder enige groepe** terug:
```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]
> In die vorige voorbeelde is die parameter `--labels` vereis, so 'n generiese waarde word gebruik (dit is nie vereis as jy die API direk gebruik nie soos [**PurplePanda hier doen**](https://github.com/carlospolop/PurplePanda/blob/master/intel/google/discovery/disc_groups_users.py).

Selfs met die admin diens geaktiveer, is dit moontlik dat jy 'n fout kry wanneer jy hulle opnoem omdat jou gecompromitteerde werkruimte gebruiker nie genoeg toestemming het nie:

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

## IAM

Kyk na [**hierdie vir basiese inligting oor IAM**](../gcp-basic-information/#iam-roles).

### Standaard Toestemmings

Van die [**dokumentasie**](https://cloud.google.com/resource-manager/docs/default-access-control): Wanneer 'n organisasie hulpbron geskep word, word alle gebruikers in jou domein standaard die **Billing Account Creator** en **Project Creator** rolle toegeken. Hierdie standaard rolle stel jou gebruikers in staat om Google Cloud onmiddellik te begin gebruik, maar is nie bedoel vir gebruik in die gewone werking van jou organisasie hulpbron nie.

Hierdie **rolle** gee die **toestemmings**:

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

Boonop, wanneer 'n gebruiker 'n projek skep, word hy **automaties die eienaar van daardie projek toegeken** volgens die [dokumentasie](https://cloud.google.com/resource-manager/docs/access-control-proj). Daarom, standaard, sal 'n gebruiker in staat wees om 'n projek te skep en enige diens daarop te laat loop (miners? Werkruimte opnoeming? ...)

> [!CAUTION]
> Die hoogste voorreg in 'n GCP Organisasie is die **Organisasie Administrateur** rol.

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

In die meeste van die dienste sal jy in staat wees om die toestemmings oor 'n hulpbron te verander deur die metode **`add-iam-policy-binding`** of **`set-iam-policy`** te gebruik. Die hoof verskil is dat **`add-iam-policy-binding` 'n nuwe rol binding byvoeg** tot die bestaande IAM beleid terwyl **`set-iam-policy`** die **voorheen** toegeken toestemmings sal **verwyder** en **slegs diegene** wat in die opdrag aangedui is, sal **stel**.

### Opname
```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 Enumerasie

Daar is verskillende maniere om al die toestemmings van 'n gebruiker in verskillende hulpbronne (soos organisasies, vouers, projekte...) te kontroleer met behulp van hierdie diens.

- Die toestemming **`cloudasset.assets.searchAllIamPolicies`** kan **alle iam beleide** binne 'n hulpbron aanvra.
```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
```
- Die toestemming **`cloudasset.assets.analyzeIamPolicy`** kan **alle iam-beleide** van 'n prinsiep binne 'n hulpbron versoek.
```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'
```
- Die toestemming **`cloudasset.assets.searchAllResources`** stel in staat om alle hulpbronne van 'n organisasie, gids of projek op te lys. IAM-verwante hulpbronne (soos rolle) ingesluit.
```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
```
- Die toestemming **`cloudasset.assets.analyzeMove`** kan nuttig wees om ook beleide te verkry wat 'n hulpbron soos 'n projek beïnvloed.
```bash
gcloud asset analyze-move --project=<proj-name> \
--destination-organization=609216679593
```
- Ek neem aan die toestemming **`cloudasset.assets.queryIamPolicy`** kan ook toegang gee om toestemmings van principals te vind.
```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 enumerasie

> [!CAUTION]
> As jy **nie toegang tot IAM-inligting kan verkry** nie met die vorige metodes en jy is in 'n Red Team. Jy kan **die hulpmiddel**[ **https://github.com/carlospolop/bf_my_gcp_perms**](https://github.com/carlospolop/bf_my_gcp_perms) **gebruik om jou huidige toestemmings te brute-force.**
>
> Let egter daarop dat die diens **`cloudresourcemanager.googleapis.com`** geaktiveer moet wees.

### Privesc

Op die volgende bladsy kan jy kyk hoe om **IAM-toestemmings te misbruik om voorregte te verhoog**:

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

### Ongeauthentiseerde 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 Exploitatie <a href="#service-account-impersonation" id="service-account-impersonation"></a>

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

### Volharding

As jy hoë voorregte het, kan jy:

- Nuwe SA's (of gebruikers as in Workspace) skep
- Principals wat deur jouself beheer word meer toestemmings gee
- Meer voorregte aan kwesbare SA's gee (SSRF in vm, kwesbare Cloud Function…)
- …

## Organisasiebeleide

Vir 'n inleiding oor wat Organisasiebeleide is, kyk:

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

Die IAM-beleide dui die toestemmings aan wat principals oor hulpbronne het via rolle, wat granular toestemmings toegeken word. Organisasiebeleide **beperk hoe daardie dienste gebruik kan word of watter funksies gedeaktiveer is**. Dit help om die minste voorregte van elke hulpbron in die GCP-omgewing te verbeter.
```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

In die volgende bladsy kan jy kyk hoe om **org beleidstoestemmings te misbruik om voorregte te verhoog**:

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

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