Kubernetes Enumeration
Tokeny Kubernetes
Jeśli masz skompromitowany dostęp do maszyny, użytkownik może mieć dostęp do pewnej platformy Kubernetes. Token zwykle znajduje się w pliku wskazywanym przez zmienną środowiskową KUBECONFIG
lub wewnątrz ~/.kube
.
W tej folderze możesz znaleźć pliki konfiguracyjne z tokenami i konfiguracjami do połączenia z serwerem API. W tej folderze możesz również znaleźć folder cache z wcześniej pobranymi informacjami.
Jeśli masz skompromitowany pod w środowisku Kubernetes, istnieją inne miejsca, gdzie można znaleźć tokeny i informacje o bieżącym środowisku K8:
Tokeny konta usługi
Zanim przejdziesz dalej, jeśli nie wiesz, czym jest usługa w Kubernetes, sugeruję, abyś kliknął ten link i przeczytał przynajmniej informacje na temat architektury Kubernetes.
Zaczerpnięte z dokumentacji Kubernetes:
„Podczas tworzenia poda, jeśli nie określisz konta usługi, automatycznie przypisane jest domyślne konto usługi w tej samej przestrzeni nazw.”
ServiceAccount to obiekt zarządzany przez Kubernetes i używany do dostarczania tożsamości dla procesów uruchamianych w podzie. Każde konto usługi ma związany z nim sekret, a ten sekret zawiera token nosiciela. Jest to token 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
zawierają pliki:
ca.crt: To jest 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 przez klucz znajdujący się w pliku sa.key i sprawdzany przez sa.pub.
Domyślna lokalizacja w Kubernetes:
/etc/kubernetes/pki
Domyślna lokalizacja w Minikube:
/var/lib/localkube/certs
Gorące pod
Gorące pod to pod zawierający uprzywilejowany token konta usługi. Uprzywilejowany token konta usługi to token, który ma uprawnienia do wykonywania uprzywilejowanych zadań, takich jak wyświetlanie sekretów, tworzenie podów itp.
RBAC
Jeśli nie wiesz, czym jest RBAC, przeczytaj tę sekcję.
Przegląd wyliczania
Aby wyliczyć środowisko K8s, potrzebujesz kilku rzeczy:
Poprawny token uwierzytelniający. W poprzedniej sekcji zobaczyliśmy, gdzie szukać tokenu użytkownika i tokenu konta usługi.
Adres (https://host:port) 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 potrzebować tego.
Z tymi szczegółami możesz wyliczać Kubernetes. Jeśli API z jakiegoś powodu jest dostępne przez Internet, możesz po prostu pobrać te informacje i wyliczać platformę z własnego hosta.
Jednak zwykle serwer API znajduje się w sieci wewnętrznej, dlatego będziesz musiał utworzyć tunel przez skompromitowaną maszynę, aby uzyskać do niego dostęp z własnej maszyny, lub możesz przesłać binarny plik kubectl, lub użyć curl/wget/cokolwiek
do wykonywania surowych żądań HTTP do serwera API.
Różnice między czasownikami list
a get
list
a get
Z 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 w celu wylistowania danego typu zasobu (opcja get
w poleceniu kubectl
):
Jeśli masz uprawnienie watch
, możesz wykonywać żądania API w celu monitorowania zasobów:
Otwierają połączenie strumieniowe, które zwraca pełny manifest Deployment za każdym razem, gdy się zmienia (lub gdy tworzony jest nowy).
Następujące polecenia kubectl
wskazują tylko, jak wyświetlić obiekty. Jeśli chcesz uzyskać dostęp do danych, musisz użyć describe
zamiast get
.
Używając curl
Z wnętrza poda można użyć kilku zmiennych środowiskowych:
Domyślnie pod może uzyskać dostęp do serwera kube-api pod adresem domeny kubernetes.default.svc
, a sieć kube można zobaczyć w /etc/resolv.config
, gdzie znajduje się adres serwera DNS Kubernetes (".1" z tego samego zakresu to punkt końcowy kube-api).
Używając kubectl
Mając token i adres serwera API, możesz go uzyskać za pomocą kubectl lub curl, jak wskazano tutaj:
Domyślnie, APISERVER komunikuje się za pomocą schematu https://
jeśli brak
https://
w adresie URL, możesz otrzymać błąd typu Bad Request.
Możesz znaleźć oficjalny arkusz oszustw kubectl tutaj. Celem poniższych sekcji jest przedstawienie w uporządkowany sposób różnych opcji do wyliczenia 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 - Proxyfikacja kubectl
Aktualna konfiguracja
Jeśli udało Ci się ukraść dane uwierzytelniające użytkowników, możesz skonfigurować je lokalnie używając czegoś takiego jak:
Pobierz obsługiwane zasoby
Dzięki tym informacjom będziesz wiedział, jakie usługi możesz wymienić
Uzyskaj bieżące uprawnienia
Uruchom polecenie kubectl auth can-i '*' '*'
aby sprawdzić, czy masz uprawnienia do wykonania dowolnej operacji na dowolnym zasobie w klastrze Kubernetes. Jeśli otrzymasz odpowiedź yes
, oznacza to, że masz pełne uprawnienia. W przeciwnym razie, otrzymasz odpowiedź no
lub unknown
, co oznacza, że nie masz pełnych uprawnień.
API
Inny sposób na sprawdzenie swoich uprawnień to użycie narzędzia: https://github.com/corneliusweig/rakkess****
Więcej informacji na temat Kubernetes RBAC można znaleźć w:
pageKubernetes Role-Based Access Control(RBAC)Gdy już wiesz, jakie masz uprawnienia, sprawdź następującą stronę, aby dowiedzieć się, czy można je wykorzystać do eskalacji uprawnień:
pageAbusing Roles/ClusterRoles in KubernetesUzyskaj inne role
API
Uzyskaj przestrzenie nazw
Kubernetes obsługuje wiele wirtualnych klastrów opartych na tym samym fizycznym klastrze. Te wirtualne klastry nazywane są przestrzeniami nazw.
Jeśli możesz odczytać tajemnice, możesz użyć poniższych linii, aby uzyskać uprawnienia związane z każdym tokenem:
Pobierz konta usług
Jak omówiono na początku tej strony, podczas uruchamiania poda zwykle przypisywane jest konto usługi. Dlatego też, wylistowanie kont usług, ich uprawnień i miejsca, w którym są uruchamiane, może umożliwić użytkownikowi eskalację uprawnień.
API
Pobierz wdrożenia
Wdrożenia określają komponenty, które muszą być uruchomione.
API
Pobierz Pods
Pods to rzeczywiste kontenery, które zostaną uruchomione.
API
Uzyskaj usługi
Usługi Kubernetes są używane do udostępniania usługi na określonym porcie i adresie IP (które będą działać jako równoważnik obciążenia dla podów, które faktycznie oferują usługę). Jest to interesujące, aby wiedzieć, gdzie można znaleźć inne usługi, które można próbować zaatakować.
API
Pobierz węzły
Pobierz wszystkie węzły skonfigurowane wewnątrz klastra.
Uzyskaj DaemonSets
DaeamonSets pozwala upewnić się, że konkretny pod działa na wszystkich węzłach klastra (lub na wybranych). Jeśli usuniesz DaemonSet, zarządzane przez niego pody również zostaną usunięte.
API
Uzyskaj cronjob
Cron joby pozwalają na zaplanowanie uruchomienia poda, który wykona określone działanie, korzystając z składni crontab.
API
Uzyskaj configMap
configMap zawsze zawiera wiele informacji i plików konfiguracyjnych, które są dostarczane aplikacjom uruchamianym w klastrze Kubernetes. Zazwyczaj można znaleźć wiele haseł, sekretów i tokenów, które są używane do łączenia i uwierzytelniania w innych usługach wewnętrznych/zewnętrznych.
Uzyskaj dane o zużyciu zasobów przez Pods
Ucieczka z pojemnika
Jeśli masz możliwość tworzenia nowych pojemników, możesz spróbować uciec z nich do węzła. Aby to zrobić, musisz utworzyć nowy pojemnik za pomocą pliku yaml, przełączyć się na utworzony pojemnik, a następnie użyć polecenia chroot, aby wejść do systemu węzła. Możesz użyć istniejących już pojemników jako odniesienia dla pliku yaml, ponieważ wyświetlają istniejące obrazy i ścieżki.
Jeśli potrzebujesz utworzyć pod na konkretnym węźle, możesz użyć poniższej komendy, aby uzyskać etykiety na węźle
k get nodes --show-labels
Zwykle, kubernetes.io/hostname i node-role.kubernetes.io/master są dobrymi etykietami do wyboru.
Następnie utwórz plik attack.yaml
Następnie tworzysz pod.
Teraz możesz przełączyć się do utworzonego poda, postępując w następujący sposób:
I na koniec chrootujesz się do systemu węzła
Informacje uzyskane z: Kubernetes Namespace Breakout using Insecure Host Path Volume — Part 1 Atakowanie i obrona Kubernetes: Bust-A-Kube – Odcinek 1
Odwołania
Last updated