GCP - Storage Enum

Support HackTricks

Storage

Google Cloud Platform (GCP) Storage є хмарним рішенням для зберігання, яке забезпечує високу надійність та доступність об'єктного зберігання для неструктурованих даних. Він пропонує різні класи зберігання на основі продуктивності, доступності та вартості, включаючи Standard, Nearline, Coldline та Archive. GCP Storage також надає розширені функції, такі як політики життєвого циклу, версійність та контроль доступу для ефективного управління та захисту даних.

Бакет може зберігатися в регіоні, в 2 регіонах або мульти-регіонально (за замовчуванням).

Storage Types

  • Standard Storage: Це стандартний варіант зберігання, який пропонує високу продуктивність, низьку затримку доступу до часто використовуваних даних. Він підходить для широкого спектру випадків використання, включаючи обслуговування вмісту веб-сайтів, потокове медіа та хостинг аналітичних даних.

  • Nearline Storage: Цей клас зберігання пропонує нижчі витрати на зберігання та трохи вищі витрати на доступ, ніж Standard Storage. Він оптимізований для рідко використовуваних даних, з мінімальним терміном зберігання 30 днів. Ідеально підходить для резервного копіювання та архівування.

  • Coldline Storage: Цей клас зберігання оптимізований для довгострокового зберігання рідко використовуваних даних, з мінімальним терміном зберігання 90 днів. Він пропонує нижчі витрати на зберігання, ніж Nearline Storage, але з вищими витратами на доступ.

  • Archive Storage: Цей клас зберігання призначений для холодних даних, які доступні дуже рідко, з мінімальним терміном зберігання 365 днів. Він пропонує найнижчі витрати на зберігання серед усіх варіантів зберігання GCP, але з найвищими витратами на доступ. Підходить для довгострокового зберігання даних, які потрібно зберігати з метою дотримання вимог або регуляцій.

  • Autoclass: Якщо ви не знаєте, як часто будете отримувати доступ до даних, ви можете вибрати Autoclass, і GCP автоматично змінить тип зберігання, щоб мінімізувати витрати.

Access Control

За замовчуванням рекомендується контролювати доступ через IAM, але також можливо включити використання ACL. Якщо ви виберете використовувати лише IAM (за замовчуванням) і пройде 90 днів, ви не зможете включити ACL для бакету.

Versioning

Можна включити версійність, це зберігатиме старі версії файлу всередині бакету. Можна налаштувати кількість версій, які ви хочете зберігати, і навіть як довго ви хочете, щоб некоректні версії (старі версії) існували. Рекомендується 7 днів для стандартного типу.

Метадані некоректної версії зберігаються. Більше того, ACL некоректних версій також зберігаються, тому старі версії можуть мати різні ACL від поточної версії.

Дізнайтеся більше в документації.

Retention Policy

Вкажіть, як довго ви хочете заборонити видалення об'єктів всередині бакету (дуже корисно для дотримання вимог, принаймні). Лише одна з версійності або політики зберігання може бути включена одночасно.

Encryption

За замовчуванням об'єкти шифруються за допомогою ключів, керованих Google, але ви також можете використовувати ключ з KMS.

Public Access

Можливо надати зовнішнім користувачам (входять в GCP чи ні) доступ до вмісту бакетів. За замовчуванням, коли бакет створюється, у нього буде вимкнена опція публічного доступу до бакету, але з достатніми правами це можна змінити.

Формат URL для доступу до бакету є https://storage.googleapis.com/<bucket-name> або https://<bucket_name>.storage.googleapis.com (обидва є дійсними).

HMAC Keys

HMAC ключ є типом облікових даних і може бути асоційований з обліковим записом служби або обліковим записом користувача в Cloud Storage. Ви використовуєте HMAC ключ для створення підписів, які потім включаються в запити до Cloud Storage. Підписи показують, що даний запит авторизований користувачем або обліковим записом служби.

