GCP - Storage Privesc
Storage
Informations de base :
pageGCP - Storage Enumstorage.objects.get
storage.objects.get
Cette permission vous permet de télécharger des fichiers stockés dans Cloud Storage. Cela peut potentiellement vous permettre d'escalader les privilèges car dans certains cas, 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 sauvegardé 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
storage.objects.setIamPolicy
Vous pouvez vous donner la permission d'abuser de n'importe quel scénario précédent de cette section.
storage.buckets.setIamPolicy
storage.buckets.setIamPolicy
Pour un exemple de modification des permissions avec cette permission, consultez cette page :
pageGCP - Public Buckets Privilege Escalationstorage.hmacKeys.create
storage.hmacKeys.create
La fonctionnalité "interopérabilité" de Cloud Storage, conçue pour les interactions entre différents clouds 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 une élévation de privilèges au sein de Cloud Storage. Alors que les clés HMAC associées aux utilisateurs ne sont récupérables que via la console web, les clés d'accès et secrètes restent toujours accessibles, permettant un accès potentiel au stockage de sauvegarde. 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 la création, ajoutant une couche de complexité pour un accès continu.
Un autre script d'exploitation pour cette méthode peut être trouvé ici.
storage.objects.create
, storage.objects.delete
= Permissions d'écriture sur le stockage
storage.objects.create
, storage.objects.delete
= Permissions d'écriture sur le stockagePour créer un nouvel objet dans un compartiment, 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 compartiments où vous pouvez écrire dans le cloud est dans le cas où le compartiment sauvegarde des fichiers de serveur web, vous pourriez être capable de stocker du nouveau code qui sera utilisé par l'application web.
Composer
Composer est Apache Airflow géré à l'intérieur de GCP. Il présente plusieurs caractéristiques intéressantes :
Il fonctionne à l'intérieur d'un cluster GKE, donc le SA que le cluster utilise est accessible par le code exécuté à l'intérieur de Composer
Il stocke le code dans un compartiment, donc, toute personne ayant un accès en écriture sur ce compartiment va pouvoir changer/ajouter un code DGA (le code qu'Apache Airflow exécutera) Alors, si vous avez un accès en écriture sur le compartiment que Composer utilise pour stocker le code, vous pouvez privesc au SA exécuté dans le cluster GKE.
Cloud Functions
Le code des Cloud Functions est stocké dans Storage, donc le réécrire permet de potentiellement exécuter du code arbitraire.
App Engine
Le code source de App Engine est stocké dans des compartiments, réécrire le code pourrait permettre d'exécuter du code arbitraire. CECI N'EST PAS POSSIBLE
Il semble que les couches de conteneurs soient stockées dans le compartiment, peut-être les changer ?
GCR
Google Container Registry stocke les images à l'intérieur de compartiments, si vous pouvez écrire dans ces compartiments vous pourriez être capable de vous déplacer latéralement là où ces compartiments sont exécutés.
Le compartiment utilisé par GCR aura une URL similaire à
gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com
(Les sous-domaines de premier niveau sont spécifiés ici).
Références
Dernière mise à jour