Pentesting Kubernetes Services
Last updated
Last updated
Kubernetes, İnternet'e açık veya bir pod'u ele geçirdikten sonra iç ağda bulabileceğiniz birkaç özel ağ hizmeti kullanır.
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.
Hizmetleri genel olarak açığa çıkarabilen Kubernetes'in nasıl çalıştığını anlamanız faydalı olabilir:
Bir Kubernetes kümesinde aşağıdaki portlar açık olabilir:
Port | Process | Açıklama |
---|---|---|
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.
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:
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.
Eğer yanıt Unauthorized
ise kimlik doğrulama gerektirir.
Eğer düğümleri listeleyebiliyorsanız, kubelet uç noktalarının bir listesini alabilirsiniz:
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.
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.
Tiller'ı namespace'e sınırlayın: Tiller'ı yalnızca belirli bir namespace ile sınırlamak, yetkisiz erişimleri önler.
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.
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.
Bu hizmeti kullanarak Kubernetes içinde ayrıcalıkları yükseltebilirsiniz:
Metrikleri toplamak için kullanışlı bir hizmet.
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.
kube-apiserver API uç noktalarına anonim erişim izin verilmez. Ancak bazı uç noktaları kontrol edebilirsiniz:
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:
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 servisinin API'si belgelenmemiştir, ancak kaynak kodu burada bulunabilir ve açığa çıkan uç noktaları bulmak çalıştırmak kadar kolaydır:
Hepsinin hepsi ilginç görünüyor.
Kubeletlerle ve uç noktalarıyla etkileşimde bulunmak için Kubeletctl aracını kullanabilirsiniz.
Bu uç nokta, pod'ları ve içerdikleri konteynerleri listeler:
Bu uç nokta, herhangi bir konteyner içinde kodu çok kolay bir şekilde çalıştırmaya olanak sağlar:
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.
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:
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