Pentesting Kubernetes Services

Reading time: 7 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

Kubernetes використовує кілька специфічних мережевих сервісів, які ви можете знайти відкритими в Інтернеті або в внутрішній мережі, як тільки ви зможете скомпрометувати один pod.

Знаходження відкритих pod з OSINT

Один із способів може бути пошук Identity LIKE "k8s.%.com" на crt.sh для знаходження піддоменів, пов'язаних з kubernetes. Інший спосіб може бути пошук "k8s.%.com" на github і пошук YAML файлів, що містять рядок.

Як Kubernetes відкриває сервіси

Може бути корисно для вас зрозуміти, як Kubernetes може відкривати сервіси публічно, щоб їх знайти:

Exposing Services in Kubernetes

Знаходження відкритих pod через сканування портів

Наступні порти можуть бути відкритими в кластері Kubernetes:

ПортПроцесОпис
443/TCPkube-apiserverПорт API Kubernetes
2379/TCPetcd
6666/TCPetcdetcd
4194/TCPcAdvisorМетрики контейнерів
6443/TCPkube-apiserverПорт API Kubernetes
8443/TCPkube-apiserverПорт API Minikube
8080/TCPkube-apiserverНебезпечний порт API
10250/TCPkubeletHTTPS API, який дозволяє повний доступ
10255/TCPkubeletНеавтентифікований порт HTTP тільки для читання: pod, запущені pod та стан вузла
10256/TCPkube-proxyСервер перевірки стану Kube Proxy
9099/TCPcalico-felixСервер перевірки стану для Calico
6782-4/TCPweaveМетрики та кінцеві точки
30000-32767/TCPNodePortПроксі до сервісів
44134/TCPTillerСлужба Helm, що слухає

Nmap

bash
nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-6784,30000-32767,44134 <pod_ipaddress>/16

Kube-apiserver

Це API Kubernetes сервіс, з яким зазвичай спілкуються адміністратори, використовуючи інструмент kubectl.

Звичайні порти: 6443 та 443, але також 8443 у minikube та 8080 як незахищений.

bash
curl -k https://<IP Address>:(8|6)443/swaggerapi
curl -k https://<IP Address>:(8|6)443/healthz
curl -k https://<IP Address>:(8|6)443/api/v1

Перевірте наступну сторінку, щоб дізнатися, як отримати чутливі дані та виконати чутливі дії, спілкуючись з цим сервісом:

Kubernetes Enumeration

Kubelet API

Цей сервіс працює на кожному вузлі кластера. Це сервіс, який контролює поди всередині вузла. Він спілкується з kube-apiserver.

Якщо ви знайдете цей сервіс відкритим, ви, можливо, виявили неавтентифікований RCE.

Kubelet API

bash
curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods

Якщо відповідь Unauthorized, це означає, що потрібна аутентифікація.

Якщо ви можете перерахувати вузли, ви можете отримати список кінцевих точок kubelets за допомогою:

bash
kubectl get nodes -o custom-columns='IP:.status.addresses[0].address,KUBELET_PORT:.status.daemonEndpoints.kubeletEndpoint.Port' | grep -v KUBELET_PORT | while IFS='' read -r node; do
ip=$(echo $node | awk '{print $1}')
port=$(echo $node | awk '{print $2}')
echo "curl -k --max-time 30 https://$ip:$port/pods"
echo "curl -k --max-time 30 https://$ip:2379/version" #Check  also for etcd
done

kubelet (Тільки для читання)

bash
curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods

etcd API

bash
curl -k https://<IP address>:2379
curl -k https://<IP address>:2379/version
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Tiller

bash
helm --host tiller-deploy.kube-system:44134 version

Ви можете зловживати цим сервісом для ескалації привілеїв всередині Kubernetes:

cAdvisor

Сервіс, корисний для збору метрик.

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

NodePort

Коли порт відкритий на всіх вузлах через NodePort, той самий порт відкривається на всіх вузлах, проксуючи трафік у оголошений Service. За замовчуванням цей порт буде в діапазоні 30000-32767. Тому нові неперевірені сервіси можуть бути доступні через ці порти.

bash
sudo nmap -sS -p 30000-32767 <IP>

Вразливі Неправильні Налаштування

Анонімний Доступ до Kube-apiserver

Анонімний доступ до kube-apiserver API endpoints не дозволено. Але ви можете перевірити деякі кінцеві точки:

Перевірка Анонімного Доступу до ETCD

ETCD зберігає секрети кластера, конфігураційні файли та інші чутливі дані. За замовчуванням ETCD не може бути доступним анонімно, але завжди корисно перевірити.

Якщо до ETCD можна отримати доступ анонімно, вам може знадобитися використати etcdctl інструмент. Наступна команда отримає всі збережені ключі:

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

Kubelet RCE

Документація Kubelet пояснює, що за замовчуванням анонімний доступ до сервісу дозволено:

Дозволяє анонімні запити до сервера Kubelet. Запити, які не відхилені іншим методом аутентифікації, розглядаються як анонімні запити. Анонімні запити мають ім'я користувача system:anonymous та ім'я групи system:unauthenticated

Щоб краще зрозуміти, як працює аутентифікація та авторизація API Kubelet, перегляньте цю сторінку:

Kubelet Authentication & Authorization

API сервісу Kubelet не документовано, але вихідний код можна знайти тут, і знайти відкриті кінцеві точки так само просто, як виконати:

bash
curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/pkg/kubelet/server/server.go | grep 'Path("/'

Path("/pods").
Path("/run")
Path("/exec")
Path("/attach")
Path("/portForward")
Path("/containerLogs")
Path("/runningpods/").

Всі вони звучать цікаво.

Ви можете використовувати Kubeletctl інструмент для взаємодії з Kubelet та їхніми кінцевими точками.

/pods

Ця кінцева точка перераховує поди та їхні контейнери:

bash
kubeletctl pods

/exec

Цей кінцевий пункт дозволяє дуже легко виконувати код всередині будь-якого контейнера:

bash
kubeletctl exec [command]

note

Щоб уникнути цієї атаки, служба kubelet повинна працювати з --anonymous-auth false, а служба повинна бути сегрегована на мережевому рівні.

Перевірка витоку інформації з Kubelet (Тільки для читання)

Коли порт kubelet тільки для читання відкритий, стає можливим отримання інформації з API несанкціонованими особами. Витік цього порту може призвести до розкриття різних елементів конфігурації кластера. Хоча інформація, включаючи імена подів, місця розташування внутрішніх файлів та інші конфігурації, може не бути критично важливою, її витік все ще становить ризик для безпеки і повинен бути уникнутий.

Приклад того, як ця вразливість може бути використана, включає віддаленого атакуючого, який отримує доступ до конкретного URL. Перейшовши за адресою http://<external-IP>:10255/pods, атакуючий може потенційно отримати чутливу інформацію з kubelet:

https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png

Посилання

Kubernetes Pentest Methodology Part 2

Threats & Research Archives - F-Secure Blog

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks