GCP - Container Privesc

Reading time: 5 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

container

container.clusters.get

Ova dozvola omogućava prikupljanje kredencijala za Kubernetes klaster koristeći nešto poput:

bash
gcloud container clusters get-credentials <cluster_name> --zone <zone>

Bez dodatnih dozvola, kredencijali su prilično osnovni jer možete samo nabrojati neke resurse, ali su korisni za pronalaženje pogrešnih konfiguracija u okruženju.

note

Imajte na umu da kubernetes klasteri mogu biti konfigurisani da budu privatni, što će onemogućiti pristup Kube-API serveru sa Interneta.

Ako nemate ovu dozvolu, i dalje možete pristupiti klasteru, ali morate napraviti svoj vlastiti kubectl config fajl sa informacijama o klasterima. Novi generisani izgleda ovako:

yaml
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVMRENDQXBTZ0F3SUJBZ0lRRzNaQmJTSVlzeVRPR1FYODRyNDF3REFOQmdrcWhraUc5dzBCQVFzRkFEQXYKTVMwd0t3WURWUVFERXlRMk9UQXhZVEZoWlMweE56ZGxMVFF5TkdZdE9HVmhOaTAzWVdFM01qVmhNR05tTkdFdwpJQmNOTWpJeE1qQTBNakl4T1RJMFdoZ1BNakExTWpFeE1qWXlNekU1TWpSYU1DOHhMVEFyQmdOVkJBTVRKRFk1Ck1ERmhNV0ZsTFRFM04yVXROREkwWmkwNFpXRTJMVGRoWVRjeU5XRXdZMlkwWVRDQ0FhSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0dQQURDQ0FZb0NnZ0dCQU00TWhGemJ3Y3VEQXhiNGt5WndrNEdGNXRHaTZmb0pydExUWkI4Rgo5TDM4a2V2SUVWTHpqVmtoSklpNllnSHg4SytBUHl4RHJQaEhXMk5PczFNMmpyUXJLSHV6M0dXUEtRUmtUWElRClBoMy9MMDVtbURwRGxQK3hKdzI2SFFqdkE2Zy84MFNLakZjRXdKRVhZbkNMMy8yaFBFMzdxN3hZbktwTWdKVWYKVnoxOVhwNEhvbURvOEhUN2JXUTJKWTVESVZPTWNpbDhkdDZQd3FUYmlLNjJoQzNRTHozNzNIbFZxaiszNy90RgpmMmVwUUdFOG90a0VVOFlHQ3FsRTdzaVllWEFqbUQ4bFZENVc5dk1RNXJ0TW8vRHBTVGNxRVZUSzJQWk1rc0hyCmMwbGVPTS9LeXhnaS93TlBRdW5oQ2hnRUJIZTVzRmNxdmRLQ1pmUFovZVI1Qk0vc0w1WFNmTE9sWWJLa2xFL1YKNFBLNHRMVmpiYVg1VU9zMUZIVXMrL3IyL1BKQ2hJTkRaVTV2VjU0L1c5NWk4RnJZaUpEYUVGN0pveXJvUGNuMwpmTmNjQ2x1eGpOY1NsZ01ISGZKRzZqb0FXLzB0b2U3ek05RHlQOFh3NW44Zm5lQm5aVTFnYXNKREZIYVlZbXpGCitoQzFETmVaWXNibWNxOGVPVG9LOFBKRjZ3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQWdRd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU5UkhvQXlxY3RWSDVIcmhQZ1BjYzF6Sm9kWFV3RFFZSgpLb1pJaHZjTkFRRUxCUUFEZ2dHQkFLbnp3VEx0QlJBVE1KRVB4TlBNbmU2UUNqZDJZTDgxcC9oeVc1eWpYb2w5CllkMTRRNFVlVUJJVXI0QmJadzl0LzRBQ3ZlYUttVENaRCswZ2wyNXVzNzB3VlFvZCtleVhEK2I1RFBwUUR3Z1gKbkJLcFFCY1NEMkpvZ29tT3M3U1lPdWVQUHNrODVvdWEwREpXLytQRkY1WU5ublc3Z1VLT2hNZEtKcnhuYUVGZAprVVl1TVdPT0d4U29qVndmNUsyOVNCbGJ5YXhDNS9tOWkxSUtXV2piWnZPN0s4TTlYLytkcDVSMVJobDZOSVNqCi91SmQ3TDF2R0crSjNlSjZneGs4U2g2L28yRnhxZWFNdDladWw4MFk4STBZaGxXVmlnSFMwZmVBUU1NSzUrNzkKNmozOWtTZHFBYlhPaUVOMzduOWp2dVlNN1ZvQzlNUk1oYUNyQVNhR2ZqWEhtQThCdlIyQW5iQThTVGpQKzlSMQp6VWRpK3dsZ0V4bnFvVFpBcUVHRktuUTlQcjZDaDYvR0xWWStqYXhuR3lyUHFPYlpNZTVXUDFOUGs4NkxHSlhCCjc1elFvanEyRUpxanBNSjgxT0gzSkxOeXRTdmt4UDFwYklxTzV4QUV0OWxRMjh4N28vbnRuaWh1WmR6M0lCRU8KODdjMDdPRGxYNUJQd0hIdzZtKzZjUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: https://34.123.141.28
name: gke_security-devbox_us-central1_autopilot-cluster-1
contexts:
- context:
cluster: gke_security-devbox_us-central1_autopilot-cluster-1
user: gke_security-devbox_us-central1_autopilot-cluster-1
name: gke_security-devbox_us-central1_autopilot-cluster-1
current-context: gke_security-devbox_us-central1_autopilot-cluster-1
kind: Config
preferences: {}
users:
- name: gke_security-devbox_us-central1_autopilot-cluster-1
user:
auth-provider:
config:
access-token: <access token>
cmd-args: config config-helper --format=json
cmd-path: gcloud
expiry: "2022-12-06T01:13:11Z"
expiry-key: "{.credential.token_expiry}"
token-key: "{.credential.access_token}"
name: gcp

