From d48719174952111bc66fa7b301f51e2483700c07 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 16 Jun 2026 13:40:31 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/gcp-security/gcp-unauthenticated-e --- .../gcp-api-keys-unauthenticated-enum.md | 119 +++++++++++++++--- 1 file changed, 105 insertions(+), 14 deletions(-) diff --git a/src/pentesting-cloud/gcp-security/gcp-unauthenticated-enum-and-access/gcp-api-keys-unauthenticated-enum.md b/src/pentesting-cloud/gcp-security/gcp-unauthenticated-enum-and-access/gcp-api-keys-unauthenticated-enum.md index 1a2f3e5d5..389201c51 100644 --- a/src/pentesting-cloud/gcp-security/gcp-unauthenticated-enum-and-access/gcp-api-keys-unauthenticated-enum.md +++ b/src/pentesting-cloud/gcp-security/gcp-unauthenticated-enum-and-access/gcp-api-keys-unauthenticated-enum.md @@ -1,30 +1,30 @@ -# GCP - Enumeração Não Autenticada de Chaves de API +# GCP - API Keys Unauthenticated Enum {{#include ../../../banners/hacktricks-training.md}} -## Chaves de API +## API Keys -Para mais informações sobre Chaves de API, consulte: +Para mais informações sobre API Keys, veja: {{#ref}} ../gcp-services/gcp-api-keys-enum.md {{#endref}} -### Técnicas de OSINT +### OSINT techniques -**As Chaves de API do Google são amplamente utilizadas por qualquer tipo de aplicação** que utiliza do lado do cliente. É comum encontrá-las no código-fonte de sites ou em requisições de rede, em aplicativos móveis ou apenas procurando por regex em plataformas como o Github. +**Google API Keys are widely used by any kind of applications** that uses from the client side. É comum encontrá-las no código-fonte de websites ou em network requests, em aplicações mobile ou apenas buscando por regexes em plataformas como Github. A regex é: **`AIza[0-9A-Za-z_-]{35}`** -Pesquise, por exemplo, no Github seguindo: [https://github.com/search?q=%2FAIza%5B0-9A-Za-z\_-%5D%7B35%7D%2F\&type=code\&ref=advsearch](https://github.com/search?q=%2FAIza%5B0-9A-Za-z_-%5D%7B35%7D%2F&type=code&ref=advsearch) +Procure-a, por exemplo, no Github seguindo: [https://github.com/search?q=%2FAIza%5B0-9A-Za-z\_-%5D%7B35%7D%2F\&type=code\&ref=advsearch](https://github.com/search?q=%2FAIza%5B0-9A-Za-z_-%5D%7B35%7D%2F&type=code&ref=advsearch) -### Verificar o projeto de origem do GCP +### Check origin GCP project -Isso é extremamente útil para verificar **a qual projeto do GCP uma chave de API que você encontrou pertence**. Temos diferentes opções: +Isso é extremamente útil para verificar **a qual projeto GCP uma API key que você encontrou pertence**. Temos diferentes opções: -- Contate `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=` -Para fins de brevidade, a saída foi truncada, mas na saída completa o ID do projeto aparece mais de 5 vezes. +For the sake of brevity the output was truncated, but in the complete output the project ID appears more than 5 times ```bash curl -s "https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=AIzaSyD[...]uE8Y" @@ -34,9 +34,9 @@ curl -s "https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectCo "message": "Identity Toolkit API has not been used in project 943955951114 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/identitytoolkit.googleapis.com/overview?project=943955951114 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.", [...] ``` -- Contate `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=` +- Contacte `https://identitytoolkit.googleapis.com/v1/projects?key=` -Para fins de brevidade, a saída foi truncada, mas na saída completa o ID do projeto aparece mais de 5 vezes. +Por brevidade, a saída foi truncada, mas na saída completa o ID do projeto aparece mais de 5 vezes ```bash curl -s "https://identitytoolkit.googleapis.com/v1/projects?key=AIzaSyD[...]uE8Y" @@ -69,8 +69,99 @@ resource: projects/89123452509 service: cloudresourcemanager.googleapis.com reason: AUTH_PERMISSION_DENIED ``` -### Brute Force API endspoints +### Recon de API orientado por discovery-document -Como você pode não saber quais APIs estão habilitadas no projeto, seria interessante executar a ferramenta [https://github.com/ozguralp/gmapsapiscanner](https://github.com/ozguralp/gmapsapiscanner) e verificar **o que você pode acessar com a chave da API.** +Uma vez que você tenha uma chave válida, não teste apenas as APIs públicas óbvias. Em ambientes Google, os **discovery documents** podem funcionar como um mapa da superfície de ataque legível por máquina, expondo **resources, methods, paths, HTTP verbs, parameters e request/response schemas**. + +Alvos úteis: +```bash +# Public / common path +curl -s 'https://serviceusage.googleapis.com/$discovery/rest?key=' + +# Hidden docs behind a visibility label +curl -s 'https://serviceusage.googleapis.com/$discovery/rest?labels=GOOGLE_INTERNAL&key=' +``` +Notes: + +- Compare o tamanho do documento e a contagem de methods com e sem labels como `GOOGLE_INTERNAL`. +- Um **true nonexistent method** normalmente retorna um **HTML 404**. Um **JSON 404** com `Method not found.` pode indicar que o method existe, mas o **API key project is missing a required visibility label**. +- Algumas APIs first-party são mais fáceis de acessar via `*.clients6.google.com` ou hosts undocumented `*-pa.googleapis.com` do que via o public API explorer. + +Isso é especialmente útil para enumerate **internal/admin APIs accidentally exposed to the Internet** e para build custom fuzzers a partir do schema em vez de adivinhar campos JSON manualmente. + +### Key ownership filtering at scale + +Se você coletar muitas Google API keys de APKs, browser traffic, IPAs ou binaries, talvez queira identificar rapidamente **qual project owns each key** e se ele pertence à empresa-alvo. + +Um truque prático é chamar intencionalmente uma API que **não está enabled** para a key. O Google frequentemente leaks o **project number** de backend no erro: +```bash +curl -s 'https://protos.googleapis.com/$discovery/rest?key=' +``` +Procure por mensagens como: +```text +Protos API has not been used in project 244648151629 before or it is disabled +``` +Esse número de projeto pode então ser correlacionado com outros endpoints, metadata leakada, ou lógica interna de mapeamento da empresa para separar **in-scope first-party keys** de projetos de clientes / third-party. + +### Lide com restrições de chave antes de descartar uma chave + +Uma restricted key não é necessariamente inútil. Preserve o contexto em que a chave foi encontrada e reexecute requests com os headers correspondentes: +```bash +# Browser restricted +curl -H 'X-Goog-Api-Key: ' \ +-H 'Referer: https://target.google.com' \ +'https://servicemanagement.googleapis.com/v1/operations' + +# iOS restricted +curl -H 'X-Goog-Api-Key: ' \ +-H 'X-Ios-Bundle-Identifier: com.google.GoogleMobile' \ +'https://servicemanagement.clients6.google.com/v1/operations' + +# Android restricted +curl -H 'X-Goog-Api-Key: ' \ +-H 'X-Android-Package: com.google.android.settings.intelligence' \ +-H 'X-Android-Cert: ' \ +'https://servicemanagement.clients6.google.com/v1/operations' +``` +Classes comuns de restrição: + +- **HTTP Referer** +- **iOS bundle ID** (`X-Ios-Bundle-Identifier`) +- **Android package + signing cert** (`X-Android-Package` + `X-Android-Cert`) +- Restrições de **Server IP**, que geralmente não podem ser contornadas remotamente + +### Dicas de first-party auth / origin whitelist + +Algumas Google web APIs aceitam uma mistura de **session cookie + first-party authorization headers** e são hospedadas em `*.clients6.google.com`. Ao testar essas APIs: + +- Mantenha `Origin` e `Referer` compatíveis com o produto que normalmente usa a API. +- Um `401` com `reason: SESSION_COOKIE_INVALID` pode na verdade significar que a **origin não está na whitelist**, e não que o cookie está ruim. +- APIs acessíveis publicamente que aceitam apenas origins internas, como `*.corp.google.com`, são candidatas de alto valor para revisão de broken access control. + +### APIs com brute force habilitado e fuzz de métodos documentados + +Como você pode não saber quais APIs estão habilitadas no projeto, seria interessante rodar a ferramenta [https://github.com/ozguralp/gmapsapiscanner](https://github.com/ozguralp/gmapsapiscanner) e verificar **o que você consegue acessar com a API key.** + +Depois de identificar os serviços alcançáveis, prefira **schema-driven fuzzing** em vez de adivinhação cega: + +- Gere requests diretamente dos discovery docs +- Reproduza o mesmo request com **todas as known working keys** +- Normalize os erros para distinguir **invalid input** de falhas de **visibility-label / auth / restriction** +- Para identificadores numéricos de objetos, teste valores próximos como `ID-1`, `ID+1`, `1`, `2`, `100`, `1000` +- Só reporte quando você confirmar **cross-user data access** ou outra falha real de authorization; enumeração simples geralmente não é suficiente por si só + +### Padrão comum de vuln: unauthenticated direct-object reference + +Um padrão recorrente de bug é uma **internal/admin API** que aceita um identificador controlado pela vítima (por exemplo `gaiaId`) e valida apenas que a request carrega uma API key utilizável, mas **nunca verifica se o caller está autorizado a acessar aquele objeto específico**. +```bash +curl 'https://gfibervoice-pa.googleapis.com/v1/BssGetVoiceSettings?gaiaId=' \ +-H 'X-Goog-Api-Key: ' +``` +Se o endpoint retornar o número de telefone, endereço de e-mail, configurações ou outros campos privados de outro usuário, trate isso como um caso clássico de **IDOR / broken access control**. + +## Referências + +- [Hacking Google with AI: AI-Assisted Discovery-Document Fuzzing of Google APIs](https://brutecat.com/articles/hacking-google-with-ai) +- [Google APIs Explorer](https://developers.google.com/apis-explorer) {{#include ../../../banners/hacktricks-training.md}}