Pentesting Kubernetes Services

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Kubernetes використовує кілька конкретних мережевих сервісів, які можуть бути відкриті для Інтернету або внутрішньої мережі після того, як ви скомпрометували один під.

Пошук відкритих підключень до OSINT

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

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

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

pageExposing Services in Kubernetes

Пошук відкритих підключень через сканування портів

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

ПортПроцесОпис

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

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

pageKubernetes Enumeration

API Kubelet

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

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

API Kubelet

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

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

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

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

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

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

Вразливість Kubelet RCE

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

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

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

pageKubelet Authentication & Authorization

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

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 для взаємодії з Kubelets та їхніми кінцевими точками.

/pods

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

kubeletctl pods

/exec

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

kubeletctl exec [command]

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

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

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

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

References

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated