Pentesting Kubernetes Services

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Kubernetes, İnternet'e açık veya bir pod'u ele geçirdikten sonra iç ağda bulabileceğiniz birkaç özel ağ hizmeti kullanır.

OSINT ile Açığa Çıkarılmış Podları Bulma

Bir yol, kubernetes ile ilgili alt alanları bulmak için crt.sh üzerinde Identity LIKE "k8s.%.com" araması yapmaktır. Başka bir yol, github'da "k8s.%.com" araması yapmak ve dizeyi içeren YAML dosyalarını aramaktır.

Kubernetes Hizmetlerini Nasıl Açığa Çıkarır

Hizmetleri genel olarak açığa çıkarabilen Kubernetes'in nasıl çalıştığını anlamanız faydalı olabilir:

Exposing Services in Kubernetes

Port Taraması ile Açığa Çıkarılmış Podları Bulma

Bir Kubernetes kümesinde aşağıdaki portlar açık olabilir:

PortProcessAçıklama

443/TCP

kube-apiserver

Kubernetes API bağlantı noktası

2379/TCP

etcd

6666/TCP

etcd

etcd

4194/TCP

cAdvisor

Konteyner metrikleri

6443/TCP

kube-apiserver

Kubernetes API bağlantı noktası

8443/TCP

kube-apiserver

Minikube API bağlantı noktası

8080/TCP

kube-apiserver

Güvensiz API bağlantı noktası

10250/TCP

kubelet

Tam erişim izni veren HTTPS API'si

10255/TCP

kubelet

Kimlik doğrulamasız salt okunur HTTP bağlantı noktası: podlar, çalışan podlar ve düğüm durumu

10256/TCP

kube-proxy

Kube Proxy sağlık kontrol sunucusu

9099/TCP

calico-felix

Calico için sağlık kontrol sunucusu

6782-4/TCP

weave

Metrikler ve uç noktalar

30000-32767/TCP

NodePort

Hizmetlere proxy yapar

44134/TCP

Tiller

Helm hizmeti dinleme

Nmap

nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-6784,30000-32767,44134 <pod_ipaddress>/16

Kube-apiserver

Bu, genellikle kubectl aracını kullanarak yöneticilerin iletişim kurduğu API Kubernetes hizmetidir.

Yaygın portlar: 6443 ve 443, ancak minikube'da 8443 ve güvensiz olarak 8080 de kullanılır.

curl -k https://<IP Address>:(8|6)443/swaggerapi
curl -k https://<IP Address>:(8|6)443/healthz
curl -k https://<IP Address>:(8|6)443/api/v1

Bu hizmetin hassas verilere erişmek ve hassas işlemleri gerçekleştirmek için nasıl kullanıldığını öğrenmek için aşağıdaki sayfayı kontrol edin:

Kubernetes Enumeration

Kubelet API

Bu hizmet, kümenin her düğümünde çalışır. Bu, düğüm içindeki podları kontrol eden hizmettir. kube-apiserver ile iletişim kurar.

Bu hizmetin açığa çıktığını bulursanız, kimlik doğrulaması yapılmamış RCE bulmuş olabilirsiniz.

Kubelet API

curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods

Eğer yanıt Unauthorized ise kimlik doğrulama gerektirir.

Eğer düğümleri listeleyebiliyorsanız, kubelet uç noktalarının bir listesini alabilirsiniz:

kubectl get nodes -o custom-columns='IP:.status.addresses[0].address,KUBELET_PORT:.status.daemonEndpoints.kubeletEndpoint.Port' | grep -v KUBELET_PORT | while IFS='' read -r node; do
ip=$(echo $node | awk '{print $1}')
port=$(echo $node | awk '{print $2}')
echo "curl -k --max-time 30 https://$ip:$port/pods"
echo "curl -k --max-time 30 https://$ip:2379/version" #Check  also for etcd
done

kubelet (Sadece Okuma)

Kubelet, Kubernetes düğümlerinde çalışan bir bileşendir. Kubelet, Kubernetes API'sine kaydolur ve Kubernetes kontrol düzlemi tarafından verilen talimatları uygular. Kubelet, düğümde çalışan pod'ları yönetir ve pod'ların durumunu izler.

Kubelet, düğümdeki pod'ların durumunu ve kaynak kullanımını izlemek için çeşitli API'leri sağlar. Bu API'ler aracılığıyla, kubelet, pod'ların çalışma zamanı bilgilerine erişebilir ve bu bilgileri Kubernetes API'sine rapor edebilir.

Kubelet, pod'ların çalışma zamanı bilgilerini /stats/summary ve /stats/container gibi API rotaları aracılığıyla sunar. Bu API rotaları, pod'ların CPU kullanımı, bellek kullanımı, ağ istatistikleri ve diğer performans metriklerini içerir.

