Pentesting Kubernetes Services
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 github i szukanie plików YAML zawierających ten ciąg.
Jak Kubernetes Odsłania Usługi
Może być przydatne zrozumienie, w jaki sposób Kubernetes może odsłaniać usługi publicznie, aby je znaleźć:
pageExposing 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 za pomocą narzędzia kubectl
.
Typowe porty: 6443 i 443, ale także 8443 w minikube oraz 8080 jako niezabezpieczony.
Sprawdź następującą stronę, aby dowiedzieć się, jak uzyskać poufne dane i wykonać czynności wymagające uprawnień w komunikacji z tym usługą:
pageKubernetes EnumerationKubelet API
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.
Kubelet API
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 niezweryfikowane usługi mogą być dostępne za pomocą tych portów.
Wrażliwe błędy konfiguracyjne
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 dane wrażliwe. Domyślnie nie można uzyskać anonimowego dostępu do ETCD, 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:
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 inny sposób uwierzytelniania, są traktowane jako żądania anonimowe. Żądania anonimowe mają nazwę użytkownika
system:anonymous
i nazwę grupysystem:unauthenticated
.
Aby lepiej zrozumieć, jak działa uwierzytelnianie i autoryzacja interfejsu API Kuebelet, sprawdź tę stronę:
pageKubelet Authentication & AuthorizationAPI 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:
Możesz użyć narzędzia Kubeletctl, aby komunikować się 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 flagą --anonymous-auth false
, a usługa powinna być odseparowana 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, takie jak nazwy podów, lokalizacje wewnętrznych plików 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 pod http://<zewnętrzny-IP>:10255/pods
, atakujący może potencjalnie pozyskać wrażliwe informacje z kubelet:
Referencje
Last updated