# GCP - Storage Enum

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

## Storage

Google Cloud Platform (GCP) Storage is 'n **cloud-gebaseerde stooroplossing** wat hoogs duursame en beskikbare objekberging vir ongestructureerde data bied. Dit bied **verskeie stoorklasse** gebaseer op prestasie, beskikbaarheid en koste, insluitend Standaard, Nearline, Coldline, en Argief. GCP Storage bied ook gevorderde funksies soos **leeftydbeleide, weergawebeheer, en toegangsbeheer** om data effektief te bestuur en te beveilig.

Die emmer kan in 'n streek, in 2 streke of **multi-streek (standaard)** gestoor word.

### Storage Types

- **Standard Storage**: Dit is die standaard stooropsie wat **hoë prestasie, lae latensie toegang tot gereeld toeganklike data bied**. Dit is geskik vir 'n wye reeks gebruiksgevalle, insluitend die bedien van webwerfinhoud, streaming media, en die gasheer van data-analise-pipelines.
- **Nearline Storage**: Hierdie stoor klas bied **laer stoor koste** en **effens hoër toegang koste** as Standaard Stoor. Dit is geoptimaliseer vir selde toeganklike data, met 'n minimum stoor duur van 30 dae. Dit is ideaal vir rugsteun en argivering.
- **Coldline Storage**: Hierdie stoor klas is geoptimaliseer vir **langtermyn stoor van selde toeganklike data**, met 'n minimum stoor duur van 90 dae. Dit bied die **laer stoor koste** as Nearline Storage, maar met **hoër toegang koste.**
- **Archive Storage**: Hierdie stoor klas is ontwerp vir koue data wat **baie selde** toeganklik is, met 'n minimum stoor duur van 365 dae. Dit bied die **laagste stoor koste van al die GCP stoor opsies** maar met die **hoogste toegang koste**. Dit is geskik vir langtermyn bewaring van data wat gestoor moet word vir nakoming of regulerende redes.
- **Autoclass**: As jy **nie weet hoe gereeld jy die data gaan toegang nie**, kan jy Autoclass kies en GCP sal **automaties die tipe stoor vir jou verander om koste te minimaliseer**.

### Access Control

Deur **standaard** is dit **aanbeveel** om die toegang via **IAM** te beheer, maar dit is ook moontlik om **die gebruik van ACLs in te skakel**.\
As jy kies om slegs IAM (standaard) te gebruik en **90 dae verbygaan**, sal jy **nie in staat wees om ACLs** vir die emmer in te skakel nie.

### Versioning

Dit is moontlik om weergawebeheer in te skakel, dit sal **ou weergawes van die lêer binne die emmer stoor**. Dit is moontlik om die **aantal weergawes wat jy wil hou** te konfigureer en selfs **hoe lank** jy wil hê **nie-huidige** weergawes (ou weergawes) moet leef. Aanbeveel is **7 dae vir Standaard tipe**.

Die **metadata van 'n nie-huidige weergawe word gehou**. Boonop, **ACLs van nie-huidige weergawes word ook gehou**, so ouer weergawes mag verskillende ACLs hê as die huidige weergawe.

Leer meer in die [**docs**](https://cloud.google.com/storage/docs/object-versioning).

### Retention Policy

Gee aan hoe **lank** jy wil **verbied dat die verwydering van Objekte binne die emmer** plaasvind (baie nuttig vir nakoming ten minste).\
Slegs een van **weergawebeheer of bewaring beleid kan gelyktydig geaktiveer word**.

### Encryption

Deur standaard is voorwerpe **versleuteld met Google bestuurde sleutels**, maar jy kan ook 'n **sleutel van KMS** gebruik.

### Public Access

Dit is moontlik om **eksterne gebruikers** (ingelogde GCP of nie) **toegang tot emmerinhoud** te gee.\
Deur standaard, wanneer 'n emmer geskep word, sal dit **die opsie om publiek bloot te stel** vir die emmer gedeaktiveer hê, maar met genoeg toestemmings kan dit verander word.

Die **formaat van 'n URL** om toegang tot 'n emmer te verkry is **`https://storage.googleapis.com/<bucket-name>` of `https://<bucket_name>.storage.googleapis.com`** (albei is geldig).

### HMAC Keys

'n HMAC-sleutel is 'n tipe _akkreditasie_ en kan **geassosieer word met 'n diensrekening of 'n gebruikersrekening in Cloud Storage**. Jy gebruik 'n HMAC-sleutel om _handtekeninge_ te skep wat dan in versoeke aan Cloud Storage ingesluit word. Handtekeninge wys dat 'n **gegewe versoek deur die gebruiker of diensrekening geoutoriseer is**.

HMAC-sleutels het twee primêre komponente, 'n _toegang ID_ en 'n _geheim_.

- **Access ID**: 'n alfanumeriese string wat aan 'n spesifieke diens of gebruikersrekening gekoppel is. Wanneer dit aan 'n diensrekening gekoppel is, is die string 61 karakters lank, en wanneer dit aan 'n gebruikersrekening gekoppel is, is die string 24 karakters lank. Die volgende toon 'n voorbeeld van 'n toegang ID:

`GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA`

- **Secret**: 'n 40-karakter Base-64-gecodeerde string wat aan 'n spesifieke toegang ID gekoppel is. 'n Geheim is 'n vooraf gedeelde sleutel wat slegs jy en Cloud Storage weet. Jy gebruik jou geheim om handtekeninge te skep as deel van die verifikasieproses. Die volgende toon 'n voorbeeld van 'n geheim:

`bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ`

Beide die **toegang ID en geheim identifiseer 'n HMAC-sleutel uniek**, maar die geheim is baie meer sensitiewe inligting, omdat dit gebruik word om **handtekeninge te skep**.

### 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
```
As jy 'n toestemming geweier fout kry wanneer jy emmers lys, mag jy steeds toegang hê tot die inhoud. So, nou dat jy weet van die naam konvensie van die emmers, kan jy 'n lys van moontlike name genereer en probeer om toegang daartoe te kry:
```bash
for i in $(cat wordlist.txt); do gsutil ls -r gs://"$i"; done
```
Met toestemmings `storage.objects.list` en `storage.objects.get`, behoort jy in staat te wees om al die vouers en lêers van die emmer op te som om hulle af te laai. Jy kan dit bereik met hierdie Python-skrip:
```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

In die volgende bladsy kan jy kyk hoe om **opbergingsregte te misbruik om voorregte te verhoog**:

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

### Unauthenticated Enum

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

### Post Exploitation

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

### Persistence

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

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