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 Ključevi Neautentifikovana Enumeracija
|
||||
# GCP - API Keys Unauthenticated Enum
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## API Ključevi
|
||||
## API Keys
|
||||
|
||||
Za više informacija o API ključevima pogledajte:
|
||||
Za više informacija o API Keys proveri:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-api-keys-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### OSINT tehnike
|
||||
### OSINT techniques
|
||||
|
||||
**Google API ključevi se široko koriste od strane svih vrsta aplikacija** koje koriste sa klijentske strane. Uobičajeno je pronaći ih u izvor kodu veb sajtova ili mrežnim zahtevima, u mobilnim aplikacijama ili jednostavno pretražujući regex-e na platformama poput Github-a.
|
||||
**Google API Keys se široko koriste u svim vrstama aplikacija** koje ih koriste sa client side-a. Uobičajeno je pronaći ih u source code-u sajtova ili network requests, u mobile aplikacijama ili jednostavno pretragom regex-a na platformama kao što je Github.
|
||||
|
||||
Regex je: **`AIza[0-9A-Za-z_-]{35}`**
|
||||
|
||||
Pretražujte ga, na primer, na Github-u sledećim putem: [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)
|
||||
Pretraži ga, na primer, na Github-u preko: [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)
|
||||
|
||||
### Proverite poreklo GCP projekta
|
||||
### Check origin GCP project
|
||||
|
||||
Ovo je izuzetno korisno za proveru **kojim GCP projektu pripada API ključ koji ste pronašli**. Imamo različite opcije:
|
||||
Ovo je izuzetno korisno za proveru **kom GCP projektu pripada API key koji si pronašao**. Imamo različite opcije:
|
||||
|
||||
- Kontaktirajte `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=<api-key`
|
||||
- Contact `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=<api-key>`
|
||||
|
||||
Zbog sažetosti, izlaz je skraćen, ali u kompletnom izlazu ID projekta se pojavljuje više od 5 puta.
|
||||
Radi sažetosti, output je skraćen, ali u kompletnom output-u project ID se pojavljuje više od 5 puta
|
||||
```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.",
|
||||
[...]
|
||||
```
|
||||
- Kontaktirajte `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=<api-key>`
|
||||
- Kontaktiraj `https://identitytoolkit.googleapis.com/v1/projects?key=<api-key>`
|
||||
|
||||
Zbog sažetosti, izlaz je skraćen, ali se u kompletnom izlazu ID projekta pojavljuje više od 5 puta.
|
||||
Radi kratkoće, izlaz je bio skraćen, ali u kompletnom izlazu project ID se pojavljuje više od 5 puta
|
||||
```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.",
|
||||
[...]
|
||||
```
|
||||
- [Ovo više ne funkcioniše!] `apikeys.keys.lookup`
|
||||
- [Ovo više ne radi!] `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 endspoints
|
||||
### Discovery-document driven API recon
|
||||
|
||||
Kao što možda ne znate koje API-je su omogućeni u projektu, bilo bi zanimljivo pokrenuti alat [https://github.com/ozguralp/gmapsapiscanner](https://github.com/ozguralp/gmapsapiscanner) i proveriti **šta možete da pristupite sa API ključem.**
|
||||
Kada imate validan ključ, nemojte testirati samo očigledne javne API-je. U Google okruženjima, **discovery documents** mogu da rade kao mašinski čitljiva mapa attack-surface-a, otkrivajući **resources, methods, paths, HTTP verbs, parameters, i request/response schemas**.
|
||||
|
||||
Korisni targets:
|
||||
```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>'
|
||||
```
|
||||
Napomene:
|
||||
|
||||
- Uporedite veličinu dokumenta i broj metoda sa i bez labela kao što je `GOOGLE_INTERNAL`.
|
||||
- **Prava nepostojeća metoda** obično vraća **HTML 404**. **JSON 404** sa `Method not found.` može da znači da metoda postoji, ali da **projektu API ključa nedostaje obavezna visibility labela**.
|
||||
- Neke first-party API-je je lakše dostići preko `*.clients6.google.com` ili undocumented `*-pa.googleapis.com` hostova nego preko javnog API explorer-a.
|
||||
|
||||
Ovo je posebno korisno za enumeraciju **internal/admin API-ja koji su slučajno izloženi Internetu** i za pravljenje custom fuzzers-a iz schema-e umesto da se JSON polja pogađaju ručno.
|
||||
|
||||
### Key ownership filtering at scale
|
||||
|
||||
Ako prikupite mnogo Google API ključeva iz APK-ova, browser traffic-a, IPA-ova ili binary-ja, možda ćete želeti da brzo identifikujete **koji project poseduje svaki ključ** i da li pripada target company.
|
||||
|
||||
Praktičan trik je da namerno pozovete API koji **nije omogućen** za taj ključ. Google često otkriva osnovni **project number** u grešci:
|
||||
```bash
|
||||
curl -s 'https://protos.googleapis.com/$discovery/rest?key=<api-key>'
|
||||
```
|
||||
Traži poruke poput:
|
||||
```text
|
||||
Protos API has not been used in project 244648151629 before or it is disabled
|
||||
```
|
||||
Taj project number se zatim može povezati sa drugim endpointima, leaked metadata ili internom logikom mapiranja kompanije da bi se odvojili **in-scope first-party keys** od customer / third-party projekata.
|
||||
|
||||
### Obradi key restrictions pre nego što odbaciš key
|
||||
|
||||
Restricted key nije nužno beskoristan. Sačuvaj kontekst u kojem je key pronađen i ponovi requestove sa odgovarajućim 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'
|
||||
```
|
||||
Uobičajene klase restrikcija:
|
||||
|
||||
- **HTTP Referer**
|
||||
- **iOS bundle ID** (`X-Ios-Bundle-Identifier`)
|
||||
- **Android package + signing cert** (`X-Android-Package` + `X-Android-Cert`)
|
||||
- **Server IP** restrikcije, koje se generalno ne mogu zaobići udaljeno
|
||||
|
||||
### First-party auth / origin whitelist hints
|
||||
|
||||
Neki Google web APIs prihvataju mešavinu **session cookie + first-party authorization headers** i hostovani su na `*.clients6.google.com`. Kada testirate ove APIs:
|
||||
|
||||
- Držite `Origin` i `Referer` kompatibilnim sa proizvodom koji normalno koristi API.
|
||||
- `401` sa `reason: SESSION_COOKIE_INVALID` zapravo može značiti da **origin nije whitelisted**, a ne da je cookie loš.
|
||||
- Javno dostupni APIs koji prihvataju samo interne origines kao što je `*.corp.google.com` su kandidati velike vrednosti za review broken access control.
|
||||
|
||||
### Brute force enabled APIs and fuzz documented methods
|
||||
|
||||
Pošto možda ne znate koji su APIs enabled u projektu, bilo bi zanimljivo pokrenuti alat [https://github.com/ozguralp/gmapsapiscanner](https://github.com/ozguralp/gmapsapiscanner) i proveriti **čemu možete pristupiti sa API key.**
|
||||
|
||||
Nakon što identifikujete reachable servise, prednost dajte **schema-driven fuzzing** umesto blind guessing:
|
||||
|
||||
- Generišite requests direktno iz discovery docs
|
||||
- Ponovo pošaljite isti request sa **svim poznatim ispravnim keys**
|
||||
- Normalizujte errors kako biste mogli da razlikujete **invalid input** od **visibility-label / auth / restriction** failures
|
||||
- Za numeričke object identifiers, probajte susedne vrednosti kao što su `ID-1`, `ID+1`, `1`, `2`, `100`, `1000`
|
||||
- Prijavljujte samo kada potvrdite **cross-user data access** ili neku drugu stvarnu authorization failure; obično je samo enumeration samo po sebi nedovoljno
|
||||
|
||||
### Common vuln pattern: unauthenticated direct-object reference
|
||||
|
||||
Čest bug pattern je **internal/admin API** koji prihvata identifier pod kontrolom žrtve (na primer `gaiaId`) i samo proverava da request nosi upotrebljiv API key, ali **nikada ne proverava da li je caller autorizovan da pristupi baš tom objektu**.
|
||||
```bash
|
||||
curl 'https://gfibervoice-pa.googleapis.com/v1/BssGetVoiceSettings?gaiaId=<victim_gaia_id>' \
|
||||
-H 'X-Goog-Api-Key: <api-key>'
|
||||
```
|
||||
Ako endpoint vraća tuđi broj telefona, email adresu, podešavanja ili druga privatna polja, tretiraj to kao klasičan **IDOR / broken access control** problem.
|
||||
|
||||
## Reference
|
||||
|
||||
- [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