Pentesting Kubernetes Services

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

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

Пошук відкритих підсистем за допомогою OSINT

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

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

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

Exposing 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

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

Kubernetes Enumeration

API Kubelet

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

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

API Kubelet

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

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

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

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

API etcd

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

RCE Kubelet

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

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

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

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

/pods

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

kubeletctl pods

/exec

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

kubeletctl exec [command]

Для уникнення цього атаки службу 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

References

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

Last updated