Kubelet, sadece okuma izinlerine sahip olduğu için, bu API rotaları aracılığıyla sadece pod'ların durumunu ve kaynak kullanımını izleyebilir. Kubelet, pod'ların yapılandırmasını veya diğer Kubernetes bileşenlerini değiştiremez.

Bu nedenle, bir saldırganın kubelet üzerinde sadece okuma izinleri olduğunda, pod'ların durumunu ve kaynak kullanımını izlemek dışında herhangi bir etkileşimde bulunması mümkün değildir.

curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods

etcd API

etcd, Kubernetes'in altında çalışan bir veritabanıdır ve Kubernetes kümesinin durumunu ve yapılandırmasını depolar. etcd API, etcd sunucusuna erişmek için kullanılan bir RESTful API'dir. Bu API, etcd veritabanına erişmek, veri okumak, yazmak, güncellemek ve silmek için kullanılabilir.

API Yapısı

etcd API, HTTP üzerinden çalışır ve JSON formatında veri alışverişi yapar. API, çeşitli istekler ve yanıtlar kullanarak etcd veritabanıyla etkileşime geçer.

API İstekleri

etcd API'si, aşağıdaki temel istek türlerini destekler:

  • GET: Belirli bir anahtarın değerini almak için kullanılır.

  • PUT: Bir anahtarın değerini ayarlamak veya güncellemek için kullanılır.

  • DELETE: Bir anahtarı ve değerini silmek için kullanılır.

  • WATCH: Belirli bir anahtarın değişikliklerini izlemek için kullanılır.

  • RANGE: Belirli bir aralıktaki anahtarları listelemek için kullanılır.

API Yanıtları

etcd API'si, aşağıdaki temel yanıt türlerini döndürebilir:

  • GET: Belirli bir anahtarın değerini döndürür.

  • PUT: İşlem başarılıysa "OK" yanıtını döndürür.

  • DELETE: İşlem başarılıysa "OK" yanıtını döndürür.

  • WATCH: Anahtarın değiştiği zaman bir yanıt döndürür.

  • RANGE: Belirli bir aralıktaki anahtarları ve değerlerini döndürür.

API Güvenliği

etcd API'si, kimlik doğrulama ve yetkilendirme için TLS (Transport Layer Security) kullanır. API'ye erişmek için doğru kimlik bilgilerine sahip olmanız gerekir. Ayrıca, API'ye erişimi sınırlamak için ağ düzeyinde güvenlik önlemleri almanız da önemlidir.

API Kullanımı

etcd API'sini kullanarak, etcd veritabanına erişebilir, veri okuyabilir, yazabilir, güncelleyebilir ve silebilirsiniz. API'yi kullanarak Kubernetes kümesinin durumunu ve yapılandırmasını etkileyebilirsiniz. Ancak, bu işlemleri gerçekleştirirken dikkatli olmalı ve gerektiğinde geri alınabilirlik önlemleri almalısınız.

API Hataları

etcd API'si, hataları belirtmek için HTTP durum kodlarını kullanır. Başarılı bir istek durumunda 200 OK dönerken, hatalı bir istek durumunda farklı hata kodları dönebilir. Hata kodları, sorunun doğasını belirtir ve sorunu çözmek için izlenecek adımları belirlemek için kullanılabilir.

curl -k https://<IP address>:2379
curl -k https://<IP address>:2379/version
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Tiller

Tiller, Kubernetes'in sürüm 2.x ve öncesi sürümlerinde kullanılan bir bileşendir. Tiller, Kubernetes cluster'ında çalışan bir serverdır ve Helm aracılığıyla Kubernetes kaynaklarını yönetir. Tiller, Kubernetes API'sine erişim sağlar ve Helm komutlarını çalıştırır.

Tiller, güvenlik açıklarına neden olabilecek birçok risk taşır. Örneğin, varsayılan olarak, Tiller, tüm namespace'lere erişim izni verir ve bu da yetkisiz erişimlere yol açabilir. Ayrıca, Tiller, Kubernetes API'sine tam erişim sağladığından, kötü niyetli bir saldırganın tüm cluster kaynaklarını etkileme potansiyeli vardır.

Tiller'ın güvenliğini sağlamak için aşağıdaki adımları izleyebilirsiniz:

  1. Tiller'ı devre dışı bırakın veya kaldırın: Tiller'ı kullanmıyorsanız, onu devre dışı bırakmanız veya kaldırmanız en güvenli seçenektir.

  2. Tiller'ı sınırlı bir hizmet hesabıyla çalıştırın: Tiller'ı sınırlı bir hizmet hesabıyla çalıştırmak, saldırganların Tiller üzerindeki yetkilerini sınırlar.

  3. Tiller'ı namespace'e sınırlayın: Tiller'ı yalnızca belirli bir namespace ile sınırlamak, yetkisiz erişimleri önler.

  4. Tiller'ı güncel tutun: Tiller'ın güncel sürümünü kullanmak, güvenlik açıklarının en aza indirilmesine yardımcı olur.

  5. Tiller'ı ağ trafiğinden izole edin: Tiller'ı ağ trafiğinden izole etmek, saldırganların Tiller üzerindeki etkisini sınırlar.

