GCP - Storage Enum

Support HackTricks

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 des 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 la documentation.

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 accès à des 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 de 40 caractères encodée en Base-64 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

# 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 :

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 :

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 :

Enumération Non Authentifiée

Post Exploitation

Persistance

Soutenir HackTricks

Last updated