GCP - Container Privesc
container
container.clusters.get
container.clusters.get
Questa autorizzazione consente di raccogliere le credenziali per il cluster Kubernetes utilizzando qualcosa come:
Senza permessi aggiuntivi, le credenziali sono piuttosto di base in quanto è possibile solo elencare alcune risorse, ma sono utili per individuare errori di configurazione nell'ambiente.
Nota che i cluster Kubernetes potrebbero essere configurati come privati, il che impedisce l'accesso al server Kube-API da Internet.
Se non hai questo permesso, puoi comunque accedere al cluster, ma devi creare il tuo file di configurazione kubectl con le informazioni del cluster. Uno nuovo generato appare così:
container.roles.escalate
| container.clusterRoles.escalate
container.roles.escalate
| container.clusterRoles.escalate
Di default, Kubernetes impedisce ai principali di poter creare o aggiornare Ruoli e ClusterRoles con più permessi di quelli che il principale possiede. Tuttavia, un principale di GCP con tali permessi sarà in grado di creare/aggiornare Ruoli/ClusterRoles con più permessi di quelli che possiede, eludendo efficacemente la protezione di Kubernetes contro questo comportamento.
È necessario anche avere i permessi container.roles.create
e/o container.roles.update
OPPURE container.clusterRoles.create
e/o container.clusterRoles.update
per eseguire queste azioni di escalation dei privilegi.
container.roles.bind
| container.clusterRoles.bind
container.roles.bind
| container.clusterRoles.bind
Di default, Kubernetes impedisce ai principali di poter creare o aggiornare RoleBindings e ClusterRoleBindings per concedere più permessi di quelli che il principale possiede. Tuttavia, un principale di GCP con tali permessi sarà in grado di creare/aggiornare RoleBindings/ClusterRoleBindings con più permessi di quelli che possiede, eludendo efficacemente la protezione di Kubernetes contro questo comportamento.
È necessario anche avere i permessi container.roleBindings.create
e/o container.roleBindings.update
OPPURE container.clusterRoleBindings.create
e/o container.clusterRoleBindings.update
per eseguire queste azioni di escalation dei privilegi.
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
Tutti questi permessi ti consentiranno di creare o aggiornare una risorsa in cui puoi definire un pod. Definendo un pod, puoi specificare l'account di servizio (SA) che verrà associato e l'immagine che verrà eseguita, quindi puoi eseguire un'immagine che esfiltrerà il token dell'account di servizio al tuo server, consentendoti di scalare a qualsiasi account di servizio. Per ulteriori informazioni, consulta:
Poiché ci troviamo in un ambiente GCP, sarai anche in grado di ottenere l'account di servizio GCP del nodepool dal servizio di metadati e aumentare i privilegi in GCP (di default viene utilizzato l'account di servizio di calcolo).
container.secrets.get
| container.secrets.list
container.secrets.get
| container.secrets.list
Con questi permessi, come spiegato in questa pagina, puoi leggere i token di tutti gli account di servizio di Kubernetes, quindi puoi aumentare i privilegi su di essi.
container.pods.exec
container.pods.exec
Con questo permesso sarai in grado di eseguire comandi nei pod, il che ti dà accesso a tutti gli account di servizio di Kubernetes in esecuzione nei pod per aumentare i privilegi all'interno di K8s, ma sarai anche in grado di rubare l'account di servizio GCP del NodePool, aumentando i privilegi in GCP.
container.pods.portForward
container.pods.portForward
Come spiegato in questa pagina, con questi permessi puoi accedere ai servizi locali in esecuzione nei pod, che potrebbero consentirti di aumentare i privilegi in Kubernetes (e in GCP se in qualche modo riesci a comunicare con il servizio di metadati).
container.serviceAccounts.createToken
container.serviceAccounts.createToken
A causa del nome del permesso, sembra che ti permetta di generare token degli account di servizio di K8s, quindi sarai in grado di aumentare i privilegi a qualsiasi SA all'interno di Kubernetes. Tuttavia, non ho trovato alcun endpoint API da utilizzare, quindi fammi sapere se lo trovi.
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
Questi permessi potrebbero consentirti di aumentare i privilegi in Kubernetes, ma più probabilmente potresti abusarne per persistere nel cluster. Per ulteriori informazioni, seguire questo link.
Last updated