GCP - Storage Enum

Support HackTricks

Storage

Google Cloud Platform (GCP) Storage è una soluzione di archiviazione basata su cloud che fornisce un'archiviazione di oggetti altamente durevole e disponibile per dati non strutturati. Offre diverse classi di archiviazione basate su prestazioni, disponibilità e costi, tra cui Standard, Nearline, Coldline e Archive. GCP Storage fornisce anche funzionalità avanzate come politiche di ciclo di vita, versioning e controllo degli accessi per gestire e proteggere i dati in modo efficace.

Il bucket può essere memorizzato in una regione, in 2 regioni o multi-regione (predefinito).

Storage Types

  • Standard Storage: Questa è l'opzione di archiviazione predefinita che offre accesso ad alta prestazione e bassa latenza ai dati frequentemente accessibili. È adatta per una vasta gamma di casi d'uso, tra cui la fornitura di contenuti web, lo streaming di media e l'hosting di pipeline di analisi dei dati.

  • Nearline Storage: Questa classe di archiviazione offre costi di archiviazione inferiori e costi di accesso leggermente superiori rispetto a Standard Storage. È ottimizzata per dati accessibili raramente, con una durata minima di archiviazione di 30 giorni. È ideale per scopi di backup e archiviazione.

  • Coldline Storage: Questa classe di archiviazione è ottimizzata per l'archiviazione a lungo termine di dati accessibili raramente, con una durata minima di archiviazione di 90 giorni. Offre costi di archiviazione inferiori rispetto a Nearline Storage, ma con costi di accesso più elevati.

  • Archive Storage: Questa classe di archiviazione è progettata per dati freddi che vengono accessibili molto raramente, con una durata minima di archiviazione di 365 giorni. Offre i costi di archiviazione più bassi di tutte le opzioni di archiviazione GCP, ma con i costi di accesso più elevati. È adatta per la conservazione a lungo termine di dati che devono essere archiviati per motivi di conformità o regolamentari.

  • Autoclass: Se non sai quanto accederai ai dati, puoi selezionare Autoclass e GCP cambierà automaticamente il tipo di archiviazione per te per ridurre i costi.

Access Control

Per default è raccomandato controllare l'accesso tramite IAM, ma è anche possibile abilitare l'uso di ACL. Se scegli di utilizzare solo IAM (predefinito) e passano 90 giorni, non potrai abilitare le ACL per il bucket.

Versioning

È possibile abilitare il versioning, questo salverà le vecchie versioni del file all'interno del bucket. È possibile configurare il numero di versioni che si desidera mantenere e anche per quanto tempo si desidera che le versioni non correnti (versioni vecchie) vivano. Si raccomanda 7 giorni per il tipo Standard.

I metadati di una versione non corrente vengono mantenuti. Inoltre, le ACL delle versioni non correnti vengono anch'esse mantenute, quindi le versioni più vecchie potrebbero avere ACL diverse rispetto alla versione attuale.

Learn more in the docs.

Retention Policy

Indica per quanto tempo desideri vietare la cancellazione degli oggetti all'interno del bucket (molto utile per la conformità almeno). Solo una delle politiche di versioning o retention può essere abilitata contemporaneamente.

Encryption

Per impostazione predefinita, gli oggetti sono crittografati utilizzando chiavi gestite da Google, ma puoi anche utilizzare una chiave di KMS.

Public Access

È possibile dare accesso agli utenti esterni (registrati in GCP o meno) ai contenuti dei bucket. Per impostazione predefinita, quando viene creato un bucket, avrà disabilitata l'opzione di esposizione pubblica del bucket, ma con permessi sufficienti può essere modificata.

Il formato di un URL per accedere a un bucket è https://storage.googleapis.com/<bucket-name> o https://<bucket_name>.storage.googleapis.com (entrambi sono validi).

HMAC Keys

Una chiave HMAC è un tipo di credential e può essere associata a un account di servizio o a un account utente in Cloud Storage. Utilizzi una chiave HMAC per creare signature che vengono poi incluse nelle richieste a Cloud Storage. Le firme mostrano che una data richiesta è autorizzata dall'utente o dall'account di servizio.

Le chiavi HMAC hanno due componenti principali, un access ID e un secret.

  • Access ID: Una stringa alfanumerica collegata a un account di servizio o utente specifico. Quando è collegata a un account di servizio, la stringa è lunga 61 caratteri, e quando è collegata a un account utente, la stringa è lunga 24 caratteri. Di seguito è mostrato un esempio di un access ID:

GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA

  • Secret: Una stringa codificata in Base-64 di 40 caratteri che è collegata a un access ID specifico. Un secret è una chiave precondivisa che solo tu e Cloud Storage conoscete. Utilizzi il tuo secret per creare firme come parte del processo di autenticazione. Di seguito è mostrato un esempio di un secret:

bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ

Sia l'access ID che il secret identificano univocamente una chiave HMAC, ma il secret è un'informazione molto più sensibile, perché viene utilizzato per creare firme.

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

Se ricevi un errore di permesso negato durante l'elenco dei bucket, potresti comunque avere accesso al contenuto. Quindi, ora che conosci la convenzione dei nomi dei bucket, puoi generare un elenco di nomi possibili e provare ad accedervi:

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

Con i permessi storage.objects.list e storage.objects.get, dovresti essere in grado di enumerare tutte le cartelle e i file dal bucket per poterli scaricare. Puoi ottenere ciò con questo script 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>')

Privilege Escalation

Nella pagina seguente puoi controllare come abuse storage permissions to escalate privileges:

GCP - Storage Privesc

Unauthenticated Enum

GCP - Storage Unauthenticated Enum

Post Exploitation

GCP - Storage Post Exploitation

Persistence

GCP - Storage Persistence
Support HackTricks

Last updated