# GCP - IAM Privesc

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

## IAM

Pronađite više informacija o IAM-u u:

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

### `iam.roles.update` (`iam.roles.get`)

Napadač sa pomenutim dozvolama će moći da ažurira ulogu dodeljenu vama i da vam dodeli dodatne dozvole za druge resurse kao što su:
```bash
gcloud iam roles update <rol name> --project <project> --add-permissions <permission>
```
Možete pronaći skriptu za automatizaciju **kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde** i python skriptu za zloupotrebu ovog privilegija [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.roles.update.py). Za više informacija proverite [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).

### `iam.serviceAccounts.getAccessToken` (`iam.serviceAccounts.get`)

Napadač sa pomenutim dozvolama će moći da **zatraži pristupni token koji pripada Servisnom Nalog**, tako da je moguće zatražiti pristupni token Servisnog Naloga sa više privilegija nego što su naše.
```bash
gcloud --impersonate-service-account="${victim}@${PROJECT_ID}.iam.gserviceaccount.com" \
auth print-access-token
```
Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/4-iam.serviceAccounts.getAccessToken.sh) i Python skriptu za zloupotrebu ove privilegije [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getAccessToken.py). Za više informacija proverite [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).

### `iam.serviceAccountKeys.create`

Napadač sa pomenutim dozvolama će moći da **kreira ključ koji upravlja korisnikom za Service Account**, što će nam omogućiti pristup GCP-u kao taj Service Account.
```bash
gcloud iam service-accounts keys create --iam-account <name> /tmp/key.json

gcloud auth activate-service-account --key-file=sa_cred.json
```
Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/3-iam.serviceAccountKeys.create.sh) i Python skriptu za zloupotrebu ove privilegije [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccountKeys.create.py). Za više informacija pogledajte [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).

Napomena: **`iam.serviceAccountKeys.update` neće raditi za modifikaciju ključa** SA jer su za to potrebne i dozvole `iam.serviceAccountKeys.create`.

### `iam.serviceAccounts.implicitDelegation`

Ako imate **`iam.serviceAccounts.implicitDelegation`** dozvolu na Servisnom Računu koji ima **`iam.serviceAccounts.getAccessToken`** dozvolu na trećem Servisnom Računu, tada možete koristiti implicitDelegation da **kreirate token za taj treći Servisni Račun**. Evo dijagrama koji pomaže u objašnjenju.

![](https://rhinosecuritylabs.com/wp-content/uploads/2020/04/image2-500x493.png)

Napomena: prema [**dokumentaciji**](https://cloud.google.com/iam/docs/understanding-service-accounts), delegacija `gcloud` funkcioniše samo za generisanje tokena koristeći [**generateAccessToken()**](https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/generateAccessToken) metodu. Tako da ovde imate kako da dobijete token koristeći API direktno:
```bash
curl -X POST \
'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/'"${TARGET_SERVICE_ACCOUNT}"':generateAccessToken' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer '"$(gcloud auth print-access-token)" \
-d '{
"delegates": ["projects/-/serviceAccounts/'"${DELEGATED_SERVICE_ACCOUNT}"'"],
"scope": ["https://www.googleapis.com/auth/cloud-platform"]
}'
```
Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/5-iam.serviceAccounts.implicitDelegation.sh) i python skriptu za zloupotrebu ove privilegije [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.implicitDelegation.py). Za više informacija pogledajte [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).

### `iam.serviceAccounts.signBlob`

Napadač sa pomenutim dozvolama će moći da **potpiše proizvoljne payload-ove u GCP**. Tako će biti moguće **napraviti nepodpisani JWT SA i zatim ga poslati kao blob da bi dobili JWT potpisan** od SA koji cilјamo. Za više informacija [**pročitajte ovo**](https://medium.com/google-cloud/using-serviceaccountactor-iam-role-for-account-impersonation-on-google-cloud-platform-a9e7118480ed).

Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/6-iam.serviceAccounts.signBlob.sh) i python skriptu za zloupotrebu ove privilegije [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-accessToken.py) i [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-gcsSignedUrl.py). Za više informacija pogledajte [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).

### `iam.serviceAccounts.signJwt`

Napadač sa pomenutim dozvolama će moći da **potpiše dobro oblikovane JSON web tokene (JWT-ove)**. Razlika u odnosu na prethodnu metodu je u tome što **umesto da nateramo Google da potpiše blob koji sadrži JWT, koristimo metodu signJWT koja već očekuje JWT**. Ovo olakšava korišćenje, ali možete potpisivati samo JWT umesto bilo kojih bajtova.

Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/7-iam.serviceAccounts.signJWT.sh) i python skriptu za zloupotrebu ove privilegije [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signJWT.py). Za više informacija pogledajte [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).

