Kubernetes Enumeration
Kubernetes Tokens
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:
Service Account Tokens
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
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.
RBAC
Jeśli nie wiesz, co to jest RBAC, przeczytaj tę sekcję.
GUI Applications
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/
Enumeration CheatSheet
Aby enumerować środowisko K8, potrzebujesz kilku rzeczy:
ważny token uwierzytelniający. W poprzedniej sekcji zobaczyliśmy, gdzie szukać tokenu użytkownika i tokenu konta usługi.
adres (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
zkubectl
lub-k
zcurl
, 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.
Differences between list
and get
verbs
list
and get
verbsZ uprawnieniami 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ć 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
Używając curl
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 sieci to punkt końcowy kube-api).
Używanie kubectl
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
MitM kubectl - Proxyfying kubectl
Aktualna konfiguracja
Jeśli udało ci się ukraść dane logowania niektórych użytkowników, możesz skonfigurować je lokalnie za pomocą czegoś takiego jak:
Uzyskaj obsługiwane zasoby
Dzięki tym informacjom będziesz wiedzieć, wszystkie usługi, które możesz wylistować
Uzyskaj bieżące uprawnienia
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 KubernetesUzyskaj role innych
Pobierz przestrzenie nazw
Kubernetes wspiera wiele wirtualnych klastrów opartych na tym samym fizycznym klastrze. Te wirtualne klastry nazywane są przestrzeniami nazw.
Uzyskaj sekrety
Jeśli możesz odczytać sekrety, możesz użyć następujących linii, aby uzyskać uprawnienia związane z każdym tokenem:
Uzyskaj konta serwisowe
Jak omówiono na początku tej strony gdy pod jest uruchamiany, zazwyczaj przypisywane jest do niego konto serwisowe. Dlatego wylistowanie kont serwisowych, ich uprawnień i miejsc, w których działają, może umożliwić użytkownikowi eskalację uprawnień.
Pobierz wdrożenia
Wdrożenia określają komponenty, które muszą być uruchomione.
Pobierz Podsy
Podsy to rzeczywiste kontenery, które będą uruchamiane.
Uzyskaj usługi
Kubernetes usługi są używane do ekspozycji 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 węzły
Pobierz wszystkie węzły skonfigurowane w klastrze.
Pobierz DaemonSets
DaeamonSets pozwala zapewnić, że konkretny pod działa na wszystkich węzłach klastra (lub na wybranych). Jeśli usuniesz DaemonSet, pod'y nim zarządzane również zostaną usunięte.
Pobierz cronjob
Cron jobs pozwalają na zaplanowanie uruchomienia poda, który wykona jakąś akcję, przy użyciu składni podobnej do crontab.
Pobierz configMap
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.
Uzyskaj polityki sieciowe / Polityki sieciowe Cilium
Pobierz wszystko / Wszystko
Pobierz wszystkie zasoby zarządzane przez helm
Uzyskaj zużycie Podów
Ucieczka z poda
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
Odniesienia
Last updated