Tiller'ın güvenliği, Kubernetes cluster'ınızın güvenliği için önemlidir. Bu adımları izleyerek Tiller'ın güvenliğini artırabilir ve potansiyel saldırılardan korunabilirsiniz.

helm --host tiller-deploy.kube-system:44134 version

Bu hizmeti kullanarak Kubernetes içinde ayrıcalıkları yükseltebilirsiniz:

cAdvisor

Metrikleri toplamak için kullanışlı bir hizmet.

curl -k https://<IP Address>:4194

NodePort

Bir bağlantı noktası, tüm düğümlerde bir NodePort aracılığıyla açıldığında, aynı bağlantı noktası tüm düğümlerde açılır ve trafiği belirtilen Servise yönlendirir. Varsayılan olarak, bu bağlantı noktası 30000-32767 aralığındadır. Bu nedenle, kontrol edilmemiş yeni servislere bu bağlantı noktaları üzerinden erişilebilir.

sudo nmap -sS -p 30000-32767 <IP>

Zayıf Yapılandırmalar

Kube-apiserver Anonim Erişim

kube-apiserver API uç noktalarına anonim erişim izin verilmez. Ancak bazı uç noktaları kontrol edebilirsiniz:

ETCD Anonim Erişim Kontrolü

ETCD, küme sırlarını, yapılandırma dosyalarını ve daha fazla hassas veriyi depolar. Varsayılan olarak, ETCD anonim olarak erişilemez, ancak her zaman kontrol etmek iyidir.

ETCD anonim olarak erişilebilirse, etcdctl araçını kullanmanız gerekebilir. Aşağıdaki komut, depolanan tüm anahtarları alacaktır:

etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only

Kubelet RCE

Kubelet belgeleri varsayılan olarak servise anonim erişime izin verdiğini açıklar:

Kubelet sunucusuna anonim istekleri etkinleştirir. Başka bir kimlik doğrulama yöntemi tarafından reddedilmeyen istekler anonim istekler olarak kabul edilir. Anonim isteklerin kullanıcı adı system:anonymous ve grup adı system:unauthenticated olarak belirlenir.

Kubelet API'sinin kimlik doğrulama ve yetkilendirme nasıl çalıştığını daha iyi anlamak için bu sayfaya bakın:

Kubelet Authentication & Authorization

Kubelet servisinin API'si belgelenmemiştir, ancak kaynak kodu burada bulunabilir ve açığa çıkan uç noktaları bulmak çalıştırmak kadar kolaydır:

curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/pkg/kubelet/server/server.go | grep 'Path("/'

Path("/pods").
Path("/run")
Path("/exec")
Path("/attach")
Path("/portForward")
Path("/containerLogs")
Path("/runningpods/").

Hepsinin hepsi ilginç görünüyor.

Kubeletlerle ve uç noktalarıyla etkileşimde bulunmak için Kubeletctl aracını kullanabilirsiniz.

/pods

Bu uç nokta, pod'ları ve içerdikleri konteynerleri listeler:

kubeletctl pods

/exec

Bu uç nokta, herhangi bir konteyner içinde kodu çok kolay bir şekilde çalıştırmaya olanak sağlar:

kubeletctl exec [command]

Bu saldırıyı önlemek için kubelet servisi --anonymous-auth false ile çalıştırılmalı ve servis ağ düzeyinde ayrıştırılmalıdır.

Kubelet (Sadece Okunabilir Port) Bilgi Sızdırma Kontrolü

Bir kubelet sadece okunabilir port açık olduğunda, yetkisiz kişiler tarafından API'den bilgi alınması mümkün hale gelir. Bu portun açığa çıkması, çeşitli küme yapılandırma unsurlarının ifşa edilmesine yol açabilir. Bilgiler, kapsül adları, iç dosyaların konumu ve diğer yapılandırmalar gibi kritik olmayabilir, ancak ifşa edilmesi hala bir güvenlik riski oluşturur ve kaçınılmalıdır.

Bu zafiyetin nasıl istismar edilebileceğine dair bir örnek, uzaktan bir saldırganın belirli bir URL'ye erişmesini içerir. Saldırgan, http://<external-IP>:10255/pods adresine giderek kubeletten hassas bilgileri alabilir:

Referanslar

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olacak şekilde AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated