GCP - Storage Enum

Support HackTricks

Storage

Google Cloud Platform (GCP) Storage to rozwiązanie do przechowywania w chmurze, które zapewnia wysoce trwałe i dostępne przechowywanie obiektów dla danych niestrukturalnych. Oferuje różne klasy przechowywania w zależności od wydajności, dostępności i kosztów, w tym Standard, Nearline, Coldline i Archive. GCP Storage zapewnia również zaawansowane funkcje, takie jak polityki cyklu życia, wersjonowanie i kontrola dostępu, aby skutecznie zarządzać i zabezpieczać dane.

Bucket może być przechowywany w regionie, w 2 regionach lub w wielu regionach (domyślnie).

Storage Types

  • Standard Storage: To domyślna opcja przechowywania, która oferuje wysoką wydajność i niską latencję dostępu do często używanych danych. Nadaje się do szerokiego zakresu zastosowań, w tym do serwowania treści internetowych, strumieniowania mediów i hostowania potoków analityki danych.

  • Nearline Storage: Ta klasa przechowywania oferuje niższe koszty przechowywania i nieco wyższe koszty dostępu niż Standard Storage. Jest zoptymalizowana do rzadko używanych danych, z minimalnym czasem przechowywania wynoszącym 30 dni. Idealna do celów kopii zapasowych i archiwizacji.

  • Coldline Storage: Ta klasa przechowywania jest zoptymalizowana do długoterminowego przechowywania rzadko używanych danych, z minimalnym czasem przechowywania wynoszącym 90 dni. Oferuje niższe koszty przechowywania niż Nearline Storage, ale z wyższymi kosztami dostępu.

  • Archive Storage: Ta klasa przechowywania jest zaprojektowana dla zimnych danych, które są dostępne bardzo rzadko, z minimalnym czasem przechowywania wynoszącym 365 dni. Oferuje najniższe koszty przechowywania ze wszystkich opcji GCP, ale z najwyższymi kosztami dostępu. Nadaje się do długoterminowego przechowywania danych, które muszą być przechowywane z powodów zgodności lub regulacyjnych.

  • Autoclass: Jeśli nie wiesz, jak często będziesz uzyskiwać dostęp do danych, możesz wybrać Autoclass, a GCP automatycznie zmieni typ przechowywania, aby zminimalizować koszty.

Access Control

Domyślnie zaleca się kontrolowanie dostępu za pomocą IAM, ale możliwe jest również włączenie użycia ACL. Jeśli wybierzesz tylko użycie IAM (domyślnie) i minie 90 dni, nie będziesz mógł włączyć ACL dla bucketu.

Versioning

Możliwe jest włączenie wersjonowania, co zapisze stare wersje pliku w bucket. Można skonfigurować liczbę wersji, które chcesz zachować i nawet jak długo chcesz, aby wersje nieaktualne (stare wersje) były przechowywane. Zaleca się 7 dni dla typu Standard.

Metadane wersji nieaktualnej są przechowywane. Ponadto ACL wersji nieaktualnych są również przechowywane, więc starsze wersje mogą mieć różne ACL od wersji aktualnej.

Dowiedz się więcej w dokumentacji.

Retention Policy

Wskaź, jak długo chcesz zabronić usuwania obiektów w bucket (bardzo przydatne przynajmniej dla zgodności). Tylko jedna z wersjonowania lub polityki przechowywania może być włączona w tym samym czasie.

Encryption

Domyślnie obiekty są szyfrowane za pomocą kluczy zarządzanych przez Google, ale możesz również użyć klucza z KMS.

Public Access

Możliwe jest nadanie zewnętrznym użytkownikom (zalogowanym w GCP lub nie) dostępu do zawartości bucketu. Domyślnie, gdy bucket jest tworzony, będzie miał wyłączoną opcję publicznego udostępniania bucketu, ale przy wystarczających uprawnieniach można to zmienić.

Format URL do uzyskania dostępu do bucketu to https://storage.googleapis.com/<bucket-name> lub https://<bucket_name>.storage.googleapis.com (oba są ważne).

HMAC Keys

Klucz HMAC to rodzaj poświadczenia i może być powiązany z kontem usługi lub kontem użytkownika w Cloud Storage. Używasz klucza HMAC do tworzenia podpisów, które są następnie dołączane do żądań do Cloud Storage. Podpisy pokazują, że dane żądanie jest autoryzowane przez użytkownika lub konto usługi.

Klucze HMAC mają dwa główne elementy, identyfikator dostępu i sekret.

  • Access ID: Alfanumeryczny ciąg powiązany z określoną usługą lub kontem użytkownika. Gdy jest powiązany z kontem usługi, ciąg ma długość 61 znaków, a gdy jest powiązany z kontem użytkownika, ciąg ma długość 24 znaków. Poniżej znajduje się przykład identyfikatora dostępu:

GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA

  • Secret: 40-znakowy ciąg zakodowany w Base-64, który jest powiązany z określonym identyfikatorem dostępu. Sekret to klucz wstępnie udostępniony, który znają tylko Ty i Cloud Storage. Używasz swojego sekretu do tworzenia podpisów jako część procesu uwierzytelniania. Poniżej znajduje się przykład sekretu:

bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ

Zarówno identyfikator dostępu, jak i sekret unikalnie identyfikują klucz HMAC, ale sekret jest znacznie bardziej wrażliwą informacją, ponieważ jest używany do tworzenia podpisów.

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

Jeśli otrzymasz błąd odmowy dostępu podczas wyświetlania koszyków, możesz nadal mieć dostęp do ich zawartości. Teraz, gdy znasz konwencję nazewnictwa koszyków, możesz wygenerować listę możliwych nazw i spróbować uzyskać do nich dostęp:

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

Z uprawnieniami storage.objects.list i storage.objects.get powinieneś być w stanie wylistować wszystkie foldery i pliki z koszyka, aby je pobrać. Możesz to osiągnąć za pomocą tego skryptu Pythona:

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>')

Eskalacja Uprawnień

Na następnej stronie możesz sprawdzić, jak nadużywać uprawnień do przechowywania, aby eskalować uprawnienia:

GCP - Storage Privesc

Enum Nienaudowany

GCP - Storage Unauthenticated Enum

Po Eksploatacji

GCP - Storage Post Exploitation

Utrzymywanie

GCP - Storage Persistence
Wsparcie dla HackTricks

Last updated