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)
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 KubernetesZnajdowanie odsłoniętych podów poprzez skanowanie 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 | 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
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.
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 EnumerationInterfejs 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
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ą:
kubelet (Tylko do odczytu)
Interfejs API etcd
Tiller
Możesz wykorzystać ten serwis do eskalacji uprawnień wewnątrz Kubernetes:
cAdvisor
Usługa przydatna do zbierania metryk.
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.
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:
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ę grupysystem:unauthenticated
.
Aby lepiej zrozumieć, jak działa uwierzytelnianie i autoryzacja interfejsu API Kubelet, sprawdź tę stronę:
Kubelet Authentication & AuthorizationUsł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:
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:
/exec
Ten punkt końcowy pozwala łatwo wykonywać kod wewnątrz dowolnego kontenera:
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:
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)
Last updated