Pentesting Kubernetes Services
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 KubernetesPort Taraması ile Açığa Çıkarılmış Podları Bulma
Bir Kubernetes kümesinde aşağıdaki portlar açık olabilir:
Port | Process | Açı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
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.
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 EnumerationKubelet 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
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 (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.
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.
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:
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:
cAdvisor
Metrikleri toplamak için kullanışlı bir hizmet.
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.
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:
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 & AuthorizationKubelet 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.
/pods
Bu uç nokta, pod'ları ve içerdikleri konteynerleri listeler:
/exec
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.
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
Last updated