# GCP - IAM, Principals & Org Policies Enum

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

## Service Accounts

Za uvod o tome šta je servisni nalog, pogledajte:

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

### Enumeration

Servisni nalog uvek pripada projektu:
```bash
gcloud iam service-accounts list --project <project>
```
## Korisnici i Grupe

Za uvod o tome kako funkcionišu Korisnici i Grupe u GCP pogledajte:

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

### Enumeracija

Sa dozvolama **`serviceusage.services.enable`** i **`serviceusage.services.use`** moguće je **omogućiti usluge** u projektu i koristiti ih.

> [!CAUTION]
> Imajte na umu da se po defaultu korisnicima Workspace dodeljuje uloga **Kreator Projekta**, što im omogućava da **kreiraju nove projekte**. Kada korisnik kreira projekat, dodeljuje mu se uloga **`owner`**. Tako da može **omogućiti ove usluge nad projektom kako bi mogao da enumeriše Workspace**.
>
> Međutim, primetite da je takođe potrebno imati **dovoljno dozvola u Workspace** da bi mogli da pozovete ove API-je.

Ako možete **omogućiti `admin` uslugu** i ako vaš korisnik ima **dovoljna prava u workspace,** mogli biste **enumerisati sve grupe i korisnike** sa sledećim linijama.\
Čak i ako se kaže **`identity groups`**, takođe vraća **korisnike bez ikakvih grupa**:
```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]
> U prethodnim primerima parametar `--labels` je obavezan, tako da se koristi generička vrednost (nije obavezan ako koristite API direktno kao što [**PurplePanda radi ovde**](https://github.com/carlospolop/PurplePanda/blob/master/intel/google/discovery/disc_groups_users.py).

Čak i sa omogućenom admin uslugom, moguće je da dobijete grešku prilikom enumeracije jer vaš kompromitovani korisnik radnog prostora nema dovoljno dozvola:

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

## IAM

Proverite [**ovo za osnovne informacije o IAM**](../gcp-basic-information/#iam-roles).

### Podrazumevane Dozvole

Iz [**dokumentacije**](https://cloud.google.com/resource-manager/docs/default-access-control): Kada se kreira resurs organizacije, svim korisnicima u vašem domenu se podrazumevano dodeljuju uloge **Kreator računa za naplatu** i **Kreator projekta**. Ove podrazumevane uloge omogućavaju vašim korisnicima da odmah počnu da koriste Google Cloud, ali nisu namenjene za redovno korišćenje resursa vaše organizacije.

Ove **uloge** dodeljuju **dozvole**:

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

Štaviše, kada korisnik kreira projekat, on je **automatski dodeljen kao vlasnik tog projekta** prema [dokumentaciji](https://cloud.google.com/resource-manager/docs/access-control-proj). Stoga, podrazumevano, korisnik će moći da kreira projekat i pokrene bilo koju uslugu na njemu (rudari? enumeracija radnog prostora? ...)

> [!CAUTION]
> Najviša privilegija u GCP organizaciji je uloga **Administrator organizacije**.

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

U većini usluga moći ćete da promenite dozvole nad resursom koristeći metodu **`add-iam-policy-binding`** ili **`set-iam-policy`**. Glavna razlika je u tome što **`add-iam-policy-binding` dodaje novo vezivanje uloge** postojećoj IAM politici dok **`set-iam-policy`** **briše prethodno** dodeljene dozvole i **postavlja samo one** koje su naznačene u komandi.

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

Postoje različiti načini da se provere sve dozvole korisnika u različitim resursima (kao što su organizacije, fascikle, projekti...) koristeći ovu uslugu.

- Dozvola **`cloudasset.assets.searchAllIamPolicies`** može zatražiti **sve iam politike** unutar resursa.
```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
```
- Dozvola **`cloudasset.assets.analyzeIamPolicy`** može zatražiti **sve iam politike** jednog subjekta unutar resursa.
```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'
```
- Dozvola **`cloudasset.assets.searchAllResources`** omogućava listanje svih resursa organizacije, fascikle ili projekta. Uključeni su resursi povezani sa IAM-om (kao što su uloge).
```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
```
- Dozvola **`cloudasset.assets.analyzeMove`** može biti korisna i za preuzimanje politika koje utiču na resurs kao što je projekat.
```bash
gcloud asset analyze-move --project=<proj-name> \
--destination-organization=609216679593
```
- Pretpostavljam da bi dozvola **`cloudasset.assets.queryIamPolicy`** takođe mogla omogućiti pristup pronalaženju dozvola principala.
```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 enumeracija

> [!CAUTION]
> Ako **ne možete pristupiti IAM informacijama** koristeći prethodne metode i nalazite se u Red Team-u. Možete **koristiti alat**[ **https://github.com/carlospolop/bf_my_gcp_perms**](https://github.com/carlospolop/bf_my_gcp_perms) **da brute-force-ujete svoje trenutne dozvole.**
>
> Međutim, imajte na umu da servis **`cloudresourcemanager.googleapis.com`** treba biti omogućen.

### Privesc

Na sledećoj stranici možete proveriti kako da **zloupotrebite IAM dozvole za eskalaciju privilegija**:

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

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

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

### Persistencija

Ako imate visoke privilegije mogli biste:

- Kreirati nove SAs (ili korisnike ako ste u Workspace)
- Dati principima koje kontrolišete više dozvola
- Dati više privilegija ranjivim SAs (SSRF u vm, ranjiva Cloud Function…)
- …

## Org Politike

Za uvod o tome šta su Org Politike proverite:

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

IAM politike ukazuju na dozvole koje principi imaju nad resursima putem uloga, koje dodeljuju granularne dozvole. Politike organizacije **ograničavaju kako se ti servisi mogu koristiti ili koje funkcije su onemogućene**. Ovo pomaže u poboljšanju minimalnih privilegija svakog resursa u GCP okruženju.
```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

Na sledećoj stranici možete proveriti kako da **zloupotrebite dozvole org politika za eskalaciju privilegija**:

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

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