# GCP <--> Workspace Pivoting

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

## **Od GCP do GWS**

### **Osnovi delegacije na nivou domena**

Delegacija na nivou domena Google Workspace-a omogućava identitetskom objektu, bilo **spoljašnjoj aplikaciji** iz Google Workspace Marketplace-a ili unutrašnjem **GCP servisnom nalogu**, da **pristupi podacima širom Workspace-a u ime korisnika**.

> [!NOTE]
> To u suštini znači da **servisni nalozi** unutar GCP projekata organizacije mogu biti u mogućnosti da **imituju korisnike Workspace-a** iste organizacije (ili čak iz druge).

Za više informacija o tome kako ovo tačno funkcioniše, pogledajte:

{{#ref}}
gcp-understanding-domain-wide-delegation.md
{{#endref}}

### Kompromitovanje postojeće delegacije

Ako napadač **kompromituje neki pristup preko GCP-a** i **zna validnu email adresu korisnika Workspace-a** (poželjno **super admin**), mogao bi da **enumeriše sve projekte** kojima ima pristup, **enumeriše sve SA** projekata, proveri kojima **servisnim nalozima ima pristup**, i **ponovi** sve ove korake sa svakim SA koji može da imituje.\
Sa **listom svih servisnih naloga** kojima ima **pristup** i listom **Workspace** **emailova**, napadač bi mogao da pokuša da **imitira korisnika sa svakim servisnim nalogom**.

> [!CAUTION]
> Imajte na umu da prilikom konfiguracije delegacije na nivou domena nije potreban nijedan korisnik Workspace-a, stoga samo znajte da **jedan validan korisnik je dovoljan i potreban za imitaciju**.\
> Međutim, **privilegije imitiranog korisnika će biti korišćene**, tako da ako je to Super Admin, moći ćete da pristupite svemu. Ako nema nikakav pristup, ovo će biti beskorisno.

#### [GCP Generiši Delegacioni Token](https://github.com/carlospolop/gcp_gen_delegation_token)

Ovaj jednostavni skript će **generisati OAuth token kao delegirani korisnik** koji možete koristiti za pristup drugim Google API-ima sa ili bez `gcloud`:
```bash
# 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**](https://github.com/n0tspam/delepwn)

Zasnovan na sledećem DeleFriend alatu, ali sa nekim dodacima kao što su mogućnost enumeracije domena, diska, gmaila, kalendara i izvođenja drugih operacija.

#### [**DeleFriend**](https://github.com/axon-git/DeleFriend)

Ovo je alat koji može izvršiti napad prateći ove korake:

1. **Enumerate GCP Projects** koristeći Resource Manager API.
2. Iterirati na svaki projekat resursa, i **enumerate GCP Service account resources** na koje inicijalni IAM korisnik ima pristup koristeći _GetIAMPolicy_.
3. Iterirati na **svaku ulogu servisnog naloga**, i pronaći ugrađene, osnovne i prilagođene uloge sa _**serviceAccountKeys.create**_ dozvolom na ciljanom resursu servisnog naloga. Treba napomenuti da Editor uloga inherentno poseduje ovu dozvolu.
4. Kreirati **novi `KEY_ALG_RSA_2048`** privatni ključ za svaki resurs servisnog naloga koji je pronađen sa relevantnom dozvolom u IAM politici.
5. Iterirati na **svakom novom servisnom nalogu i kreirati `JWT`** **objekat** za njega koji se sastoji od SA privatnih ključnih kredencijala i OAuth opsega. Proces kreiranja novog _JWT_ objekta će **iterirati na sve postojeće kombinacije OAuth opsega** iz **oauth_scopes.txt** liste, kako bi pronašao sve mogućnosti delegacije. Lista **oauth_scopes.txt** se ažurira sa svim OAuth opsezima za koje smo utvrdili da su relevantni za zloupotrebu identiteta Workspace-a.
6. Metod `_make_authorization_grant_assertion` otkriva potrebu da se deklarira t**arget workspace user**, nazvan _subject_, za generisanje JWT-ova pod DWD. Iako se može činiti da zahteva specifičnog korisnika, važno je shvatiti da **DWD utiče na svaki identitet unutar domena**. Shodno tome, kreiranje JWT-a za **bilo kog korisnika domena** utiče na sve identitete u tom domenu, u skladu sa našim proverama kombinacija. Jednostavno rečeno, jedan validan Workspace korisnik je dovoljan za nastavak.\
Ovaj korisnik može biti definisan u DeleFriend-ovom _config.yaml_ fajlu. Ako ciljani korisnik Workspace-a nije već poznat, alat olakšava automatsku identifikaciju validnih korisnika Workspace-a skeniranjem korisnika domena sa ulogama na GCP projektima. Ključno je napomenuti (ponovo) da su JWT-ovi specifični za domen i ne generišu se za svakog korisnika; stoga, automatski proces cilja jedinstveni identitet po domenu.
7. **Enumerate and create a new bearer access token** za svaki JWT i validirati token protiv tokeninfo API.

#### [Gitlab's Python script](https://gitlab.com/gitlab-com/gl-security/threatmanagement/redteam/redteam-public/gcp_misc/-/blob/master/gcp_delegation.py)

Gitlab je kreirao [ovaj Python skript](https://gitlab.com/gitlab-com/gl-security/gl-redteam/gcp_misc/blob/master/gcp_delegation.py) koji može uraditi dve stvari - listati korisnički direktorijum i kreirati novi administratorski nalog dok ukazuje na json sa SA kredencijalima i korisnikom koga treba imitirati. Evo kako biste ga koristili:
```bash
# 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
```
### Kreirajte novu delegaciju (Persistencija)

Moguće je **proveriti delegacije na nivou domena u** [**https://admin.google.com/u/1/ac/owl/domainwidedelegation**](https://admin.google.com/u/1/ac/owl/domainwidedelegation)**.**

Napadač sa sposobnošću da **kreira servisne naloge u GCP projektu** i **super admin privilegijom za GWS može kreirati novu delegaciju koja omogućava SA da se predstavljaju kao neki GWS korisnici:**

1. **Generisanje novog servisnog naloga i odgovarajućeg para ključeva:** Na GCP-u, novi resursi servisnog naloga mogu se proizvoditi ili interaktivno putem konzole ili programatski koristeći direktne API pozive i CLI alate. Ovo zahteva **ulogu `iam.serviceAccountAdmin`** ili bilo koju prilagođenu ulogu opremljenu sa **`iam.serviceAccounts.create`** **dozvolom**. Kada se servisni nalog kreira, nastavićemo sa generisanjem **odgovarajućeg para ključeva** (**`iam.serviceAccountKeys.create`** dozvola).
2. **Kreiranje nove delegacije**: Važno je razumeti da **samo Super Admin uloga ima sposobnost da postavi globalnu delegaciju na nivou domena u Google Workspace** i delegacija na nivou domena **ne može biti postavljena programatski,** može se samo kreirati i prilagoditi **ručno** putem Google Workspace **konzole**.
- Kreiranje pravila može se naći na stranici **API controls → Manage Domain-Wide delegation in Google Workspace Admin console**.
3. **Priključivanje privilegije OAuth opsega**: Kada se konfiguriše nova delegacija, Google zahteva samo 2 parametra, Client ID, koji je **OAuth ID resursa GCP Servisnog naloga**, i **OAuth opsege** koje definišu koje API pozive delegacija zahteva.
- **Puna lista OAuth opsega** može se naći [**ovde**](https://developers.google.com/identity/protocols/oauth2/scopes), ali evo preporuke: `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`
4. **Delovanje u ime ciljne identiteta:** U ovom trenutku, imamo funkcionalni delegirani objekat u GWS. Sada, **koristeći privatni ključ GCP Servisnog naloga, možemo izvršiti API pozive** (u opsegu definisanom u parametru OAuth opsega) da ga aktiviramo i **delujemo u ime bilo kojeg identiteta koji postoji u Google Workspace**. Kao što smo saznali, servisni nalog će generisati pristupne tokene prema svojim potrebama i u skladu sa dozvolama koje ima za REST API aplikacije.
- Proverite **prethodni odeljak** za neke **alate** za korišćenje ove delegacije.

#### Cross-Organizational delegacija

OAuth SA ID je globalan i može se koristiti za **cross-organizational delegaciju**. Nije implementirana nijedna restrikcija da se spreči cross-global delegacija. U jednostavnim terminima, **servisni nalozi iz različitih GCP organizacija mogu se koristiti za konfiguraciju delegacije na nivou domena u drugim Workspace organizacijama**. To bi značilo da je **potrebna samo Super Admin pristup Workspace-u**, a ne pristup istom GCP nalogu, jer protivnik može kreirati Servisne Naloge i privatne ključeve na svom lično kontrolisanom GCP nalogu.

### Kreiranje projekta za enumeraciju Workspace-a

Po **default-u** korisnici Workspace-a imaju dozvolu da **kreiraju nove projekte**, a kada se novi projekat kreira, **kreator dobija ulogu Vlasnika** nad njim.

Stoga, korisnik može **kreirati projekat**, **omogućiti** **API-je** za enumeraciju Workspace-a u svom novom projektu i pokušati da **enumerira** to.

> [!CAUTION]
> Da bi korisnik mogao da enumerira Workspace, takođe mu je potrebna dovoljna Workspace dozvola (neće svaki korisnik moći da enumerira direktorijum).
```bash
# 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>
```
Proverite **više enumeracije u**:

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

### Zloupotreba Gcloud kredencijala

Možete pronaći dodatne informacije o `gcloud` toku za prijavu u:

{{#ref}}
../gcp-persistence/gcp-non-svc-persistence.md
{{#endref}}

Kao što je objašnjeno tamo, gcloud može zatražiti opseg **`https://www.googleapis.com/auth/drive`** koji bi omogućio korisniku pristup disku korisnika.\
Kao napadač, ako ste fizički kompromitovali računar korisnika i **korisnik je još uvek prijavljen** sa svojim nalogom, mogli biste se prijaviti generišući token sa pristupom disku koristeći:
```bash
gcloud auth login --enable-gdrive-access
```
Ako napadač kompromituje računar korisnika, mogao bi takođe da izmeni datoteku `google-cloud-sdk/lib/googlecloudsdk/core/config.py` i doda u **`CLOUDSDK_SCOPES`** opseg **`'https://www.googleapis.com/auth/drive'`**:

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

> [!WARNING]
> Stoga, sledeći put kada se korisnik prijavi, kreiraće **token sa pristupom drive-u** koji bi napadač mogao da zloupotrebi za pristup drive-u. Očigledno, pretraživač će pokazati da generisani token ima pristup drive-u, ali pošto će se korisnik sam pozvati na **`gcloud auth login`**, verovatno **neće posumnjati u ništa.**
>
> Da biste nabrojali datoteke na drive-u: **`curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://www.googleapis.com/drive/v3/files"`**

## Od GWS do GCP

### Pristup privilegovanim GCP korisnicima

Ako napadač ima potpun pristup GWS-u, moći će da pristupi grupama sa privilegovanim pristupom GCP-u ili čak korisnicima, stoga prelazak sa GWS-a na GCP je obično "jednostavniji" samo zato što **korisnici u GWS-u imaju visoke privilegije nad GCP-om**.

### Eskalacija privilegija Google Grupa

Podrazumevano, korisnici mogu **slobodno da se pridružuju Workspace grupama Organizacije** i te grupe **mogu imati dodeljene GCP dozvole** (proverite svoje grupe na [https://groups.google.com/](https://groups.google.com/)).

Zloupotrebom **google groups privesc** mogli biste biti u mogućnosti da se eskalirate u grupu sa nekim oblikom privilegovanog pristupa GCP-u.

### Reference

- [https://www.hunters.security/en/blog/delefriend-a-newly-discovered-design-flaw-in-domain-wide-delegation-could-leave-google-workspace-vulnerable-for-takeover](https://www.hunters.security/en/blog/delefriend-a-newly-discovered-design-flaw-in-domain-wide-delegation-could-leave-google-workspace-vulnerable-for-takeover)

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