GCP - Container Privesc

Support HackTricks

контейнер

container.clusters.get

Цей дозвіл дозволяє збирати облікові дані для Kubernetes кластера за допомогою чогось на зразок:

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

Без додаткових дозволів, облікові дані досить базові, оскільки ви можете просто перерахувати деякі ресурси, але вони корисні для виявлення неправильних налаштувань в середовищі.

Зверніть увагу, що кластери kubernetes можуть бути налаштовані як приватні, що заборонить доступ до Kube-API сервера з Інтернету.

Якщо у вас немає цього дозволу, ви все ще можете отримати доступ до кластера, але вам потрібно створити свій власний файл конфігурації kubectl з інформацією про кластери. Новий згенерований виглядає так:

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 за замовчуванням запобігає принципам можливість створювати або оновлювати Roles та ClusterRoles з більшими правами, ніж ті, які має принцип. Однак, GCP принцип з такими правами зможе створювати/оновлювати Roles/ClusterRoles з більшими правами, ніж ті, які він має, ефективно обходячи захист Kubernetes проти цієї поведінки.

container.roles.create та/або container.roles.update АБО container.clusterRoles.create та/або container.clusterRoles.update відповідно також є необхідними для виконання цих дій ескалації привілеїв.

container.roles.bind | container.clusterRoles.bind

Kubernetes за замовчуванням запобігає принципам можливість створювати або оновлювати RoleBindings та ClusterRoleBindings, щоб надати більші права, ніж ті, які має принцип. Однак, GCP принцип з такими правами зможе створювати/оновлювати RolesBindings/ClusterRolesBindings з більшими правами, ніж ті, які він має, ефективно обходячи захист Kubernetes проти цієї поведінки.

container.roleBindings.create та/або container.roleBindings.update АБО container.clusterRoleBindings.create та/або container.clusterRoleBindings.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

Усі ці права дозволять вам створювати або оновлювати ресурс, де ви можете визначити pod. Визначаючи pod, ви можете вказати SA, який буде прикріплений, і образ, який буде запущений, отже, ви можете запустити образ, який буде екстрагувати токен SA на ваш сервер, дозволяючи вам ескалувати до будь-якого облікового запису служби. Для отримання додаткової інформації дивіться:

Оскільки ми знаходимося в середовищі GCP, ви також зможете отримати SA nodepool GCP з метаданих служби та ескалювати привілеї в GCP (за замовчуванням використовується SA обчислень).

container.secrets.get | container.secrets.list

Як пояснено на цій сторінці, з цими правами ви можете читати токени всіх SA Kubernetes, тому ви можете ескалувати до них.

container.pods.exec

З цим правом ви зможете виконувати команди в pods, що надає вам доступ до всіх Kubernetes SA, що працюють у pods, для ескалації привілеїв у K8s, але також ви зможете вкрасти GCP Service Account з NodePool, ескалюючи привілеї в GCP.

container.pods.portForward

Як пояснено на цій сторінці, з цими правами ви можете доступатися до локальних служб, що працюють у pods, які можуть дозволити вам ескалювати привілеї в Kubernetes (і в GCP, якщо якимось чином вам вдасться зв'язатися з метаданими служби).

container.serviceAccounts.createToken

Через назву права, здається, що воно дозволить вам генерувати токени K8s Service Accounts, тому ви зможете ескалювати до будь-якого SA всередині Kubernetes. Однак я не зміг знайти жодну точку API для його використання, тому дайте знати, якщо ви її знайдете.

container.mutatingWebhookConfigurations.create | container.mutatingWebhookConfigurations.update

Ці права можуть дозволити вам ескалувати привілеї в Kubernetes, але, швидше за все, ви могли б зловживати ними, щоб зберігатися в кластері. Для отримання додаткової інформації перейдіть за цим посиланням.

Support HackTricks

Last updated