Pentesting Kubernetes Services

Support HackTricks

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

Finding exposed pods with OSINT

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

How Kubernetes Exposes Services

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

Exposing Services in Kubernetes

Finding Exposed pods via port scanning

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

PortProcessDescription

443/TCP

kube-apiserver

Порт API Kubernetes

2379/TCP

etcd

6666/TCP

etcd

etcd

4194/TCP

cAdvisor

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

6443/TCP

kube-apiserver

Порт API Kubernetes

8443/TCP

kube-apiserver

Порт API Minikube

8080/TCP

kube-apiserver

Небезпечний порт API

10250/TCP

kubelet

HTTPS API, який дозволяє повний доступ

10255/TCP

kubelet

Неавтентифікований порт HTTP тільки для читання: поди, запущені поди та стан вузла

10256/TCP

kube-proxy

Сервер перевірки стану Kube Proxy

9099/TCP

calico-felix

Сервер перевірки стану для Calico

6782-4/TCP

weave

Метрики та кінцеві точки

30000-32767/TCP

NodePort

Проксі для сервісів

44134/TCP

Tiller

Служба Helm, що слухає

Nmap

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 як незахищений.

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

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

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

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

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 (Тільки для читання)

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

etcd API

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

Tiller

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

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

cAdvisor

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

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

NodePort

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

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

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

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

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

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

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

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

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

Kubelet RCE

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

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

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

Kubelet Authentication & Authorization

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

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

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

kubeletctl pods

/exec

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

kubeletctl exec [command]

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

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

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

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

References

Підтримайте HackTricks

Last updated