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
@@ -4,27 +4,27 @@
|
||||
|
||||
## API Keys
|
||||
|
||||
Для отримання додаткової інформації про API Keys перегляньте:
|
||||
Для отримання додаткової інформації про API Keys перевірте:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-api-keys-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### OSINT техніки
|
||||
### OSINT techniques
|
||||
|
||||
**Google API Keys широко використовуються будь-якими додатками**, які використовуються з боку клієнта. Зазвичай їх можна знайти в вихідному коді вебсайтів або мережевих запитах, в мобільних додатках або просто шукаючи регулярні вирази на платформах, таких як Github.
|
||||
**Google API Keys широко використовуються будь-якими типами applications** that uses from the client side. Зазвичай їх можна знайти в source code сайтів або network requests, у mobile applications або просто шукаючи regexes на платформах на кшталт Github.
|
||||
|
||||
Регулярний вираз: **`AIza[0-9A-Za-z_-]{35}`**
|
||||
Regex такий: **`AIza[0-9A-Za-z_-]{35}`**
|
||||
|
||||
Шукайте його, наприклад, на Github за посиланням: [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)
|
||||
Шукайте його, наприклад, у Github за посиланням: [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)
|
||||
|
||||
### Перевірка походження GCP проекту
|
||||
### Check origin GCP project
|
||||
|
||||
Це надзвичайно корисно для перевірки, **до якого GCP проекту належить API ключ, який ви знайшли**. У нас є різні варіанти:
|
||||
Це дуже корисно, щоб перевірити, **до якого GCP project належить API key, який ви знайшли**. Є кілька варіантів:
|
||||
|
||||
- Зв'язатися з `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=<api-key>`
|
||||
- Звернутися до `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=<api-key>`
|
||||
|
||||
Для стислості вихідні дані були скорочені, але в повному виході ID проекту з'являється більше 5 разів.
|
||||
Для стислості output було обрізано, але в повному output project ID з’являється більше ніж 5 разів
|
||||
```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.",
|
||||
[...]
|
||||
```
|
||||
- Зв'яжіться з `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?key=<api-key>`
|
||||
- Contact `https://identitytoolkit.googleapis.com/v1/projects?key=<api-key>`
|
||||
|
||||
Для стислості вихідні дані були скорочені, але в повному виході ідентифікатор проекту з'являється більше 5 разів.
|
||||
Для стислості вивід було обрізано, але в повному виводі project ID з’являється більше ніж 5 разів
|
||||
```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.",
|
||||
[...]
|
||||
```
|
||||
- [Цей більше не працює!] `apikeys.keys.lookup`
|
||||
- [Це більше не працює!] `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
|
||||
### Recon API, керований discovery-document
|
||||
|
||||
Оскільки ви, можливо, не знаєте, які API увімкнені в проекті, було б цікаво запустити інструмент [https://github.com/ozguralp/gmapsapiscanner](https://github.com/ozguralp/gmapsapiscanner) і перевірити **що ви можете отримати з API ключем.**
|
||||
Після того як у вас є valid key, не обмежуйтеся лише перевіркою очевидних public APIs. У Google environments **discovery documents** можуть працювати як machine-readable attack-surface map, що розкриває **resources, methods, paths, HTTP verbs, parameters, and request/response schemas**.
|
||||
|
||||
Корисні 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>'
|
||||
```
|
||||
Примітки:
|
||||
|
||||
- Порівняйте розмір документа та кількість method з і без labels, таких як `GOOGLE_INTERNAL`.
|
||||
- Справжній nonexistent method зазвичай повертає **HTML 404**. **JSON 404** з `Method not found.` може вказувати, що method існує, але **API key project** не має необхідного visibility label.
|
||||
- Деякі first-party APIs легше досягти через `*.clients6.google.com` або undocumented `*-pa.googleapis.com` hosts, ніж через public API explorer.
|
||||
|
||||
Це особливо корисно для enum **internal/admin APIs accidentally exposed to the Internet** і для побудови custom fuzzers зі schema замість ручного вгадування JSON fields.
|
||||
|
||||
### Key ownership filtering at scale
|
||||
|
||||
Якщо ви збираєте багато Google API keys з APKs, browser traffic, IPAs або binaries, ви можете захотіти швидко визначити **який project володіє кожним key** і чи належить він цільовій компанії.
|
||||
|
||||
Практичний трюк — навмисно викликати API, який **не увімкнено** для key. Google часто leak'ить backing **project number** у помилці:
|
||||
```bash
|
||||
curl -s 'https://protos.googleapis.com/$discovery/rest?key=<api-key>'
|
||||
```
|
||||
Шукай повідомлення на кшталт:
|
||||
```text
|
||||
Protos API has not been used in project 244648151629 before or it is disabled
|
||||
```
|
||||
Той номер проєкту потім можна зіставити з іншими endpoints, leaked metadata або внутрішньою логікою company-mapping, щоб відокремити **in-scope first-party keys** від customer / third-party проєктів.
|
||||
|
||||
### Обробляйте key restrictions перед тим, як відкидати key
|
||||
|
||||
Restricted key не обов’язково є марним. Зберігайте контекст, де key було знайдено, і повторюйте requests із відповідними 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'
|
||||
```
|
||||
Поширені класи обмежень:
|
||||
|
||||
- **HTTP Referer**
|
||||
- **iOS bundle ID** (`X-Ios-Bundle-Identifier`)
|
||||
- **Android package + signing cert** (`X-Android-Package` + `X-Android-Cert`)
|
||||
- **Server IP** обмеження, які зазвичай неможливо обійти віддалено
|
||||
|
||||
### Підказки щодо first-party auth / origin whitelist
|
||||
|
||||
Деякі Google web APIs приймають змішання **session cookie + first-party authorization headers** і розміщені на `*.clients6.google.com`. Під час тестування цих APIs:
|
||||
|
||||
- Залишайте `Origin` і `Referer` сумісними з продуктом, який зазвичай використовує API.
|
||||
- `401` з `reason: SESSION_COOKIE_INVALID` насправді може означати, що **origin не в whitelist**, а не те, що cookie неправильний.
|
||||
- Публічно доступні APIs, які приймають лише internal origins на кшталт `*.corp.google.com`, є цінними кандидатами для review broken access control.
|
||||
|
||||
### Brute force enabled APIs and fuzz documented methods
|
||||
|
||||
Оскільки ви можете не знати, які APIs увімкнені в проєкті, було б цікаво запустити інструмент [https://github.com/ozguralp/gmapsapiscanner](https://github.com/ozguralp/gmapsapiscanner) і перевірити, **до чого ви можете отримати доступ за допомогою API key.**
|
||||
|
||||
Після того як ви визначите доступні сервіси, надавайте перевагу **schema-driven fuzzing** замість blind guessing:
|
||||
|
||||
- Генеруйте запити безпосередньо з discovery docs
|
||||
- Повторно надсилайте той самий запит з **усіма відомими working keys**
|
||||
- Нормалізуйте errors, щоб ви могли відрізнити **invalid input** від **visibility-label / auth / restriction** failures
|
||||
- Для числових object identifiers пробуйте сусідні значення, наприклад `ID-1`, `ID+1`, `1`, `2`, `100`, `1000`
|
||||
- Повідомляйте лише тоді, коли ви підтвердите **cross-user data access** або інший реальний authorization failure; простого enumeration зазвичай недостатньо саме по собі
|
||||
|
||||
### Common vuln pattern: unauthenticated direct-object reference
|
||||
|
||||
Поширений патерн бага — це **internal/admin API**, який приймає identifier, контрольований victim, (наприклад `gaiaId`) і лише перевіряє, що запит містить придатний API key, але **ніколи не перевіряє, чи має caller authorization для доступу до саме цього object**.
|
||||
```bash
|
||||
curl 'https://gfibervoice-pa.googleapis.com/v1/BssGetVoiceSettings?gaiaId=<victim_gaia_id>' \
|
||||
-H 'X-Goog-Api-Key: <api-key>'
|
||||
```
|
||||
Якщо endpoint повертає номер телефону, email-адресу, settings або інші private fields іншого користувача, treat it as a classic **IDOR / broken access control** issue.
|
||||
|
||||
## 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