Pentesting Kubernetes Services

Support HackTricks

Kubernetes używa kilku specyficznych usług sieciowych, które możesz znaleźć wystawione na Internet lub w sieci wewnętrznej, gdy już skompromitujesz jeden pod.

Finding exposed pods with OSINT

Jednym ze sposobów może być wyszukiwanie Identity LIKE "k8s.%.com" w crt.sh, aby znaleźć subdomeny związane z kubernetes. Innym sposobem może być wyszukiwanie "k8s.%.com" w githubie i szukanie plików YAML zawierających ten ciąg.

How Kubernetes Exposes Services

Może być przydatne, abyś zrozumiał, jak Kubernetes może wystawiać usługi publicznie, aby je znaleźć:

Exposing Services in Kubernetes

Finding Exposed pods via port scanning

Następujące porty mogą być otwarte w klastrze Kubernetes:

PortProcessDescription

443/TCP

kube-apiserver

Port API Kubernetes

2379/TCP

etcd

6666/TCP

etcd

etcd

4194/TCP

cAdvisor

Metryki kontenerów

6443/TCP

kube-apiserver

Port API Kubernetes

8443/TCP

kube-apiserver

Port API Minikube

8080/TCP

kube-apiserver

Niezabezpieczony port API

10250/TCP

kubelet

HTTPS API, który pozwala na pełny dostęp

10255/TCP

kubelet

Niezautoryzowany port HTTP tylko do odczytu: pod, działające pody i stan węzła

10256/TCP

kube-proxy

Serwer sprawdzania stanu Kube Proxy

9099/TCP

calico-felix

Serwer sprawdzania stanu dla Calico

6782-4/TCP

weave

Metryki i punkty końcowe

30000-32767/TCP

NodePort

Proxy do usług

44134/TCP

Tiller

Usługa Helm nasłuchująca

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

To jest usługa API Kubernetes, z którą administratorzy zazwyczaj komunikują się za pomocą narzędzia kubectl.

Typowe porty: 6443 i 443, ale także 8443 w minikube i 8080 jako nieszyfrowany.

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

Sprawdź następującą stronę, aby dowiedzieć się, jak uzyskać dostęp do wrażliwych danych i wykonywać wrażliwe działania, rozmawiając z tym serwisem:

Kubernetes Enumeration

Kubelet API

Ten serwis działa na każdym węźle klastra. To serwis, który kontroluje podsy w węźle. Komunikuje się z kube-apiserver.

Jeśli znajdziesz ten serwis wystawiony, możesz mieć do czynienia z nieautoryzowanym RCE.

Kubelet API

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

Jeśli odpowiedź to Unauthorized, oznacza to, że wymagana jest autoryzacja.

Jeśli możesz wylistować węzły, możesz uzyskać listę punktów końcowych kubeletów za pomocą:

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 (Tylko do odczytu)

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

Możesz nadużyć tej usługi, aby eskalować uprawnienia w Kubernetes:

cAdvisor

Usługa przydatna do zbierania metryk.

curl -k https://<IP Address>:4194

NodePort

Gdy port jest wystawiony na wszystkich węzłach za pomocą NodePort, ten sam port jest otwarty na wszystkich węzłach, przekierowując ruch do zadeklarowanej Usługi. Domyślnie port ten będzie w zakresie 30000-32767. Tak więc nowe, niekontrolowane usługi mogą być dostępne przez te porty.

sudo nmap -sS -p 30000-32767 <IP>

Wrażliwe błędne konfiguracje

Kube-apiserver Dostęp anonimowy

Dostęp anonimowy do kube-apiserver API endpoints nie jest dozwolony. Ale możesz sprawdzić niektóre punkty końcowe:

Sprawdzanie dostępu anonimowego do ETCD

ETCD przechowuje sekrety klastra, pliki konfiguracyjne i inne wrażliwe dane. Domyślnie ETCD nie może być dostępny anonimowo, ale zawsze warto to sprawdzić.

Jeśli ETCD może być dostępny anonimowo, może być konieczne użycie etcdctl narzędzia. Następujące polecenie pobierze wszystkie przechowywane klucze:

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

Kubelet RCE

Dokumentacja Kubelet wyjaśnia, że domyślnie dostęp anonimowy do usługi jest dozwolony:

Umożliwia anonimowe żądania do serwera Kubelet. Żądania, które nie są odrzucane przez inną metodę uwierzytelniania, są traktowane jako żądania anonimowe. Żądania anonimowe mają nazwę użytkownika system:anonymous oraz nazwę grupy system:unauthenticated

Aby lepiej zrozumieć, jak działa uwierzytelnianie i autoryzacja API Kubelet, sprawdź tę stronę:

Kubelet Authentication & Authorization

Usługa Kubelet API nie jest udokumentowana, ale kod źródłowy można znaleźć tutaj, a znalezienie wystawionych punktów końcowych jest tak proste jak uruchomienie:

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/").

Wszystkie z nich brzmią interesująco.

Możesz użyć narzędzia Kubeletctl do interakcji z Kubeletami i ich punktami końcowymi.

/pods

Ten punkt końcowy wyświetla listę podów i ich kontenerów:

kubeletctl pods

/exec

Ten punkt końcowy pozwala na bardzo łatwe wykonywanie kodu wewnątrz dowolnego kontenera:

kubeletctl exec [command]

Aby uniknąć tego ataku, usługa kubelet powinna być uruchamiana z --anonymous-auth false, a usługa powinna być segregowana na poziomie sieci.

Sprawdzanie ujawnienia informacji z Kubelet (Port tylko do odczytu)

Gdy port kubelet tylko do odczytu jest ujawniony, możliwe jest, aby nieautoryzowane strony uzyskały dostęp do informacji z API. Ujawnienie tego portu może prowadzić do ujawnienia różnych elementów konfiguracji klastra. Chociaż informacje, w tym nazwy podów, lokalizacje plików wewnętrznych i inne konfiguracje, mogą nie być krytyczne, ich ujawnienie nadal stanowi ryzyko bezpieczeństwa i powinno być unikane.

Przykład, jak ta luka może być wykorzystana, polega na tym, że zdalny atakujący uzyskuje dostęp do konkretnego URL. Przechodząc do http://<external-IP>:10255/pods, atakujący może potencjalnie uzyskać wrażliwe informacje z kubelet:

Referencje

Wsparcie dla HackTricks

Last updated