container.roles.escalate | container.clusterRoles.escalate

Kubernetes po defaultu sprečava principe da mogu da kreiraju ili ažuriraju Roles i ClusterRoles sa više dozvola nego što ih princip ima. Međutim, GCP princip sa tim dozvolama će moći da kreira/ažurira Roles/ClusterRoles sa više dozvola nego što ih ima, efikasno zaobilazeći zaštitu Kubernetes-a protiv ovog ponašanja.

container.roles.create i/ili container.roles.update ili container.clusterRoles.create i/ili container.clusterRoles.update su takođe neophodni za izvođenje tih akcija eskalacije privilegija.

container.roles.bind | container.clusterRoles.bind

Kubernetes po defaultu sprečava principe da mogu da kreiraju ili ažuriraju RoleBindings i ClusterRoleBindings kako bi dali više dozvola nego što ih princip ima. Međutim, GCP princip sa tim dozvolama će moći da kreira/ažurira RoleBindings/ClusterRoleBindings sa više dozvola nego što ih ima, efikasno zaobilazeći zaštitu Kubernetes-a protiv ovog ponašanja.

container.roleBindings.create i/ili container.roleBindings.update ili container.clusterRoleBindings.create i/ili container.clusterRoleBindings.update su takođe neophodni za izvođenje tih akcija eskalacije privilegija.

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

Sve ove dozvole će vam omogućiti da kreirate ili ažurirate resurs gde možete definisati pod. Definisanjem poda možete navesti SA koji će biti priključen i sliku koja će biti pokrenuta, tako da možete pokrenuti sliku koja će izvući token SA na vaš server, omogućavajući vam da eskalirate na bilo koji servisni nalog.
Za više informacija pogledajte:

Kao što smo u GCP okruženju, takođe ćete moći da dobijete nodepool GCP SA iz metadata servisa i eskalirate privilegije u GCP (po defaultu se koristi compute SA).

container.secrets.get | container.secrets.list

Kao što je objašnjeno na ovoj stranici, sa ovim dozvolama možete čitati tokene svih SA-ova u Kubernetes-u, tako da možete eskalirati na njih.

container.pods.exec

Sa ovom dozvolom moći ćete da izvršite u podovima, što vam daje pristup svim Kubernetes SA-ovima koji rade u podovima za eskalaciju privilegija unutar K8s, ali takođe ćete moći da ukradete GCP servisni nalog NodePool-a, eskalirajući privilegije u GCP.

container.pods.portForward

Kao što je objašnjeno na ovoj stranici, sa ovim dozvolama možete pristupiti lokalnim servisima koji rade u podovima što može omogućiti da eskalirate privilegije u Kubernetes-u (i u GCP ako nekako uspete da komunicirate sa metadata servisom).

container.serviceAccounts.createToken

Zbog imena dozvole, izgleda da će vam omogućiti da generišete tokene K8s servisnih naloga, tako da ćete moći da eskalirate na bilo koji SA unutar Kubernetes-a. Međutim, nisam mogao da pronađem nijedan API endpoint za korišćenje, pa me obavestite ako ga pronađete.

container.mutatingWebhookConfigurations.create | container.mutatingWebhookConfigurations.update

Ove dozvole bi mogle omogućiti eskalaciju privilegija u Kubernetes-u, ali verovatnije je da biste ih mogli zloupotrebiti da persistirate u klasteru.
Za više informacija pratite ovaj link.

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks