# GCP - Storage Enum

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

## Stockage

Google Cloud Platform (GCP) Storage est une **solution de stockage basée sur le cloud** qui fournit un stockage d'objets hautement durable et disponible pour des données non structurées. Il offre **différentes classes de stockage** basées sur la performance, la disponibilité et le coût, y compris Standard, Nearline, Coldline et Archive. GCP Storage fournit également des fonctionnalités avancées telles que **les politiques de cycle de vie, la gestion des versions et le contrôle d'accès** pour gérer et sécuriser les données efficacement.

Le bucket peut être stocké dans une région, dans 2 régions ou **multi-région (par défaut)**.

### Types de stockage

- **Stockage standard** : C'est l'option de stockage par défaut qui **offre un accès à haute performance et faible latence aux données fréquemment consultées**. Il convient à un large éventail de cas d'utilisation, y compris la diffusion de contenu de site Web, le streaming multimédia et l'hébergement de pipelines d'analyse de données.
- **Stockage Nearline** : Cette classe de stockage offre **des coûts de stockage inférieurs** et **des coûts d'accès légèrement plus élevés** que le stockage standard. Il est optimisé pour les données rarement consultées, avec une durée de stockage minimale de 30 jours. Il est idéal pour les sauvegardes et les archives.
- **Stockage Coldline** : Cette classe de stockage est optimisée pour **le stockage à long terme de données rarement consultées**, avec une durée de stockage minimale de 90 jours. Il offre **des coûts de stockage inférieurs** à ceux du stockage Nearline, mais avec **des coûts d'accès plus élevés**.
- **Stockage Archive** : Cette classe de stockage est conçue pour les données froides qui sont consultées **très rarement**, avec une durée de stockage minimale de 365 jours. Elle offre **les coûts de stockage les plus bas de toutes les options de stockage GCP**, mais avec **les coûts d'accès les plus élevés**. Elle convient à la conservation à long terme des données qui doivent être stockées pour des raisons de conformité ou réglementaires.
- **Autoclass** : Si vous **ne savez pas combien de fois vous allez accéder** aux données, vous pouvez sélectionner Autoclass et GCP **changera automatiquement le type de stockage pour vous afin de minimiser les coûts**.

### Contrôle d'accès

Par **défaut**, il est **recommandé** de contrôler l'accès via **IAM**, mais il est également possible d'**activer l'utilisation des ACL**.\
Si vous choisissez d'utiliser uniquement IAM (par défaut) et que **90 jours passent**, vous **ne pourrez pas activer les ACL** pour le bucket.

### Gestion des versions

Il est possible d'activer la gestion des versions, cela **sauvera les anciennes versions du fichier à l'intérieur du bucket**. Il est possible de configurer le **nombre de versions que vous souhaitez conserver** et même **combien de temps** vous souhaitez que les versions **non courantes** (anciennes versions) vivent. Il est recommandé de **7 jours pour le type Standard**.

Les **métadonnées d'une version non courante sont conservées**. De plus, **les ACL des versions non courantes sont également conservées**, donc les anciennes versions peuvent avoir des ACL différentes de la version actuelle.

En savoir plus dans les [**docs**](https://cloud.google.com/storage/docs/object-versioning).

### Politique de conservation

Indiquez combien de temps vous souhaitez **interdire la suppression des objets à l'intérieur du bucket** (très utile pour la conformité au moins).\
Une seule de **la gestion des versions ou de la politique de conservation peut être activée à la fois**.

### Chiffrement

Par défaut, les objets sont **chiffrés à l'aide de clés gérées par Google**, mais vous pouvez également utiliser une **clé de KMS**.

### Accès public

Il est possible de donner un **accès aux utilisateurs externes** (connectés à GCP ou non) au **contenu des buckets**.\
Par défaut, lorsqu'un bucket est créé, il aura **désactivé l'option d'exposition publique** du bucket, mais avec suffisamment de permissions, cela peut être changé.

Le **format d'une URL** pour accéder à un bucket est **`https://storage.googleapis.com/<bucket-name>` ou `https://<bucket_name>.storage.googleapis.com`** (les deux sont valides).

### Clés HMAC

Une clé HMAC est un type de _credential_ et peut être **associée à un compte de service ou à un compte utilisateur dans Cloud Storage**. Vous utilisez une clé HMAC pour créer des _signatures_ qui sont ensuite incluses dans les requêtes à Cloud Storage. Les signatures montrent qu'une **demande donnée est autorisée par l'utilisateur ou le compte de service**.

Les clés HMAC ont deux éléments principaux, un _ID d'accès_ et un _secret_.

- **ID d'accès** : Une chaîne alphanumérique liée à un compte de service ou utilisateur spécifique. Lorsqu'elle est liée à un compte de service, la chaîne fait 61 caractères de long, et lorsqu'elle est liée à un compte utilisateur, la chaîne fait 24 caractères de long. Voici un exemple d'un ID d'accès :

`GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA`

- **Secret** : Une chaîne codée en Base-64 de 40 caractères qui est liée à un ID d'accès spécifique. Un secret est une clé prépartagée que vous et Cloud Storage connaissez uniquement. Vous utilisez votre secret pour créer des signatures dans le cadre du processus d'authentification. Voici un exemple d'un secret :

`bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ`

À la fois l'**ID d'accès et le secret identifient de manière unique une clé HMAC**, mais le secret est une information beaucoup plus sensible, car il est utilisé pour **créer des signatures**.

### Énumération
```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
```
Si vous obtenez une erreur de permission refusée en listant les buckets, vous pouvez toujours avoir accès au contenu. Donc, maintenant que vous connaissez la convention de nommage des buckets, vous pouvez générer une liste de noms possibles et essayer d'y accéder :
```bash
for i in $(cat wordlist.txt); do gsutil ls -r gs://"$i"; done
```
Avec les permissions `storage.objects.list` et `storage.objects.get`, vous devriez être en mesure d'énumérer tous les dossiers et fichiers du bucket afin de les télécharger. Vous pouvez y parvenir avec ce 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>')
```
### Escalade de privilèges

Dans la page suivante, vous pouvez vérifier comment **abuser des permissions de stockage pour escalader les privilèges** :

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

### Enumération non authentifiée

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

### Post-exploitation

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

### Persistance

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

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