diff --git a/src/pentesting-cloud/gcp-security/gcp-unauthenticated-enum-and-access/gcp-api-keys-unauthenticated-enum.md b/src/pentesting-cloud/gcp-security/gcp-unauthenticated-enum-and-access/gcp-api-keys-unauthenticated-enum.md index da9a26411..123f8520a 100644 --- a/src/pentesting-cloud/gcp-security/gcp-unauthenticated-enum-and-access/gcp-api-keys-unauthenticated-enum.md +++ b/src/pentesting-cloud/gcp-security/gcp-unauthenticated-enum-and-access/gcp-api-keys-unauthenticated-enum.md @@ -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=` +- Звернутися до `https://www.googleapis.com/identitytoolkit/v3/relyingparty/getProjectConfig?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=` +- Contact `https://identitytoolkit.googleapis.com/v1/projects?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=' + +# Hidden docs behind a visibility label +curl -s 'https://serviceusage.googleapis.com/$discovery/rest?labels=GOOGLE_INTERNAL&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=' +``` +Шукай повідомлення на кшталт: +```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: ' \ +-H 'Referer: https://target.google.com' \ +'https://servicemanagement.googleapis.com/v1/operations' + +# iOS restricted +curl -H 'X-Goog-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: ' \ +-H 'X-Android-Package: com.google.android.settings.intelligence' \ +-H 'X-Android-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=' \ +-H 'X-Goog-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}}