mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 14:47:17 -07:00
Translated ['', 'src/pentesting-cloud/gcp-security/gcp-unauthenticated-e
This commit is contained in:
+105
-14
@@ -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}}
|
||||
|
||||
Reference in New Issue
Block a user