Kubernetes Enumeration
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jeśli masz skompromitowany dostęp do maszyny, użytkownik może mieć dostęp do jakiejś platformy Kubernetes. Token zazwyczaj znajduje się w pliku wskazywanym przez env var KUBECONFIG
lub w ~/.kube
.
W tym folderze możesz znaleźć pliki konfiguracyjne z tokenami i konfiguracjami do połączenia z serwerem API. W tym folderze możesz również znaleźć folder cache z informacjami wcześniej pobranymi.
Jeśli skompromitowałeś pod w środowisku Kubernetes, są inne miejsca, gdzie możesz znaleźć tokeny i informacje o bieżącym środowisku K8:
Zanim przejdziesz dalej, jeśli nie wiesz, co to jest usługa w Kubernetes, sugeruję przeczytać przynajmniej informacje o architekturze Kubernetes.
Z dokumentacji Kubernetes dokumentacja:
„Kiedy tworzysz pod, jeśli nie określisz konta usługi, automatycznie przypisywane jest domyślne konto usługi w tej samej przestrzeni nazw.”
ServiceAccount to obiekt zarządzany przez Kubernetes, używany do zapewnienia tożsamości dla procesów działających w podzie. Każde konto usługi ma z nim powiązany sekret, a ten sekret zawiera token dostępu. Jest to JSON Web Token (JWT), metoda reprezentowania roszczeń w sposób bezpieczny między dwiema stronami.
Zazwyczaj jeden z katalogów:
/run/secrets/kubernetes.io/serviceaccount
/var/run/secrets/kubernetes.io/serviceaccount
/secrets/kubernetes.io/serviceaccount
zawiera pliki:
ca.crt: To certyfikat CA do sprawdzania komunikacji Kubernetes
namespace: Wskazuje bieżącą przestrzeń nazw
token: Zawiera token usługi bieżącego poda.
Teraz, gdy masz token, możesz znaleźć serwer API w zmiennej środowiskowej KUBECONFIG
. Aby uzyskać więcej informacji, uruchom (env | set) | grep -i "kuber|kube
"
Token konta usługi jest podpisywany kluczem znajdującym się w pliku sa.key i weryfikowany przez sa.pub.
Domyślna lokalizacja w Kubernetes:
/etc/kubernetes/pki
Domyślna lokalizacja w Minikube:
/var/lib/localkube/certs
Hot pods to pod, które zawierają token konta usługi z uprawnieniami. Token konta usługi z uprawnieniami to token, który ma pozwolenie na wykonywanie uprzywilejowanych zadań, takich jak wyświetlanie sekretów, tworzenie podów itp.
Jeśli nie wiesz, co to jest RBAC, przeczytaj tę sekcję.
k9s: GUI, które enumeruje klaster Kubernetes z terminala. Sprawdź polecenia w https://k9scli.io/topics/commands/. Napisz :namespace
i wybierz wszystko, aby następnie wyszukać zasoby we wszystkich przestrzeniach nazw.
k8slens: Oferuje kilka dni próbnych: https://k8slens.dev/
Aby enumerować środowisko K8s, potrzebujesz kilku rzeczy:
ważnego tokena uwierzytelniającego. W poprzedniej sekcji zobaczyliśmy, gdzie szukać tokena użytkownika i tokena konta usługi.
adresu (https://host:port) serwera API Kubernetes. Zazwyczaj można go znaleźć w zmiennych środowiskowych i/lub w pliku konfiguracyjnym kube.
Opcjonalnie: ca.crt do weryfikacji serwera API. Można go znaleźć w tych samych miejscach, w których można znaleźć token. Jest to przydatne do weryfikacji certyfikatu serwera API, ale używając --insecure-skip-tls-verify
z kubectl
lub -k
z curl
, nie będziesz tego potrzebować.
Mając te szczegóły, możesz enumerować Kubernetes. Jeśli API z jakiegoś powodu jest dostępne przez Internet, możesz po prostu pobrać te informacje i enumerować platformę z własnego hosta.
Jednak zazwyczaj serwer API znajduje się w wewnętrznej sieci, dlatego będziesz musiał utworzyć tunel przez skompromitowaną maszynę, aby uzyskać do niego dostęp z własnej maszyny, lub możesz przesłać kubectl binarny, lub użyć curl/wget/cokolwiek
do wykonywania surowych żądań HTTP do serwera API.
list
and get
verbsDzięki uprawnieniom get
możesz uzyskać dostęp do informacji o konkretnych zasobach (opcja describe
w kubectl
) API:
Jeśli masz uprawnienie list
, możesz wykonywać żądania API, aby wylistować dany typ zasobu (get
opcja w kubectl
):
Jeśli masz uprawnienia watch
, możesz wykonywać żądania API w celu monitorowania zasobów:
Otwierają połączenie strumieniowe, które zwraca pełny manifest Deploymentu za każdym razem, gdy się zmienia (lub gdy zostaje utworzony nowy).
Następujące polecenia kubectl
wskazują, jak wylistować obiekty. Jeśli chcesz uzyskać dostęp do danych, musisz użyć describe
zamiast get
Z wnętrza poda możesz użyć kilku zmiennych środowiskowych:
Domyślnie pod może uzyskać dostęp do serwera kube-api w nazwie domeny kubernetes.default.svc
i możesz zobaczyć sieć kube w /etc/resolv.config
, ponieważ tutaj znajdziesz adres serwera DNS kubernetes (".1" z tej samej puli to punkt końcowy kube-api).
Mając token i adres serwera API, używasz kubectl lub curl, aby uzyskać do niego dostęp, jak wskazano tutaj:
Domyślnie, APISERVER komunikuje się z schematem https://
jeśli nie ma
https://
w adresie URL, możesz otrzymać błąd podobny do Bad Request.
Możesz znaleźć oficjalną ściągawkę kubectl tutaj. Celem poniższych sekcji jest przedstawienie w uporządkowany sposób różnych opcji do enumeracji i zrozumienia nowego K8s, do którego uzyskałeś dostęp.
Aby znaleźć żądanie HTTP, które wysyła kubectl
, możesz użyć parametru -v=8
Jeśli udało ci się ukraść dane logowania niektórych użytkowników, możesz skonfigurować je lokalnie używając czegoś takiego jak:
Dzięki tym informacjom będziesz wiedzieć, wszystkie usługi, które możesz wylistować
Innym sposobem na sprawdzenie swoich uprawnień jest użycie narzędzia: https://github.com/corneliusweig/rakkess****
Możesz dowiedzieć się więcej o Kubernetes RBAC w:
Kubernetes Role-Based Access Control(RBAC)Gdy już wiesz, jakie uprawnienia posiadasz, sprawdź następującą stronę, aby dowiedzieć się czy możesz je wykorzystać do eskalacji uprawnień:
Abusing Roles/ClusterRoles in KubernetesKubernetes wspiera wiele wirtualnych klastrów opartych na tym samym fizycznym klastrze. Te wirtualne klastry nazywane są przestrzeniami nazw.
Jeśli możesz odczytać sekrety, możesz użyć następujących linii, aby uzyskać uprawnienia związane z każdym tokenem:
Jak omówiono na początku tej strony gdy pod jest uruchamiany, zazwyczaj przypisywane jest mu konto serwisowe. Dlatego wylistowanie kont serwisowych, ich uprawnień i miejsc, w których działają, może umożliwić użytkownikowi eskalację uprawnień.
Wdrożenia określają komponenty, które muszą być uruchomione.
Podsy to rzeczywiste kontenery, które będą uruchamiane.
Kubernetes usługi są używane do udostępniania usługi na określonym porcie i IP (które będą działać jako load balancer dla podów, które faktycznie oferują usługę). To jest interesujące, aby wiedzieć, gdzie można znaleźć inne usługi, aby spróbować zaatakować.
Pobierz wszystkie węzły skonfigurowane w klastrze.
DaeamonSets pozwala zapewnić, że konkretny pod działa na wszystkich węzłach klastra (lub na wybranych). Jeśli usuniesz DaemonSet, pod'y przez niego zarządzane również zostaną usunięte.
Cron jobs pozwalają na zaplanowanie uruchomienia poda, który wykona jakąś akcję, przy użyciu składni podobnej do crontab.
configMap zawsze zawiera wiele informacji i plików konfiguracyjnych, które są dostarczane do aplikacji działających w Kubernetes. Zwykle można znaleźć wiele haseł, sekretów, tokenów, które są używane do łączenia się i weryfikacji z innymi wewnętrznymi/zewnętrznymi usługami.
Jeśli jesteś w stanie tworzyć nowe pody, możesz być w stanie uciec z nich do węzła. Aby to zrobić, musisz stworzyć nowy pod za pomocą pliku yaml, przełączyć się do utworzonego poda, a następnie wykonać chroot do systemu węzła. Możesz użyć już istniejących podów jako odniesienia do pliku yaml, ponieważ wyświetlają one istniejące obrazy i ścieżki.
jeśli musisz utworzyć pod na konkretnym węźle, możesz użyć następującego polecenia, aby uzyskać etykiety na węźle
k get nodes --show-labels
Zwykle kubernetes.io/hostname i node-role.kubernetes.io/master to dobre etykiety do wyboru.
Następnie tworzysz swój plik attack.yaml
Po tym tworzysz pod.
Teraz możesz przełączyć się na utworzony pod w następujący sposób
A na koniec chrootujesz do systemu węzła.
Informacje uzyskane z: Kubernetes Namespace Breakout using Insecure Host Path Volume — Part 1 Attacking and Defending Kubernetes: Bust-A-Kube – Episode 1
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)