# GCP - Storage Enum

{{#include ../../../banners/hacktricks-training.md}}

## Storage

Google Cloud Platform (GCP) Storage è una **soluzione di archiviazione basata sul 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-region (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 per siti web, streaming di media e 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 desideri mantenere** e anche **per quanto tempo** desideri 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.

Scopri di più nella [**docs**](https://cloud.google.com/storage/docs/object-versioning).

### Retention Policy

Indica per **quanto tempo** desideri **vietare la cancellazione degli oggetti all'interno del bucket** (molto utile per la conformità almeno).\
Solo una tra **versioning o retention policy 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
```bash
# 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 di denominazione dei bucket, puoi generare un elenco di nomi possibili e provare ad accedervi:
```bash
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:
```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>')
```
### Escalation dei privilegi

Nella pagina seguente puoi controllare come **abusare dei permessi di archiviazione per escalare i privilegi**:

{{#ref}}
../gcp-privilege-escalation/gcp-storage-privesc.md
{{#endref}}

### Enum non autenticato

{{#ref}}
../gcp-unauthenticated-enum-and-access/gcp-storage-unauthenticated-enum/
{{#endref}}

### Post Exploitation

{{#ref}}
../gcp-post-exploitation/gcp-storage-post-exploitation.md
{{#endref}}

### Persistenza

{{#ref}}
../gcp-persistence/gcp-storage-persistence.md
{{#endref}}

{{#include ../../../banners/hacktricks-training.md}}
