Pentesting Kubernetes Services

Dowiedz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Dowiedz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Wesprzyj HackTricks

Kubernetes używa kilku konkretnych usług sieciowych, które mogą być odsłonięte w Internecie lub w sieci wewnętrznej po skompromitowaniu jednego z podów.

Znajdowanie odsłoniętych podów za pomocą 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 znaków.

Jak Kubernetes Odsłania Usługi

Może być dla Ciebie przydatne zrozumienie, w jaki sposób Kubernetes może odsłaniać usługi publicznie, aby je znaleźć:

Exposing Services in Kubernetes

Znajdowanie odsłoniętych podów poprzez skanowanie portów

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

PortProcesOpis

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

API HTTPS umożliwiające pełny dostęp

10255/TCP

kubelet

Nieuwierzytelniony port HTTP tylko do odczytu: podów, działających podów i stanu 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ą zazwyczaj rozmawiają administratorzy, korzystając z narzędzia kubectl.

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

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ć poufne dane i wykonać czynności wymagające ostrożności w komunikacji z tym usługą:

Kubernetes Enumeration

Interfejs API Kubelet

Ta usługa działa na każdym węźle klastra. Jest to usługa, która będzie kontrolować pody wewnątrz węzła. Komunikuje się z kube-apiserver.

Jeśli znajdziesz tę usługę wystawioną, możesz natrafić na nieuwierzytelniony RCE.

Interfejs API Kubelet

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

Jeśli odpowiedź brzmi Unauthorized, oznacza to konieczność uwierzytelnienia.

Jeśli możesz wyświetlić listę węzłów, 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

Interfejs 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

Możesz wykorzystać ten serwis do eskalacji uprawnień wewnątrz Kubernetes:

cAdvisor

Usługa przydatna do zbierania metryk.

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

NodePort

Gdy port jest wystawiony we wszystkich węzłach za pomocą NodePort, ten sam port jest otwarty we wszystkich węzłach, przekierowując ruch do zadeklarowanego Service. Domyślnie ten port będzie w zakresie 30000-32767. Dlatego nowe niesprawdzone usługi mogą być dostępne za pośrednictwem tych portów.

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

Wrażliwe błędy konfiguracji

Dostęp anonimowy do kube-apiserver

Dostęp anonimowy do punktów końcowych API kube-apiservera nie jest dozwolony. Jednak można sprawdzić niektóre punkty końcowe:

Sprawdzanie dostępu anonimowego do ETCD

ETCD przechowuje tajne klucze klastra, pliki konfiguracyjne i inne wrażliwe dane. Domyślnie nie można uzyskać do niego dostępu anonimowego, ale zawsze warto to sprawdzić.

Jeśli ETCD można uzyskać anonimowo, może być konieczne użycie narzędzia etcdctl. Poniższe polecenie pobierze wszystkie przechowywane klucze:

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

RCE Kubelet

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 inny sposób uwierzytelniania, są traktowane jako anonimowe żądania. Anonimowe żądania mają nazwę użytkownika system:anonymous i nazwę grupy system:unauthenticated.

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

Kubelet Authentication & Authorization

Usługa API Kubelet nie jest udokumentowana, ale kod źródłowy można znaleźć tutaj, a znalezienie wystawionych punktów końcowych jest tak łatwe 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 one 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 łatwo wykonywać kod wewnątrz dowolnego kontenera:

kubeletctl exec [command]

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

Sprawdzanie Wystawienia Informacji Portu Tylko Do Odczytu Kubelet

Gdy port tylko do odczytu kubelet jest wystawiony, istnieje możliwość pobierania informacji z interfejsu API przez nieautoryzowane strony. Wystawienie 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 wciąż stanowi ryzyko dla bezpieczeństwa i powinno być unikane.

Przykładem wykorzystania tej podatności jest sytuacja, w której zdalny atakujący uzyskuje dostęp do określonego adresu URL. Przechodząc do http://<zewnętrzny-IP>:10255/pods, atakujący może potencjalnie pozyskać wrażliwe informacje z kubelet:

https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png

Referencje

Naucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Naucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Wesprzyj HackTricks

Last updated