В этом практическом руководстве, мы познакомимся с Kubernetes (K8s) с точки зрения пентестера, а именно с основами, терминологией и методами исследования экземпляров Kubernetes. Для начала давайте разберёмся, что такое Kubernetes, и его терминологией.

Kubernetes — это система с открытым исходным кодом для автоматизации развертывания и управления контейнеризированными приложениями на множестве серверов, объединённых в кластер. Существует официальный глоссарий, но ниже приведены ключевые понятия, с которыми стоит ознакомиться:

  • Pod (Под) — наименьшая единица в экосистеме Kubernetes: группа контейнеров, совместно выполняемых на одном узле кластера.

  • Node (Узел) — физическая или виртуальная машина, на которой запускаются поды. Каждый узел содержит kubelet и kube-proxy.

  • Kubelet — это агент, который работает на каждом узле в кластере. Он взаимодействует с API-сервером Kubernetes, что гарантирует работу подов, а также регистрирует и отслеживает состояние узлов в кластере.

  • Kube-proxy — сетевой посредник, запускаемый на каждом узле кластера Kubernetes. Он преобразует определения служб в действующие сетевые правила, поддерживая сетевую связность служб и подов.

  • Cluster (Кластер) — набор узлов, который включает в себя управляющий узел и набор рабочих узлов, запускающих контейнерные приложения.

  • Container (Контейнер) — это изолированная среда, в которой запускаются приложения вместе со всеми их зависимостями. Контейнеры создают отдельное пространство процессов и файловой системы, позволяя запускать приложения независимо друг от друга на одной машине.

  • etcd — распределённое хранилище в формате ключ-значение, используемое для хранения конфигурации, состояния и метаданных кластера.

  • kubectl — CLI-инструмент (командная строка) для взаимодействия с API-сервером Kubernetes.

  • Kubernetes API Server — это компонент, который является центральной точкой управления кластером Kubernetes. Он управляет всеми коммуникациями между пользователями, внешними инструментами и внутренними компонентами кластера.

  • Kube-scheduler — это компонент, который отвечает за планирование запуска контейнеров на рабочих нодах в кластере.

  • Deployment (Деплоймент)— это объект, который управляет жизненным циклом контейнеров и обеспечивает стабильное развёртывание, обновление и масштабирование приложений.

  • Namespace (Пространство имён) — виртуальный кластер в рамках физического, позволяющий изолировать ресурсы и управлять неймингом контейнеров, сервисов и деплойментов.

Теперь обсудим kubectl — основной инструмент для взаимодействия с Kubernetes-инстансами. Его можно установить через Homebrew:

brew install kubectl

или

brew install kubernetes-cli

Пример запуска kubectl
Пример запуска kubectl

Чтобы kubectl мог обнаружить и подключиться к кластеру, требуется файл конфигурации kubeconfig.

Несконфигурированный kubectl
Несконфигурированный kubectl

Проверьте, правильно ли настроен kubectl, проверив информацию о кластере:

kubectl cluster-info

Некоторые полезные команды:

kubectl get pods -A      # Список всех подов во всех пространствах имён

kubectl get secrets      # Получение секретов

kubectl get services     # Получение сервисов

kubectl version          # Проверка версии клиента и сервера

Когда вы освоили базовые команды, можно переходить к обнаружению и анализу типичных уязвимостей в инстансах Kubernetes. Начнём с утечки информации. Много данных можно получить через поиск по crt.sh и Google — ищите поддомены вроде k8s.*.com. Также попробуйте запрос k8s.%.com + github и обратите внимание на YAML-файлы с соответствующими строками.

Инструменты Censys и Shodan также отлично подходят для этой задачи. Вот список запросов, которые помогут вам в поиске:

  • kubernetesDashboard

  • kubernetes

  • k8s

  • kubernetes master или kubernetes control plane

  • openshift

  • swarm

  • product:etcd

  • k8s.io

  • apiserver

  • k8s_node, k8s-cluster-etcd, kubeadm-master, kubemaster-etcd

  • services.kubernetes.kubernetes_dashboard_found

Результат поиска в Censys
Результат поиска в Censys

Такие инструменты, как Kubernetes Dashboard, Weave Scope и Lens, используются для визуального представления кластеров. Данные панели управления значительно упрощают работу. При неправильной настройке этих панелей администратором, их можно найти через Shodan или Censys.

Если вы исследуете целевую инфраструктуру, в которой используется Kubernetes, то при сканировании сети вы можете обнаружить следующие открытые порты и службы:

Порт

Процесс

Назначение

443/TCP

kube-apiserver

API-интерфейс Kubernetes

2379/TCP

etcd

API-хранилище etcd

6666/TCP

etcd

etcd

4194/TCP

cAdvisor

Метрики контейнеров

6443/TCP

kube-apiserver

Основной API-порт

8443/TCP

kube-apiserver

API-порт Minikube

8080/TCP

kube-apiserver

API-порт без шифрования

10250/TCP

kubelet

Полный доступ через HTTPS

10255/TCP

kubelet

Read-only HTTP-интерфейс: информация о подах и состоянии узлов

10256/TCP

kube-proxy

Проверка состояния прокси

9099/TCP

calico-felix

Проверка состояния Calico

6782–6784

weave

Метрики и конечные точки

30000–32767

NodePort

Прокси-доступ к сервисам

44134/TCP

Tiller

Служба Helm

API-сервер Kubernetes чаще всего доступен по портам 6443 и 443, в случае Minikube — по 8443, а для незашифрованного доступа — 8080.

Вот некоторые примеры curl-запросов к API-серверу, которые могут дать полезную информацию:

curl -k https://<IP>:6443/swaggerapi

curl -k https://<IP>:6443/healthz

curl -k https://<IP>:6443/api/v1

Примеры запросов к etcd API:

curl -k https://<IP>:2379

curl -k https://<IP>:2379/version

etcdctl --endpoints=http://<IP>:2379 get / --prefix --keys-only

Распространённая ошибка конфигурации Kubernetes — это оставление открытых API эндопинтов. Если обратиться к IP-адресу управляющего узла, то можно увидеть список доступных путей:

https://:<CONTROL-PANEL-IP>:

/api
/api/v1
/apis
/apis/admissionregistration.k8s.io
/apis/apiextensions.k8s.io
/apis/apiregistration.k8s.io/v1
/apis/apps/v1
/apis/authentication.k8s.io/v1
/apis/authorization.k8s.io/v1beta
/apis/autoscaling/v1
/apis/batch/v1
/apis/certificates.k8s.io/v1

Порт cAdvisor также может раскрыть метрики контейнеров:

curl -k https://<IP>:4194

Если kube-apiserver доступен без TLS, то можно использовать:

curl -k http://<IP>:8080

Доступ к порту 10255 (read-only API kubelet) может позволить извлечь информацию о конфигурации кластера, именах подов, расположении внутренних файлов и прочих данных, пригодных для дальнейших атак:

curl -k http://<IP>:10255/pods

Комментарии (1)