GCP - Container Privesc
conteneur
container.clusters.get
container.clusters.get
Cette autorisation permet de recueillir des informations d'identification pour le cluster Kubernetes en utilisant quelque chose comme :
Sans autorisations supplémentaires, les informations d'identification sont assez basiques car vous pouvez simplement lister certaines ressources, mais elles sont utiles pour trouver des erreurs de configuration dans l'environnement.
Notez que les clusters Kubernetes peuvent être configurés pour être privés, ce qui empêchera l'accès au serveur Kube-API depuis Internet.
Si vous n'avez pas cette autorisation, vous pouvez toujours accéder au cluster, mais vous devez créer votre propre fichier de configuration kubectl avec les informations des clusters. Un nouveau fichier généré ressemble à ceci :
container.roles.escalate
| container.clusterRoles.escalate
container.roles.escalate
| container.clusterRoles.escalate
Kubernetes par défaut empêche les principaux de pouvoir créer ou mettre à jour des Rôles et ClusterRoles avec plus de permissions que celles détenues par le principal. Cependant, un principal GCP avec ces permissions pourra créer/mettre à jour des Rôles/ClusterRoles avec plus de permissions que celles qu'il détient, contournant ainsi la protection de Kubernetes contre ce comportement.
Les permissions container.roles.create
et/ou container.roles.update
OU container.clusterRoles.create
et/ou container.clusterRoles.update
respectivement sont également nécessaires pour effectuer ces actions d'escalade de privilèges.
container.roles.bind
| container.clusterRoles.bind
container.roles.bind
| container.clusterRoles.bind
Kubernetes par défaut empêche les principaux de pouvoir créer ou mettre à jour des RoleBindings et ClusterRoleBindings pour donner plus de permissions que celles détenues par le principal. Cependant, un principal GCP avec ces permissions pourra créer/mettre à jour des RoleBindings/ClusterRoleBindings avec plus de permissions que celles qu'il détient, contournant ainsi la protection de Kubernetes contre ce comportement.
Les permissions container.roleBindings.create
et/ou container.roleBindings.update
OU container.clusterRoleBindings.create
et/ou container.clusterRoleBindings.update
respectivement sont également nécessaires pour effectuer ces actions d'escalade de privilèges.
container.cronJobs.create
| container.cronJobs.update
| container.daemonSets.create
| container.daemonSets.update
| container.deployments.create
| container.deployments.update
| container.jobs.create
| container.jobs.update
| container.pods.create
| container.pods.update
| container.replicaSets.create
| container.replicaSets.update
| container.replicationControllers.create
| container.replicationControllers.update
| container.scheduledJobs.create
| container.scheduledJobs.update
| container.statefulSets.create
| container.statefulSets.update
container.cronJobs.create
| container.cronJobs.update
| container.daemonSets.create
| container.daemonSets.update
| container.deployments.create
| container.deployments.update
| container.jobs.create
| container.jobs.update
| container.pods.create
| container.pods.update
| container.replicaSets.create
| container.replicaSets.update
| container.replicationControllers.create
| container.replicationControllers.update
| container.scheduledJobs.create
| container.scheduledJobs.update
| container.statefulSets.create
| container.statefulSets.update
Toutes ces permissions vont vous permettre de créer ou mettre à jour une ressource où vous pouvez définir un pod. En définissant un pod, vous pouvez spécifier le SA qui va être attaché et l'image qui va être exécutée, vous permettant ainsi d'exécuter une image qui va exfiltrer le jeton du SA vers votre serveur, vous permettant d'escalader vers n'importe quel compte de service. Pour plus d'informations, consultez :
Comme nous sommes dans un environnement GCP, vous pourrez également obtenir le SA GCP du pool de nœuds à partir du service de métadonnées et escalader les privilèges dans GCP (par défaut, le SA de calcul est utilisé).
container.secrets.get
| container.secrets.list
container.secrets.get
| container.secrets.list
Comme expliqué sur cette page, avec ces permissions, vous pouvez lire les jetons de tous les SA de Kubernetes, vous permettant d'escalader vers eux.
container.pods.exec
container.pods.exec
Avec cette permission, vous pourrez exécuter des commandes dans des pods, ce qui vous donne accès à tous les SA Kubernetes s'exécutant dans les pods pour escalader les privilèges au sein de K8s, mais vous pourrez également voler le compte de service GCP du pool de nœuds, escaladant les privilèges dans GCP.
container.pods.portForward
container.pods.portForward
Comme expliqué sur cette page, avec ces permissions, vous pouvez accéder aux services locaux s'exécutant dans les pods qui pourraient vous permettre d'escalader les privilèges dans Kubernetes (et dans GCP si vous parvenez d'une manière ou d'une autre à accéder au service de métadonnées).
container.serviceAccounts.createToken
container.serviceAccounts.createToken
En raison du nom de la permission, il semble que cela vous permettra de générer des jetons des comptes de service K8s, vous pourrez donc escalader vers n'importe quel SA à l'intérieur de Kubernetes. Cependant, je n'ai trouvé aucun point de terminaison API à utiliser, alors faites-moi savoir si vous le trouvez.
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
Ces permissions pourraient vous permettre d'escalader les privilèges dans Kubernetes, mais plus probablement, vous pourriez les utiliser pour persister dans le cluster. Pour plus d'informations, suivez ce lien.
Dernière mise à jour