Translated ['src/pentesting-cloud/gcp-security/gcp-to-workspace-pivoting

This commit is contained in:
Translator
2025-05-17 05:01:16 +00:00
parent d1464fa7d7
commit 7e6b7a9532
2 changed files with 146 additions and 120 deletions

View File

@@ -6,7 +6,7 @@
### **Osnovi delegacije na nivou domena**
Delegacija na nivou domena Google Workspace-a omogućava identitetskom objektu, bilo **spoljnoj aplikaciji** iz Google Workspace Marketplace-a ili unutrašnjem **GCP servisnom nalogu**, da **pristupi podacima širom Workspace-a u ime korisnika**.
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).
@@ -23,7 +23,7 @@ Ako napadač **kompromituje neki pristup preko GCP-a** i **zna validnu email adr
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 znanje **jednog validnog je dovoljno i neophodno za imitaciju**.\
> 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)
@@ -36,22 +36,26 @@ python3 gen_delegation_token.py --user-email <user-email> --key-file <path-to-ke
# 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 kroz svaki projekat resursa, i **enumerate GCP Service account resources** kojima inicijalni IAM korisnik ima pristup koristeći _GetIAMPolicy_.
3. Iterirati kroz **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.
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 kroz **svaki novi servisni nalog 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 kroz 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.
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 kojeg treba imitirati. Evo kako biste ga koristili:
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
@@ -82,23 +86,23 @@ Napadač sa sposobnošću da **kreira servisne naloge u GCP projektu** i **super
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** koji definišu koje API pozive delegacija zahteva.
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 kog identiteta koji postoji u Google Workspace**. Kao što smo naučili, servisni nalog će generisati pristupne tokene prema svojim potrebama i u skladu sa dozvolama koje ima za REST API aplikacije.
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 koja bi sprečila cross-global delegaciju. 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.
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 **defaultu** korisnici Workspace-a imaju dozvolu da **kreiraju nove projekte**, a kada se novi projekat kreira, **kreator dobija ulogu Vlasnika** nad njim.
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 **enumeriše** to.
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 enumeriše Workspace, takođe mu je potrebna dovoljna Workspace dozvola (neće svaki korisnik moći da enumeriše direktorijum).
> 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
@@ -140,7 +144,7 @@ Ako napadač kompromituje računar korisnika, mogao bi takođe da izmeni datotek
<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 ukazati da generisani token ima pristup drive-u, ali pošto će se korisnik sam prijaviti koristeći **`gcloud auth login`**, verovatno **neće posumnjati u ništa.**
> 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"`**