Kubernetes Enumeration
Kubernetes Tokens
यदि आपने किसी मशीन की पहुंच को समझौता किया है, तो उपयोगकर्ता के पास किसी Kubernetes प्लेटफॉर्म तक पहुंच हो सकती है। टोकन आमतौर पर env var KUBECONFIG
द्वारा इंगित फ़ाइल में या ~/.kube
के अंदर स्थित होता है।
इस फ़ोल्डर में आपको टोकन और API सर्वर से जुड़ने के लिए कॉन्फ़िगरेशन वाली कॉन्फ़िग फ़ाइलें मिल सकती हैं। इस फ़ोल्डर में आपको पहले से प्राप्त जानकारी वाला एक कैश फ़ोल्डर भी मिल सकता है।
यदि आपने किसी Kubernetes वातावरण के अंदर किसी पॉड को समझौता किया है, तो अन्य स्थानों पर आपको टोकन और वर्तमान K8 वातावरण के बारे में जानकारी मिल सकती है:
Service Account Tokens
आगे बढ़ने से पहले, यदि आपको नहीं पता कि Kubernetes में सर्विस क्या है, तो मैं आपको सुझाव दूंगा कि इस लिंक का अनुसरण करें और कम से कम Kubernetes आर्किटेक्चर के बारे में जानकारी पढ़ें।
Kubernetes दस्तावेज़ीकरण से लिया गया:
“जब आप एक पॉड बनाते हैं, यदि आप कोई सर्विस अकाउंट निर्दिष्ट नहीं करते हैं, तो यह स्वचालित रूप से उसी नेमस्पेस में default सर्विस अकाउंट को असाइन किया जाता है।”
ServiceAccount एक ऑब्जेक्ट है जिसे Kubernetes द्वारा प्रबंधित किया जाता है और इसका उपयोग पॉड में चलने वाली प्रक्रियाओं के लिए एक पहचान प्रदान करने के लिए किया जाता है। हर सर्विस अकाउंट के पास एक सीक्रेट होता है और इस सीक्रेट में एक बियरर टोकन होता है। यह एक JSON Web Token (JWT) है, जो दो पक्षों के बीच सुरक्षित रूप से दावों को प्रस्तुत करने की एक विधि है।
आमतौर पर एक निर्देशिका:
/run/secrets/kubernetes.io/serviceaccount
/var/run/secrets/kubernetes.io/serviceaccount
/secrets/kubernetes.io/serviceaccount
फ़ाइलें होती हैं:
ca.crt: यह कुबेरनेट्स संचार की जांच के लिए ca प्रमाणपत्र है
namespace: यह वर्तमान नेमस्पेस को इंगित करता है
token: इसमें वर्तमान पॉड का सर्विस टोकन होता है।
अब जब आपके पास टोकन है, तो आप पर्यावरण चर KUBECONFIG
के अंदर API सर्वर पा सकते हैं। अधिक जानकारी के लिए (env | set) | grep -i "kuber|kube
"
चलाएं।
सर्विस अकाउंट टोकन sa.key फ़ाइल में रहने वाली कुंजी द्वारा हस्ताक्षरित होता है और sa.pub द्वारा मान्य किया जाता है।
Kubernetes पर डिफ़ॉल्ट स्थान:
/etc/kubernetes/pki
Minikube पर डिफ़ॉल्ट स्थान:
/var/lib/localkube/certs
Hot Pods
Hot pods वे पॉड होते हैं जिनमें एक विशेषाधिकार प्राप्त सर्विस अकाउंट टोकन होता है। एक विशेषाधिकार प्राप्त सर्विस अकाउंट टोकन एक ऐसा टोकन होता है जिसके पास विशेषाधिकार प्राप्त कार्य करने की अनुमति होती है, जैसे कि सीक्रेट्स की सूची बनाना, पॉड्स बनाना, आदि।
RBAC
यदि आपको नहीं पता कि RBAC क्या है, इस खंड को पढ़ें।
Enumeration CheatSheet
K8s वातावरण का अनुक्रमण करने के लिए आपको इसकी आवश्यकता होती है:
एक मान्य प्रमाणीकरण टोकन। पिछले खंड में हमने देखा कि उपयोगकर्ता टोकन और सर्विस अकाउंट टोकन कहां खोजना है।
Kubernetes API का पता (https://host:port)। यह आमतौर पर पर्यावरण चरों और/या कुबे कॉन्फ़िग फ़ाइल में पाया जा सकता है।
वैकल्पिक: API सर्वर को सत्यापित करने के लिए ca.crt। यह उसी स्थानों पर पाया जा सकता है जहां टोकन पाया जा सकता है। यह API सर्वर प्रमाणपत्र को सत्यापित करने के लिए उपयोगी है, लेकिन
kubectl
के साथ--insecure-skip-tls-verify
याcurl
के साथ-k
का उपयोग करते समय आपको इसकी आवश्यकता नहीं होगी।
उन विवरणों के साथ आप kubernetes का अनुक्रमण कर सकते हैं। यदि API किसी कारण से इंटरनेट के माध्यम से सुलभ है, तो आप बस उस जानकारी को डाउनलोड कर सकते हैं और अपने होस्ट से प्लेटफॉर्म का अनुक्रमण कर सकते हैं।
हालांकि, आमतौर पर API सर्वर एक आंतरिक नेटवर्क के अंदर होता है, इसलिए आपको अपनी मशीन से इसे एक्सेस करने के लिए एक टनल बनाने की आवश्यकता होगी, या आप kubectl बाइनरी अपलोड कर सकते हैं, या API सर्वर को कच्चे HTTP अनुरोधों को प्रदर्शित करने के लिए curl/wget/anything
का उपयोग कर सकते हैं।
list
और get
क्रियाओं के बीच अंतर
list
और get
क्रियाओं के बीच अंतरget
अनुमतियों के साथ आप विशिष्ट संपत्तियों की जानकारी तक पहुंच सकते हैं (kubectl
में describe
विकल्प) API:
यदि आपके पास list
अनुमति है, तो आपको एक प्रकार की संपत्ति की सूची बनाने के लिए API अनुरोध करने की अनुमति है (get
विकल्प kubectl
में):
यदि आपके पास watch
अनुमति है, तो आपको संपत्तियों की निगरानी के लिए API अनुरोध करने की अनुमति है:
वे एक स्ट्रीमिंग कनेक्शन खोलते हैं जो आपको एक Deployment की पूरी मेनिफेस्ट वापस करता है जब भी वह बदलती है (या जब एक नई बनाई जाती है)।
निम्नलिखित kubectl
कमांड्स यह दर्शाते हैं कि ऑब्जेक्ट्स को कैसे सूचीबद्ध किया जाए। यदि आप डेटा तक पहुँचना चाहते हैं तो आपको get
के बजाय describe
का उपयोग करना होगा
curl का उपयोग करते हुए
एक पॉड के अंदर से आप कई env वेरिएबल्स का उपयोग कर सकते हैं:
डिफ़ॉल्ट रूप से पॉड kube-api सर्वर तक पहुँच सकता है जो डोमेन नाम kubernetes.default.svc
में होता है और आप kube नेटवर्क को /etc/resolv.config
में देख सकते हैं क्योंकि यहाँ आपको kubernetes DNS सर्वर का पता मिलेगा (वही रेंज का ".1" kube-api एंडपॉइंट है)।
kubectl का उपयोग करना
टोकन और API सर्वर के पते के होने पर आप kubectl या curl का उपयोग करके इसे पहुँच सकते हैं जैसा कि यहाँ दर्शाया गया है:
डिफ़ॉल्ट रूप से, APISERVER https://
स्कीमा के साथ संवाद कर रहा है
यदि url में
https://
नहीं है, तो आपको Bad Request जैसी Error मिल सकती है।
आप आधिकारिक kubectl चीटशीट यहाँ पा सकते हैं। निम्नलिखित खंडों का उद्देश्य विभिन्न विकल्पों को क्रमबद्ध तरीके से प्रस्तुत करना है ताकि आप नए K8s तक प्राप्त की गई पहुँच को समझ सकें और उसका अन्वेषण कर सकें।
kubectl
द्वारा भेजे गए HTTP अनुरोध को जानने के लिए आप पैरामीटर -v=8
का उपयोग कर सकते हैं।
MitM kubectl - Proxyfying kubectl
वर्तमान कॉन्फ़िगरेशन
यदि आप कुछ उपयोगकर्ताओं की साख चुराने में सफल हो जाते हैं, तो आप उन्हें स्थानीय रूप से कॉन्फ़िगर कर सकते हैं, जैसे कि:
समर्थित संसाधन प्राप्त करें
इस जानकारी के साथ आपको पता चलेगा कि आप कौन सी सेवाएँ सूचीबद्ध कर सकते हैं
वर्तमान विशेषाधिकार प्राप्त करें
आपकी विशेषाधिकारों की जांच करने का एक और तरीका है उपकरण का उपयोग करना: https://github.com/corneliusweig/rakkess****
आप Kubernetes RBAC के बारे में और जान सकते हैं:
pageKubernetes Role-Based Access Control(RBAC)एक बार जब आप जान जाते हैं कि आपके पास कौन से विशेषाधिकार हैं, तो निम्नलिखित पृष्ठ की जांच करें कि क्या आप उनका दुरुपयोग करके विशेषाधिकारों को बढ़ा सकते हैं:
pageAbusing Roles/ClusterRoles in Kubernetesअन्य भूमिकाएँ प्राप्त करें
नेमस्पेस प्राप्त करें
Kubernetes एक ही भौतिक क्लस्टर द्वारा समर्थित एकाधिक वर्चुअल क्लस्टर्स का समर्थन करता है। इन वर्चुअल क्लस्टर्स को नेमस्पेस कहा जाता है।
रहस्य प्राप्त करें
यदि आप secrets पढ़ सकते हैं तो आप प्रत्येक token से संबंधित विशेषाधिकार प्राप्त करने के लिए निम्नलिखित पंक्तियों का उपयोग कर सकते हैं:
सर्विस अकाउंट्स प्राप्त करें
इस पृष्ठ की शुरुआत में चर्चा की गई थी कि जब एक पॉड चलाया जाता है तो आमतौर पर उसे एक सर्विस अकाउंट असाइन किया जाता है। इसलिए, सर्विस अकाउंट्स की सूची बनाना, उनकी अनुमतियां और वे कहाँ चल रहे हैं, यह जानना एक उपयोगकर्ता को अधिकारों को बढ़ाने में मदद कर सकता है।
डिप्लॉयमेंट्स प्राप्त करें
डिप्लॉयमेंट्स उन कॉम्पोनेंट्स को निर्दिष्ट करते हैं जिन्हें चलाने की आवश्यकता होती है।
पॉड्स प्राप्त करें
पॉड्स वास्तविक कंटेनर होते हैं जो चलेंगे।
सेवाएं प्राप्त करें
Kubernetes सेवाएं का उपयोग एक विशिष्ट पोर्ट और IP पर सेवा को प्रकट करने के लिए किया जाता है (जो वास्तव में सेवा प्रदान करने वाले पॉड्स के लिए लोड बैलेंसर के रूप में काम करेगा)। यह जानना दिलचस्प है कि आप अन्य सेवाओं को कहां पा सकते हैं जिन पर आक्रमण करने का प्रयास किया जा सकता है।
नोड्स प्राप्त करें
क्लस्टर के अंदर कॉन्फ़िगर किए गए सभी नोड्स प्राप्त करें।
DaemonSets प्राप्त करें
DaemonSets यह सुनिश्चित करने की अनुमति देता है कि विशिष्ट पॉड सभी नोड्स में चल रहा है क्लस्टर के (या चुने हुए वालों में)। यदि आप DaemonSet को हटा देते हैं, तो उसके द्वारा प्रबंधित पॉड्स भी हटा दिए जाएंगे।
क्रॉनजॉब प्राप्त करें
क्रॉन जॉब्स आपको क्रॉनटैब जैसे सिंटैक्स का उपयोग करके एक पॉड के लॉन्च को शेड्यूल करने की अनुमति देते हैं, जो कुछ कार्रवाई करेगा।
configMap प्राप्त करें
configMap हमेशा बहुत सारी जानकारी और configfile को संग्रहीत करता है जो कि Kubernetes में चलने वाले apps को प्रदान किया जाता है। आमतौर पर आपको बहुत सारे पासवर्ड, सीक्रेट्स, टोकन मिल सकते हैं जो अन्य आंतरिक/बाहरी सेवाओं से जुड़ने और मान्य करने के लिए उपयोग किए जाते हैं।
"सभी" प्राप्त करें
पॉड्स की खपत प्राप्त करें
पॉड से बाहर निकलना
यदि आप नए पॉड्स बनाने में सक्षम हैं, तो आप उनसे नोड की ओर बाहर निकल सकते हैं। ऐसा करने के लिए आपको एक yaml फाइल का उपयोग करके एक नया पॉड बनाना होगा, बनाए गए पॉड पर स्विच करना होगा और फिर नोड के सिस्टम में chroot करना होगा। आप yaml फाइल के लिए पहले से मौजूद पॉड्स का उपयोग संदर्भ के रूप में कर सकते हैं क्योंकि वे मौजूदा इमेजेज और पथों को प्रदर्शित करते हैं।
यदि आपको विशिष्ट नोड पर पॉड बनाने की आवश्यकता है, तो आप नोड पर लेबल्स प्राप्त करने के लिए निम्नलिखित कमांड का उपयोग कर सकते हैं
k get nodes --show-labels
आमतौर पर, kubernetes.io/hostname और node-role.kubernetes.io/master चयन के लिए अच्छे लेबल होते हैं।
फिर आप अपनी attack.yaml फाइल बनाते हैं
अब आप निम्नानुसार बनाए गए पॉड पर स्विच कर सकते हैं
और अंत में आप नोड के सिस्टम में chroot करते हैं
से प्राप्त जानकारी: Kubernetes Namespace Breakout using Insecure Host Path Volume — भाग 1 Kubernetes पर हमला और बचाव: Bust-A-Kube – एपिसोड 1
संदर्भ
Last updated