Pentesting Kubernetes Services
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
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.
Znajdowanie wystawionych 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 poszukiwanie plików YAML zawierających ten ciąg.
Jak Kubernetes Wystawia Usługi
Może być przydatne, aby zrozumieć, jak Kubernetes może wystawiać usługi publicznie, aby je znaleźć:
Exposing Services in Kubernetes
Znajdowanie wystawionych podów za pomocą skanowania portów
Następujące porty mogą być otwarte w klastrze Kubernetes:
| Port | Proces | Opis |
|---|---|---|
| 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: pody, 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:
Kubelet API
Ten serwis działa na każdym węźle klastra. To serwis, który kontroluje pod w obrębie węzła. 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
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 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 otwarty 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. Anonimowe żądania mają nazwę użytkownika
system:anonymousoraz nazwę grupysystem:unauthenticated
Aby lepiej zrozumieć, jak działa uwierzytelnianie i autoryzacja API Kubelet, sprawdź tę stronę:
Kubelet Authentication & Authorization
API usługi Kubelet nie jest udokumentowane, 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 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 umożliwia bardzo łatwe wykonywanie kodu wewnątrz dowolnego kontenera:
kubeletctl exec [command]
Note
Aby uniknąć tego ataku, usługa kubelet powinna być uruchamiana z
--anonymous-auth false, a usługa powinna być segregowana na poziomie sieci.
Sprawdzanie ekspozycji informacji z Kubelet (port tylko do odczytu)
Gdy port kubelet tylko do odczytu jest wystawiony, możliwe jest uzyskanie informacji z API przez nieautoryzowane strony. Ekspozycja 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 ekspozycja nadal stanowi ryzyko bezpieczeństwa i powinna być unikana.
Przykład, jak ta luka może być wykorzystana, polega na zdalnym ataku, który 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
Kubernetes Pentest Methodology Part 2
https://labs.f-secure.com/blog/attacking-kubernetes-through-kubelet
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