### `iam.serviceAccounts.setIamPolicy` <a href="#iam.serviceaccounts.setiampolicy" id="iam.serviceaccounts.setiampolicy"></a>

Napadač sa pomenutim dozvolama će moći da **doda IAM politike servisnim nalozima**. Možete to zloupotrebiti da **dodelite sebi** dozvole koje su vam potrebne da biste se pretvarali da ste servisni nalog. U sledećem primeru dodeljujemo sebi ulogu `roles/iam.serviceAccountTokenCreator` nad interesantnim SA:
```bash
gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
--member="user:username@domain.com" \
--role="roles/iam.serviceAccountTokenCreator"

# If you still have prblem grant yourself also this permission
gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \ \
--member="user:username@domain.com" \
--role="roles/iam.serviceAccountUser"
```
Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/d-iam.serviceAccounts.setIamPolicy.sh)**.**

### `iam.serviceAccounts.actAs`

**iam.serviceAccounts.actAs dozvola** je poput **iam:PassRole dozvole iz AWS-a**. Ključna je za izvršavanje zadataka, kao što je pokretanje Compute Engine instance, jer omogućava "delovanje kao" servisni nalog, osiguravajući bezbedno upravljanje dozvolama. Bez ovoga, korisnici bi mogli dobiti neprimeren pristup. Pored toga, eksploatacija **iam.serviceAccounts.actAs** uključuje različite metode, od kojih svaka zahteva skup dozvola, za razliku od drugih metoda koje trebaju samo jednu.

#### Impersonacija servisnog naloga <a href="#service-account-impersonation" id="service-account-impersonation"></a>

Impersonacija servisnog naloga može biti veoma korisna za **dobijanje novih i boljih privilegija**. Postoje tri načina na koja možete [impersonirati drugi servisni nalog](https://cloud.google.com/iam/docs/understanding-service-accounts#impersonating_a_service_account):

- Autentifikacija **koristeći RSA privatne ključeve** (pokazano iznad)
- Autorizacija **koristeći Cloud IAM politike** (pokazano ovde)
- **Implementacija poslova na GCP uslugama** (više primenljivo na kompromitaciju korisničkog naloga)

### `iam.serviceAccounts.getOpenIdToken`

Napadač sa pomenutim dozvolama će moći da generiše OpenID JWT. Ovi se koriste za potvrdu identiteta i ne nose nužno nikakvu implicitnu autorizaciju prema resursu.

Prema ovom [**zanimljivom postu**](https://medium.com/google-cloud/authenticating-using-google-openid-connect-tokens-e7675051213b), potrebno je naznačiti publiku (uslugu za koju želite da koristite token za autentifikaciju) i dobićete JWT potpisan od strane google-a koji ukazuje na servisni nalog i publiku JWT-a.

Možete generisati OpenIDToken (ako imate pristup) sa:
```bash
# First activate the SA with iam.serviceAccounts.getOpenIdToken over the other SA
gcloud auth activate-service-account --key-file=/path/to/svc_account.json
# Then, generate token
gcloud auth print-identity-token "${ATTACK_SA}@${PROJECT_ID}.iam.gserviceaccount.com" --audiences=https://example.com
```
Zatim to možete jednostavno koristiti za pristup usluzi sa:
```bash
curl -v -H "Authorization: Bearer id_token" https://some-cloud-run-uc.a.run.app
```
Neke usluge koje podržavaju autentifikaciju putem ovakvih tokena su:

- [Google Cloud Run](https://cloud.google.com/run/)
- [Google Cloud Functions](https://cloud.google.com/functions/docs/)
- [Google Identity Aware Proxy](https://cloud.google.com/iap/docs/authentication-howto)
- [Google Cloud Endpoints](https://cloud.google.com/endpoints/docs/openapi/authenticating-users-google-id) (ako koristite Google OIDC)

Možete pronaći primer kako da kreirate OpenID token u ime servisnog naloga [**ovde**](https://github.com/carlospolop-forks/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getOpenIdToken.py).

## Reference

- [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/)

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