mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/gcp-security/gcp-unauthenticated-e
This commit is contained in:
+106
-15
@@ -1,30 +1,30 @@
|
||||
# GCP - API-Schlüssel Unauthentifizierte Enumeration
|
||||
# GCP - API Keys Unauthenticated Enum
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## API-Schlüssel
|
||||
## API Keys
|
||||
|
||||
Für weitere Informationen zu API-Schlüsseln siehe:
|
||||
Für weitere Informationen über API Keys siehe:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-api-keys-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### OSINT-Techniken
|
||||
### OSINT techniques
|
||||
|
||||
**Google API-Schlüssel werden von allen Arten von Anwendungen verwendet**, die von der Client-Seite aus arbeiten. Es ist üblich, sie im Quellcode von Websites oder in Netzwerk-Anfragen, in mobilen Anwendungen oder einfach durch das Suchen nach Regex in Plattformen wie Github zu finden.
|
||||
**Google API Keys werden von jeder Art von Anwendungen, die clientseitig arbeiten, weit verbreitet genutzt.** Es ist üblich, sie im Quellcode von Websites oder in Netzwerk-Requests, in mobilen Anwendungen oder einfach durch Regexes auf Plattformen wie Github zu finden.
|
||||
|
||||
Der Regex ist: **`AIza[0-9A-Za-z_-]{35}`**
|
||||
|
||||
Suche ihn zum Beispiel in Github unter: [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)
|
||||
Suche ihn zum Beispiel auf Github unter: [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)
|
||||
|
||||
### Überprüfen des Ursprungsprojekts in GCP
|
||||
### Check origin GCP project
|
||||
|
||||
Dies ist äußerst nützlich, um zu überprüfen, **zu welchem GCP-Projekt ein gefundener API-Schlüssel gehört**. Wir haben verschiedene Optionen:
|
||||
Dies ist extrem nützlich, um zu prüfen, **zu welchem GCP project ein gefundenes API key gehört**. Wir haben verschiedene Optionen:
|
||||
|
||||
- Kontaktieren Sie `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=<api-key>`
|
||||
- Rufe `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=<api-key>` auf
|
||||
|
||||
Der Vollständigkeit halber wurde die Ausgabe gekürzt, aber in der vollständigen Ausgabe erscheint die Projekt-ID mehr als 5 Mal.
|
||||
Der Kürze halber wurde die Ausgabe gekürzt, aber in der vollständigen Ausgabe erscheint die project ID mehr als 5 Mal
|
||||
```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.",
|
||||
[...]
|
||||
```
|
||||
- Kontaktieren Sie `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=<api-key>`
|
||||
- Kontaktiere `https://identitytoolkit.googleapis.com/v1/projects?key=<api-key>`
|
||||
|
||||
Der Vollständigkeit halber wurde die Ausgabe gekürzt, aber in der vollständigen Ausgabe erscheint die Projekt-ID mehr als 5 Mal.
|
||||
Der Kürze halber wurde die Ausgabe abgeschnitten, aber in der vollständigen Ausgabe erscheint die Projekt-ID mehr als 5 Mal
|
||||
```bash
|
||||
curl -s "https://identitytoolkit.googleapis.com/v1/projects?key=AIzaSyD[...]uE8Y"
|
||||
|
||||
@@ -46,7 +46,7 @@ curl -s "https://identitytoolkit.googleapis.com/v1/projects?key=AIzaSyD[...]uE8Y
|
||||
"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.",
|
||||
[...]
|
||||
```
|
||||
- [Dieser funktioniert nicht mehr!] `apikeys.keys.lookup`
|
||||
- [Diese funktioniert nicht mehr!] `apikeys.keys.lookup`
|
||||
```bash
|
||||
# If you have permissions
|
||||
gcloud services api-keys lookup AIzaSyD[...]uE8Y
|
||||
@@ -69,8 +69,99 @@ resource: projects/89123452509
|
||||
service: cloudresourcemanager.googleapis.com
|
||||
reason: AUTH_PERMISSION_DENIED
|
||||
```
|
||||
### Brute Force API-Endpunkte
|
||||
### Discovery-document-gesteuerte API-Aufklärung
|
||||
|
||||
Da Sie möglicherweise nicht wissen, welche APIs im Projekt aktiviert sind, wäre es interessant, das Tool [https://github.com/ozguralp/gmapsapiscanner](https://github.com/ozguralp/gmapsapiscanner) auszuführen und zu überprüfen, **auf was Sie mit dem API-Schlüssel zugreifen können.**
|
||||
Sobald du einen gültigen Key hast, teste nicht nur die offensichtlichen öffentlichen APIs. In Google-Umgebungen können **discovery documents** als maschinenlesbare Angriffsflächenkarte dienen und **Ressourcen, Methoden, Pfade, HTTP-Verben, Parameter sowie request/response-Schemata** offenlegen.
|
||||
|
||||
Nützliche Ziele:
|
||||
```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:
|
||||
|
||||
- Vergleiche die Dokumentgröße und die Methodenzahl mit und ohne Labels wie `GOOGLE_INTERNAL`.
|
||||
- Eine **echte nicht existierende Methode** gibt normalerweise einen **HTML 404** zurück. Ein **JSON 404** mit `Method not found.` kann darauf hinweisen, dass die Methode existiert, aber dem **API-Schlüssel-Projekt ein erforderliches Visibility-Label fehlt**.
|
||||
- Einige First-Party-APIs lassen sich über `*.clients6.google.com` oder undokumentierte `*-pa.googleapis.com` Hosts leichter erreichen als über den öffentlichen API Explorer.
|
||||
|
||||
Dies ist besonders nützlich, um **interne/admin APIs, die versehentlich dem Internet ausgesetzt sind**, zu enumerieren und benutzerdefinierte Fuzzer aus dem Schema zu bauen, statt JSON-Felder manuell zu erraten.
|
||||
|
||||
### Key ownership filtering at scale
|
||||
|
||||
Wenn du viele Google API Keys aus APKs, Browser-Traffic, IPAs oder Binaries sammelst, möchtest du vielleicht schnell identifizieren, **welchem Projekt jeder Key gehört** und ob er zur Ziel-Firma gehört.
|
||||
|
||||
Ein praktischer Trick ist, absichtlich eine API aufzurufen, die für den Key **nicht aktiviert** ist. Google leakt häufig die zugrunde liegende **Projektnummer** in der Fehlermeldung:
|
||||
```bash
|
||||
curl -s 'https://protos.googleapis.com/$discovery/rest?key=<api-key>'
|
||||
```
|
||||
Suche nach Nachrichten wie:
|
||||
```text
|
||||
Protos API has not been used in project 244648151629 before or it is disabled
|
||||
```
|
||||
Diese Projekt-Nummer kann dann mit anderen Endpoints, leaked metadata oder interner Company-Mapping-Logik korreliert werden, um **in-scope first-party keys** von Kunden- / Drittanbieter-Projekten zu trennen.
|
||||
|
||||
### Handle key restrictions before discarding a key
|
||||
|
||||
Ein eingeschränkter key ist nicht zwangsläufig nutzlos. Bewahre den Kontext, in dem der key gefunden wurde, und replay requests mit den passenden headers:
|
||||
```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'
|
||||
```
|
||||
Gemeinsame Restriktionsklassen:
|
||||
|
||||
- **HTTP Referer**
|
||||
- **iOS bundle ID** (`X-Ios-Bundle-Identifier`)
|
||||
- **Android package + signing cert** (`X-Android-Package` + `X-Android-Cert`)
|
||||
- **Server IP**-Restriktionen, die sich generell nicht remote umgehen lassen
|
||||
|
||||
### First-party auth / origin whitelist hints
|
||||
|
||||
Einige Google web APIs akzeptieren eine Mischung aus **Session-Cookie + first-party authorization headers** und werden auf `*.clients6.google.com` gehostet. Beim Testen dieser APIs:
|
||||
|
||||
- Halte `Origin` und `Referer` kompatibel mit dem Produkt, das die API normalerweise nutzt.
|
||||
- Ein `401` mit `reason: SESSION_COOKIE_INVALID` kann tatsächlich bedeuten, dass der **Origin nicht auf der Whitelist steht**, nicht dass das Cookie schlecht ist.
|
||||
- Öffentlich erreichbare APIs, die nur interne Origins wie `*.corp.google.com` akzeptieren, sind hochprioritäre Kandidaten für Broken Access Control Review.
|
||||
|
||||
### Brute force enabled APIs and fuzz documented methods
|
||||
|
||||
Wie du möglicherweise nicht weißt, welche APIs im Projekt aktiviert sind, wäre es interessant, das Tool [https://github.com/ozguralp/gmapsapiscanner](https://github.com/ozguralp/gmapsapiscanner) auszuführen und zu prüfen, **worauf du mit dem API key zugreifen kannst.**
|
||||
|
||||
Nachdem du erreichbare Services identifiziert hast, bevorzuge **schema-driven fuzzing** statt blindem Raten:
|
||||
|
||||
- Erzeuge Requests direkt aus Discovery-Dokumenten
|
||||
- Spiele denselben Request mit **allen bekannten funktionierenden keys** erneut ab
|
||||
- Normalisiere Fehler, damit du **ungültige Eingaben** von **visibility-label / auth / restriction**-Fehlern unterscheiden kannst
|
||||
- Bei numerischen Objekt-IDs teste nahe Werte wie `ID-1`, `ID+1`, `1`, `2`, `100`, `1000`
|
||||
- Melde nur, wenn du **Cross-User Data Access** oder einen anderen echten Authorization-Fehler bestätigst; reine Enumeration reicht dafür in der Regel nicht aus
|
||||
|
||||
### Common vuln pattern: unauthenticated direct-object reference
|
||||
|
||||
Ein wiederkehrendes Bugmuster ist eine **internal/admin API**, die einen vom Opfer kontrollierten Identifier akzeptiert (zum Beispiel `gaiaId`) und nur prüft, dass die Anfrage einen nutzbaren API key enthält, aber **nie überprüft, ob der Caller berechtigt ist, auf genau dieses Objekt zuzugreifen**.
|
||||
```bash
|
||||
curl 'https://gfibervoice-pa.googleapis.com/v1/BssGetVoiceSettings?gaiaId=<victim_gaia_id>' \
|
||||
-H 'X-Goog-Api-Key: <api-key>'
|
||||
```
|
||||
Wenn der Endpoint die Telefonnummer, E-Mail-Adresse, Einstellungen oder andere private Felder eines anderen Benutzers zurückgibt, behandle das als klassisches **IDOR / broken access control**-Problem.
|
||||
|
||||
## References
|
||||
|
||||
- [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