Kubernetes Network Attacks
Wprowadzenie
W Kubernetes obserwuje się, że domyślne zachowanie pozwala na nawiązywanie połączeń między wszystkimi kontenerami znajdującymi się na tym samym węźle. Dotyczy to niezależnie od różnic w przestrzeniach nazw. Taka łączność sięga aż do warstwy 2 (Ethernet). W rezultacie taka konfiguracja potencjalnie naraża system na podatności. Konkretnie otwiera możliwość dla złośliwego kontenera wykonania ataku ARP spoofing na inne kontenery znajdujące się na tym samym węźle. Podczas takiego ataku złośliwy kontener może podstępnie przechwycić lub zmodyfikować ruch sieciowy przeznaczony dla innych kontenerów.
Ataki ARP spoofing polegają na wysyłaniu fałszywych wiadomości ARP (Address Resolution Protocol) w lokalnej sieci. Powoduje to powiązanie adresu MAC atakującego z adresem IP prawidłowego komputera lub serwera w sieci. Po pomyślnym wykonaniu takiego ataku, atakujący może przechwycić, zmodyfikować lub nawet zatrzymać dane w trakcie przesyłania. Atak jest wykonywany na warstwie 2 modelu OSI, dlatego domyślne połączenie w Kubernetes na tej warstwie budzi obawy dotyczące bezpieczeństwa.
W scenariuszu zostaną utworzone 4 maszyny:
ubuntu-pe: Maszyna uprzywilejowana do ucieczki do węzła i sprawdzenia metryk (nie jest potrzebna do ataku)
ubuntu-attack: Złośliwy kontener w domyślnej przestrzeni nazw
ubuntu-victim: Maszyna ofiara w przestrzeni nazw kube-system
mysql: Maszyna ofiara w domyślnej przestrzeni nazw
Podstawowa sieć Kubernetes
Jeśli chcesz uzyskać więcej szczegółów na temat omawianych tutaj tematów dotyczących sieci, przejdź do odnośników.
ARP
Ogólnie rzecz biorąc, sieć pod-do-pod wewnątrz węzła jest dostępna za pośrednictwem mostu, który łączy wszystkie pody. Ten most nazywa się "cbr0". (Niektóre wtyczki sieciowe zainstalują swój własny most.) cbr0 może również obsługiwać rozwiązanie ARP (protokół rozwiązywania adresów). Gdy przychodzi pakiet do cbr0, może on rozwiązać docelowy adres MAC za pomocą ARP.
Fakt ten oznacza, że domyślnie każdy pod działający w tym samym węźle będzie mógł komunikować się z dowolnym innym podem w tym samym węźle (niezależnie od przestrzeni nazw) na poziomie Ethernetu (warstwa 2).
Dlatego możliwe jest przeprowadzenie ataków ARP Spoofing między podami w tym samym węźle.
DNS
W środowiskach Kubernetes zazwyczaj znajdziesz 1 (lub więcej) uruchomione usługi DNS zwykle w przestrzeni nazw kube-system:
W poprzednich informacjach można zauważyć coś interesującego, IP usługi to 10.96.0.10, ale IP poda uruchamiającego usługę to 172.17.0.2.
Jeśli sprawdzisz adres DNS wewnątrz dowolnego poda, znajdziesz coś takiego:
Jednakże, pods nie wie, jak dotrzeć do tego adresu, ponieważ zakres pods w tym przypadku to 172.17.0.10/26.
Dlatego też, pods wyśle żądania DNS na adres 10.96.0.10, który zostanie przetłumaczony przez cbr0 na 172.17.0.2.
Oznacza to, że żądanie DNS pods zawsze będzie przechodzić przez mostek, aby przetłumaczyć adres IP usługi na adres IP punktu końcowego, nawet jeśli serwer DNS znajduje się w tej samej podsieci co pods.
Znając to, i wiedząc, że ataki ARP są możliwe, pods w węźle będą w stanie przechwycić ruch między każdym pods w podsieci a mostkiem i modyfikować odpowiedzi DNS od serwera DNS (DNS Spoofing).
Co więcej, jeśli serwer DNS znajduje się w tym samym węźle co atakujący, atakujący może przechwycić wszystkie żądania DNS dowolnego pods w klastrze (między serwerem DNS a mostkiem) i modyfikować odpowiedzi.
ARP Spoofing w pods w tym samym węźle
Naszym celem jest ukraść przynajmniej komunikację od ubuntu-victim do mysql.
Scapy
ARPSpoof
ARPSpoof jest techniką ataku sieciowego, która polega na podszywaniu się pod inną maszynę w sieci lokalnej. Atakujący wysyła fałszywe pakiety ARP, aby wprowadzić w błąd inne urządzenia w sieci i przekierować ruch sieciowy do swojego komputera. W ten sposób atakujący może przechwycić, modyfikować lub wykradać dane przesyłane między innymi urządzeniami w sieci. Ten rodzaj ataku jest szczególnie skuteczny w sieciach lokalnych, takich jak Kubernetes, gdzie wiele kontenerów działa na tej samej fizycznej maszynie.
DNS Spoofing
Jak już wspomniano, jeśli skompromitujesz pod w tym samym węźle co pod serwera DNS, możesz przeprowadzić atak typu MitM za pomocą ARPSpoofing na mostku i podzie DNS oraz zmieniać wszystkie odpowiedzi DNS.
Masz naprawdę fajne narzędzie i samouczek, aby to przetestować na https://github.com/danielsagi/kube-dnsspoof/
W naszym scenariuszu, pobierz narzędzie na pod atakującego i utwórz plik o nazwie hosts
z domenami, które chcesz podrobić, na przykład:
Przeprowadź atak na maszynę ubuntu-victim:
Jeśli próbujesz stworzyć własny skrypt do przechwytywania DNS, jeśli tylko zmienisz odpowiedź DNS, to nie zadziała, ponieważ odpowiedź będzie miała adres IP źródłowy złośliwego poda i nie zostanie zaakceptowana. Musisz wygenerować nowy pakiet DNS z adresem IP źródłowym DNS, do którego ofiara wysyła żądanie DNS (coś w rodzaju 172.16.0.2, a nie 10.96.0.10, to adres IP usługi DNS K8s, a nie adres IP serwera DNS, więcej na ten temat w wprowadzeniu).
Przechwytywanie ruchu
Narzędzie Mizu to proste, ale potężne narzędzie do przeglądania ruchu API w Kubernetes, które umożliwia wyświetlanie całej komunikacji API między mikroserwisami, pomagając w debugowaniu i rozwiązywaniu problemów związanych z regresją. Zainstaluje ono agenty w wybranych podach, zbierze informacje o ich ruchu i pokaże je w serwerze sieciowym. Jednakże, będziesz potrzebować wysokich uprawnień K8s do tego (i nie jest to zbyt dyskretne).
Odwołania
Last updated