# GCP - Storage Enum

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

## Storage

Google Cloud Platform (GCP) Storage je **rešenje za skladištenje u oblaku** koje pruža visoko izdržljivo i dostupno skladištenje objekata za nestrukturirane podatke. Nudi **različite klase skladištenja** zasnovane na performansama, dostupnosti i troškovima, uključujući Standard, Nearline, Coldline i Archive. GCP Storage takođe pruža napredne funkcije kao što su **politike životnog ciklusa, verzionisanje i kontrola pristupa** za efikasno upravljanje i zaštitu podataka.

Kanta može biti smeštena u regionu, u 2 regiona ili **multi-region (podrazumevano)**.

### Storage Types

- **Standard Storage**: Ovo je podrazumevana opcija skladištenja koja **nudi visok učinak, nisku latenciju pristupa često korišćenim podacima**. Pogodna je za širok spektar slučajeva upotrebe, uključujući pružanje sadržaja veb stranica, strimovanje medija i hostovanje analitičkih tokova podataka.
- **Nearline Storage**: Ova klasa skladištenja nudi **niže troškove skladištenja** i **malo više troškove pristupa** od Standard Storage. Optimizovana je za retko pristupane podatke, sa minimalnim vremenom skladištenja od 30 dana. Idealna je za backup i arhiviranje.
- **Coldline Storage**: Ova klasa skladištenja je optimizovana za **dugoročno skladištenje retko pristupanih podataka**, sa minimalnim vremenom skladištenja od 90 dana. Nudi **niže troškove skladištenja** od Nearline Storage, ali sa **višim troškovima pristupa.**
- **Archive Storage**: Ova klasa skladištenja je dizajnirana za hladne podatke koji se pristupaju **veoma retko**, sa minimalnim vremenom skladištenja od 365 dana. Nudi **najniže troškove skladištenja od svih GCP opcija skladištenja** ali sa **najvišim troškovima pristupa**. Pogodna je za dugoročno čuvanje podataka koji moraju biti skladišteni iz razloga usklađenosti ili regulative.
- **Autoclass**: Ako **ne znate koliko ćete često pristupati** podacima, možete izabrati Autoclass i GCP će **automatski promeniti tip skladištenja kako bi minimizirao troškove**.

### Access Control

Pod **razumevanjem** je **preporučljivo** kontrolisati pristup putem **IAM**, ali je takođe moguće **omogućiti korišćenje ACL-a**.\
Ako izaberete da koristite samo IAM (podrazumevano) i **prođe 90 dana**, nećete moći da omogućite ACL-e za kantu.

### Versioning

Moguće je omogućiti verzionisanje, ovo će **sačuvati stare verzije datoteke unutar kante**. Moguće je konfigurisati **broj verzija koje želite da zadržite** i čak **koliko dugo** želite da **neaktuelne** verzije (stare verzije) žive. Preporučuje se **7 dana za Standard tip**.

**Metapodaci neaktuelne verzije se čuvaju**. Štaviše, **ACL-i neaktuelnih verzija se takođe čuvaju**, tako da starije verzije mogu imati različite ACL-e od trenutne verzije.

Saznajte više u [**docs**](https://cloud.google.com/storage/docs/object-versioning).

### Retention Policy

Naznačite koliko **dugo** želite da **zabranite brisanje objekata unutar kante** (veoma korisno za usklađenost barem).\
Samo jedna od **verzionisanja ili politike zadržavanja može biti omogućena u isto vreme**.

### Encryption

Podrazumevano, objekti su **šifrovani koristeći Google upravljane ključeve**, ali takođe možete koristiti **ključ iz KMS**.

### Public Access

Moguće je dati **spoljnim korisnicima** (prijavljenim u GCP ili ne) **pristup sadržaju kanti**.\
Podrazumevano, kada se kanta kreira, imaće **onemogućenu opciju da se javno izloži** kanta, ali uz dovoljno dozvola to se može promeniti.

**Format URL-a** za pristup kanti je **`https://storage.googleapis.com/<bucket-name>` ili `https://<bucket_name>.storage.googleapis.com`** (oba su validna).

### HMAC Keys

HMAC ključ je vrsta _akreditiva_ i može biti **povezan sa servisnim nalogom ili korisničkim nalogom u Cloud Storage**. Koristite HMAC ključ za kreiranje _potpisa_ koji se zatim uključuju u zahteve za Cloud Storage. Potpisi pokazuju da je **dati zahtev autorizovan od strane korisnika ili servisnog naloga**.

HMAC ključevi imaju dva osnovna dela, _ID pristupa_ i _tajnu_.

- **Access ID**: Alfanumerički niz povezan sa specifičnim servisom ili korisničkim nalogom. Kada je povezan sa servisnim nalogom, niz ima 61 karakter, a kada je povezan sa korisničkim nalogom, niz ima 24 karaktera. Sledeće prikazuje primer ID-a pristupa:

`GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA`

- **Secret**: Niz od 40 karaktera kodiran u Base-64 koji je povezan sa specifičnim ID-om pristupa. Tajna je unapred podeljeni ključ koji samo vi i Cloud Storage znate. Koristite svoju tajnu za kreiranje potpisa kao deo procesa autentifikacije. Sledeće prikazuje primer tajne:

`bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ`

I ID pristupa i tajna jedinstveno identifikuju HMAC ključ, ali je tajna mnogo osetljivija informacija, jer se koristi za **kreiranje potpisa**.

### 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
```
Ako dobijete grešku "permission denied" prilikom listanja kanti, možda i dalje imate pristup sadržaju. Dakle, sada kada znate o konvenciji imena kanti, možete generisati listu mogućih imena i pokušati da im pristupite:
```bash
for i in $(cat wordlist.txt); do gsutil ls -r gs://"$i"; done
```
Sa dozvolama `storage.objects.list` i `storage.objects.get`, trebali biste moći da enumerišete sve foldere i fajlove iz bucket-a kako biste ih preuzeli. To možete postići ovim Python skriptom:
```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>')
```
### Eskalacija privilegija

Na sledećoj stranici možete proveriti kako da **zloupotrebite dozvole za skladištenje da biste eskalirali privilegije**:

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

### Neautentifikovana enumeracija

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

### Post eksploatacija

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

### Perzistencija

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

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