Pentesting Kubernetes Services
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
Kube-apiserver
Це служба API Kubernetes, з якою зазвичай спілкуються адміністратори за допомогою інструменту kubectl
.
Загальні порти: 6443 та 443, а також 8443 у minikube та 8080 як небезпечний.
Перевірте наступну сторінку, щоб дізнатися, як отримати чутливі дані та виконати чутливі дії, спілкуючись з цією службою:
Kubernetes EnumerationAPI Kubelet
Ця служба працює на кожному вузлі кластера. Це служба, яка контролює потоки всередині вузла. Вона спілкується з kube-apiserver.
Якщо ви знайдете цю службу відкритою, ви, можливо, знайшли неаутентифікований RCE.
API Kubelet
Якщо відповідь Unauthorized
, то потрібна аутентифікація.
Якщо ви можете перелічити вузли, ви можете отримати список кінцевих точок kubelet за допомогою:
kubelet (Тільки для читання)
API etcd
Tiller
Тілер
Ви можете зловживати цією службою для підвищення привілеїв всередині Kubernetes:
cAdvisor
Служба, корисна для збору метрик.
NodePort
Коли порт викритий на всіх вузлах через NodePort, той самий порт відкритий на всіх вузлах, що проксіює трафік до зазначеного Service. За замовчуванням цей порт буде в діапазоні 30000-32767. Таким чином, нові невідповідні сервіси можуть бути доступні через ці порти.
Вразливі неправильні конфігурації
Анонімний доступ до Kube-apiserver
Анонімний доступ до API-точок kube-apiserver заборонений. Але ви можете перевірити деякі точки доступу:
Перевірка анонімного доступу до ETCD
ETCD зберігає секрети кластера, файли конфігурації та інші чутливі дані. За замовчуванням, до ETCD не можна отримати доступ анонімно, але завжди корисно перевірити.
Якщо до ETCD можна отримати доступ анонімно, можливо, вам доведеться використовувати інструмент etcdctl. Наступна команда отримає всі збережені ключі:
RCE Kubelet
Документація Kubelet пояснює, що за замовчуванням доступ до служби дозволено анонімно:
Увімкнення анонімних запитів до сервера Kubelet. Запити, які не відхиляються іншим методом аутентифікації, розглядаються як анонімні запити. Анонімні запити мають ім'я користувача
system:anonymous
та назву групиsystem:unauthenticated
Щоб краще зрозуміти, як працює аутентифікація та авторизація API Kubelet, перевірте цю сторінку:
Kubelet Authentication & AuthorizationСервіс API Kubelet не задокументований, але вихідний код можна знайти тут, і знайти відкриті кінцеві точки так само просто, як виконати:
Всі вони звучать цікаво.
Ви можете використовувати інструмент Kubeletctl для взаємодії з Kubelets та їх кінцевими точками.
/pods
Ця кінцева точка перелічує pods та їх контейнери:
/exec
Ця точка доступу дозволяє легко виконувати код всередині будь-якого контейнера:
Для уникнення цього атаки службу kubelet слід запускати з параметром --anonymous-auth false
, а службу слід відокремити на рівні мережі.
Перевірка витоку інформації Kubelet (порт тільки для читання)
Коли викладений порт тільки для читання kubelet, стає можливим отримання інформації з API незаконними сторонами. Викладання цього порту може призвести до розкриття різних елементів конфігурації кластера. Хоча інформація, включаючи назви потоків, місця розташування внутрішніх файлів та інші конфігурації, може бути не критичною, її викладання все одно становить загрозу безпеці і слід уникати.
Прикладом того, як цю вразливість можна використовувати, є доступ до конкретного URL для віддаленого зловмисника. Перейшовши за адресою http://<external-IP>:10255/pods
, зловмисник може потенційно отримати чутливу інформацію від kubelet:
References
Last updated