HMAC ключі мають дві основні частини: ідентифікатор доступу та секрет.

  • Access ID: Алфавітно-цифровий рядок, пов'язаний з конкретною службою або обліковим записом користувача. Коли він пов'язаний з обліковим записом служби, рядок має довжину 61 символ, а коли пов'язаний з обліковим записом користувача, рядок має довжину 24 символи. Наступне показує приклад ідентифікатора доступу:

GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA

  • Secret: 40-символьний рядок, закодований у Base-64, який пов'язаний з конкретним ідентифікатором доступу. Секрет є попередньо поділеним ключем, який знаєте лише ви та Cloud Storage. Ви використовуєте свій секрет для створення підписів як частини процесу аутентифікації. Наступне показує приклад секрету:

bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ

Як і ідентифікатор доступу, так і секрет унікально ідентифікують HMAC ключ, але секрет є набагато більш чутливою інформацією, оскільки він використовується для створення підписів.

Enumeration

# List all storage buckets in project
gsutil ls

# Get each bucket configuration (protections, CLs, times, configs...)
gsutil ls -L

# List contents of a specific bucket
gsutil ls gs://bucket-name/
gsutil ls -r gs://bucket-name/ # Recursive
gsutil ls -a gs://bucket-name/ # Get ALL versions of objects

# Cat the context of a file without copying it locally
gsutil cat 'gs://bucket-name/folder/object'
gsutil cat 'gs://bucket-name/folder/object#<num>' # cat specific version

# Copy an object from the bucket to your local storage for review
gsutil cp gs://bucket-name/folder/object ~/

# List using a raw OAuth token
## Useful because "CLOUDSDK_AUTH_ACCESS_TOKEN" and "gcloud config set auth/access_token_file" doesn't work with gsutil
curl -H "Authorization: Bearer $TOKEN" "https://storage.googleapis.com/storage/v1/b/<storage-name>/o"
# Download file content from bucket
curl -H "Authorization: Bearer $TOKEN" "https://storage.googleapis.com/storage/v1/b/supportstorage-58249/o/flag.txt?alt=media" --output -

# Enumerate HMAC keys
gsutil hmac list

# Get permissions
gcloud storage buckets get-iam-policy gs://bucket-name/
gcloud storage objects get-iam-policy gs://bucket-name/folder/object

Якщо ви отримали помилку відмови в доступі при переліку бакетів, ви все ще можете мати доступ до вмісту. Отже, тепер, коли ви знаєте про конвенцію імен бакетів, ви можете згенерувати список можливих імен і спробувати отримати до них доступ:

for i in $(cat wordlist.txt); do gsutil ls -r gs://"$i"; done

З правами storage.objects.list та storage.objects.get ви повинні мати можливість перерахувати всі папки та файли з бакету, щоб завантажити їх. Ви можете досягти цього за допомогою цього скрипта на Python:

import requests
import xml.etree.ElementTree as ET

def list_bucket_objects(bucket_name, prefix='', marker=None):
url = f"https://storage.googleapis.com/{bucket_name}?prefix={prefix}"
if marker:
url += f"&marker={marker}"
response = requests.get(url)
xml_data = response.content
root = ET.fromstring(xml_data)
ns = {'ns': 'http://doc.s3.amazonaws.com/2006-03-01'}
for contents in root.findall('.//ns:Contents', namespaces=ns):
key = contents.find('ns:Key', namespaces=ns).text
print(key)
next_marker = root.find('ns:NextMarker', namespaces=ns)
if next_marker is not None:
next_marker_value = next_marker.text
list_bucket_objects(bucket_name, prefix, next_marker_value)

list_bucket_objects('<storage-name>')

Підвищення Привілеїв

На наступній сторінці ви можете перевірити, як зловживати дозволами на зберігання для підвищення привілеїв:

GCP - Storage Privesc

Неавтентифіковане Перерахування

GCP - Storage Unauthenticated Enum

Після Експлуатації

GCP - Storage Post Exploitation

Постійність

GCP - Storage Persistence
Підтримати HackTricks

Last updated