Translated ['', 'src/pentesting-cloud/gcp-security/gcp-unauthenticated-e

This commit is contained in:
Translator
2026-06-16 13:40:31 +00:00
parent b92ad50bae
commit d487191749
@@ -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=<api-key`
- Contact `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=<api-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=<api-key>`
- Contacte `https://identitytoolkit.googleapis.com/v1/projects?key=<api-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=<api-key>'
# Hidden docs behind a visibility label
curl -s 'https://serviceusage.googleapis.com/$discovery/rest?labels=GOOGLE_INTERNAL&key=<api-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=<api-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: <api-key>' \
-H 'Referer: https://target.google.com' \
'https://servicemanagement.googleapis.com/v1/operations'
# iOS restricted
curl -H 'X-Goog-Api-Key: <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: <api-key>' \
-H 'X-Android-Package: com.google.android.settings.intelligence' \
-H 'X-Android-Cert: <sha1-signing-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=<victim_gaia_id>' \
-H 'X-Goog-Api-Key: <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}}