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