Kubernetes Enumeration
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
यदि आपके पास किसी मशीन तक समझौता किया गया है, तो उपयोगकर्ता के पास कुछ Kubernetes प्लेटफ़ॉर्म तक पहुंच हो सकती है। टोकन आमतौर पर env var KUBECONFIG
द्वारा इंगित की गई फ़ाइल में या ~/.kube
के अंदर स्थित होता है।
इस फ़ोल्डर में आप API सर्वर से कनेक्ट करने के लिए टोकन और कॉन्फ़िगरेशन के साथ कॉन्फ़िग फ़ाइलें पा सकते हैं। इस फ़ोल्डर में आपको पहले से प्राप्त जानकारी के साथ एक कैश फ़ोल्डर भी मिल सकता है।
यदि आपने Kubernetes वातावरण के अंदर एक पॉड से समझौता किया है, तो अन्य स्थान हैं जहाँ आप टोकन और वर्तमान K8 वातावरण के बारे में जानकारी पा सकते हैं:
जारी रखने से पहले, यदि आप नहीं जानते कि Kubernetes में सेवा क्या है, तो मैं आपको इस लिंक का पालन करने और कम से कम Kubernetes आर्किटेक्चर के बारे में जानकारी पढ़ने की सलाह दूंगा।
Kubernetes दस्तावेज़ीकरण से लिया गया:
“जब आप एक पॉड बनाते हैं, यदि आप एक सेवा खाता निर्दिष्ट नहीं करते हैं, तो इसे स्वचालित रूप से उसी नामस्थान में डिफ़ॉल्ट सेवा खाते को सौंपा जाता है।”
ServiceAccount एक वस्तु है जिसे Kubernetes द्वारा प्रबंधित किया जाता है और यह पॉड में चलने वाली प्रक्रियाओं के लिए एक पहचान प्रदान करने के लिए उपयोग किया जाता है। प्रत्येक सेवा खाते से संबंधित एक गुप्त होता है और इस गुप्त में एक बियरर टोकन होता है। यह एक JSON वेब टोकन (JWT) है, जो दो पक्षों के बीच दावों का सुरक्षित रूप से प्रतिनिधित्व करने का एक तरीका है।
आमतौर पर एक निर्देशिका:
/run/secrets/kubernetes.io/serviceaccount
/var/run/secrets/kubernetes.io/serviceaccount
/secrets/kubernetes.io/serviceaccount
इन फ़ाइलों को शामिल करती हैं:
ca.crt: यह Kubernetes संचार की जांच के लिए ca प्रमाणपत्र है
namespace: यह वर्तमान नामस्थान को इंगित करता है
token: इसमें वर्तमान पॉड का सेवा टोकन होता है।
अब जब आपके पास टोकन है, तो आप वातावरण चर KUBECONFIG
के अंदर API सर्वर पा सकते हैं। अधिक जानकारी के लिए चलाएँ (env | set) | grep -i "kuber|kube
"
सेवा खाता टोकन उस कुंजी द्वारा हस्ताक्षरित होता है जो फ़ाइल sa.key में स्थित होती है और sa.pub द्वारा मान्य होती है।
Kubernetes पर डिफ़ॉल्ट स्थान:
/etc/kubernetes/pki
Minikube पर डिफ़ॉल्ट स्थान:
/var/lib/localkube/certs
हॉट पॉड्स ऐसे पॉड होते हैं जिनमें एक विशेषाधिकार प्राप्त सेवा खाता टोकन होता है। एक विशेषाधिकार प्राप्त सेवा खाता टोकन वह टोकन है जिसमें विशेषाधिकार प्राप्त कार्य करने की अनुमति होती है जैसे कि गुप्त सूची बनाना, पॉड बनाना, आदि।
यदि आप नहीं जानते कि RBAC क्या है, तो इस अनुभाग को पढ़ें।
k9s: एक GUI जो टर्मिनल से एक Kubernetes क्लस्टर को सूचीबद्ध करता है। https://k9scli.io/topics/commands/ में कमांड देखें। :namespace
लिखें और सभी का चयन करें ताकि फिर सभी नामस्थानों में संसाधनों की खोज की जा सके।
k8slens: यह कुछ मुफ्त परीक्षण दिनों की पेशकश करता है: https://k8slens.dev/
K8s वातावरण को सूचीबद्ध करने के लिए आपको इनमें से कुछ की आवश्यकता है:
एक मान्य प्रमाणीकरण टोकन। पिछले अनुभाग में हमने उपयोगकर्ता टोकन और सेवा खाता टोकन के लिए खोजने के स्थान देखे।
Kubernetes API का पता (https://host:port**)। यह आमतौर पर वातावरण चर और/या kube कॉन्फ़िग फ़ाइल में पाया जा सकता है।
वैकल्पिक: API सर्वर को सत्यापित करने के लिए ca.crt। यह उसी स्थानों पर पाया जा सकता है जहाँ टोकन पाया जा सकता है। यह API सर्वर प्रमाणपत्र को सत्यापित करने के लिए उपयोगी है, लेकिन kubectl
के साथ --insecure-skip-tls-verify
का उपयोग करते समय या curl
के साथ -k
का उपयोग करते समय आपको इसकी आवश्यकता नहीं होगी।
इन विवरणों के साथ आप Kubernetes को सूचीबद्ध कर सकते हैं। यदि API किसी कारणवश इंटरनेट के माध्यम से सुलभ है, तो आप बस उस जानकारी को डाउनलोड कर सकते हैं और अपने होस्ट से प्लेटफ़ॉर्म को सूचीबद्ध कर सकते हैं।
हालांकि, आमतौर पर API सर्वर एक आंतरिक नेटवर्क के अंदर होता है, इसलिए आपको इसे अपनी मशीन से एक्सेस करने के लिए समझौता की गई मशीन के माध्यम से एक सुरंग बनानी होगी, या आप kubectl
बाइनरी को अपलोड कर सकते हैं, या curl/wget/anything
का उपयोग करके API सर्वर पर कच्चे HTTP अनुरोध कर सकते हैं।
list
और get
क्रियाओं के बीच अंतरget
अनुमतियों के साथ आप विशिष्ट संपत्तियों की जानकारी तक पहुँच सकते हैं (kubectl
में describe
विकल्प) API:
यदि आपके पास list
अनुमति है, तो आप एक प्रकार के संपत्ति की सूची बनाने के लिए API अनुरोधों को निष्पादित करने की अनुमति रखते हैं (kubectl
में get
विकल्प):
यदि आपके पास watch
अनुमति है, तो आपको संपत्तियों की निगरानी के लिए API अनुरोध निष्पादित करने की अनुमति है:
वे एक स्ट्रीमिंग कनेक्शन खोलते हैं जो आपको एक Deployment का पूरा मैनिफेस्ट लौटाता है जब भी यह बदलता है (या जब एक नया बनाया जाता है)।
निम्नलिखित kubectl
कमांड्स यह दर्शाते हैं कि वस्तुओं को कैसे सूचीबद्ध किया जाए। यदि आप डेटा तक पहुँच प्राप्त करना चाहते हैं तो आपको get
के बजाय describe
का उपयोग करना होगा।
एक पॉड के अंदर आप कई env वेरिएबल्स का उपयोग कर सकते हैं:
डिफ़ॉल्ट रूप से, पॉड kube-api सर्वर को डोमेन नाम kubernetes.default.svc
में एक्सेस कर सकता है और आप /etc/resolv.config
में kube नेटवर्क देख सकते हैं, क्योंकि यहाँ आपको kubernetes DNS सर्वर का पता मिलेगा (एक ही रेंज का ".1" kube-api एंडपॉइंट है)।
टोकन और API सर्वर का पता होने पर, आप इसे एक्सेस करने के लिए kubectl या curl का उपयोग करते हैं, जैसा कि यहाँ संकेतित है:
डिफ़ॉल्ट रूप से, APISERVER https://
स्कीमा के साथ संचार कर रहा है
यदि URL में
https://
नहीं है, तो आपको Bad Request जैसी त्रुटि मिल सकती है।
आप यहां आधिकारिक kubectl cheatsheet पा सकते हैं। निम्नलिखित अनुभागों का लक्ष्य विभिन्न विकल्पों को क्रमबद्ध तरीके से प्रस्तुत करना है ताकि आप उस नए K8s को सूचीबद्ध कर सकें और समझ सकें, जिसे आपने एक्सेस किया है।
HTTP अनुरोध को खोजने के लिए जो kubectl
भेजता है, आप पैरामीटर -v=8
का उपयोग कर सकते हैं।
यदि आप कुछ उपयोगकर्ताओं के क्रेडेंशियल चुराने में सफल रहे हैं, तो आप उन्हें स्थानीय रूप से कॉन्फ़िगर कर सकते हैं, जैसे:
इस जानकारी के साथ, आप सभी सेवाओं को जानेंगे जिन्हें आप सूचीबद्ध कर सकते हैं
अपने विशेषाधिकारों की जांच करने का एक और तरीका है उपकरण का उपयोग करना: https://github.com/corneliusweig/rakkess****
आप Kubernetes RBAC के बारे में अधिक जान सकते हैं:
Kubernetes Role-Based Access Control(RBAC)एक बार जब आप जान लें कि आपके पास कौन से विशेषाधिकार हैं तो निम्नलिखित पृष्ठ की जांच करें यह पता लगाने के लिए क्या आप उनका दुरुपयोग कर सकते हैं विशेषाधिकार बढ़ाने के लिए:
Abusing Roles/ClusterRoles in KubernetesKubernetes एक ही भौतिक क्लस्टर द्वारा समर्थित कई आभासी क्लस्टर का समर्थन करता है। इन आभासी क्लस्टरों को नामस्थान कहा जाता है।
यदि आप रहस्यों को पढ़ सकते हैं, तो आप प्रत्येक टोकन से संबंधित विशेषाधिकार प्राप्त करने के लिए निम्नलिखित पंक्तियों का उपयोग कर सकते हैं:
जैसा कि इस पृष्ठ की शुरुआत में चर्चा की गई थी जब एक पॉड चलाया जाता है, तो आमतौर पर एक सेवा खाता उसे सौंपा जाता है। इसलिए, सेवा खातों की सूची बनाना, उनकी अनुमतियाँ और वे कहाँ चल रहे हैं, एक उपयोगकर्ता को विशेषाधिकार बढ़ाने की अनुमति दे सकता है।
डिप्लॉयमेंट उन घटक को निर्दिष्ट करते हैं जिन्हें चलाना आवश्यक है।
Pods असली कंटेनर हैं जो चलेंगे।
Kubernetes सेवाएँ का उपयोग किसी विशेष पोर्ट और IP में एक सेवा को उजागर करने के लिए किया जाता है (जो वास्तव में सेवा प्रदान करने वाले पॉड्स के लिए लोड बैलेंसर के रूप में कार्य करेगा)। यह जानना दिलचस्प है कि आप अन्य सेवाएँ कहाँ पा सकते हैं जिन पर आप हमला करने की कोशिश कर सकते हैं।
क्लस्टर के अंदर कॉन्फ़िगर किए गए सभी नोड्स प्राप्त करें।
DaeamonSets यह सुनिश्चित करने की अनुमति देता है कि एक विशिष्ट पॉड क्लस्टर के सभी नोड्स में चल रहा है (या चयनित नोड्स में)। यदि आप DaemonSet को हटा देते हैं, तो इसके द्वारा प्रबंधित पॉड्स भी हटा दिए जाएंगे।
क्रोन जॉब्स क्रोनटैब जैसी सिंटैक्स का उपयोग करके एक पॉड के लॉन्च को शेड्यूल करने की अनुमति देते हैं जो कुछ क्रिया करेगा।
configMap हमेशा बहुत सारी जानकारी और configfile शामिल करता है जो kubernetes में चलने वाले ऐप्स को प्रदान करता है। आमतौर पर, आप बहुत सारे पासवर्ड, रहस्य, टोकन पा सकते हैं जो अन्य आंतरिक/बाहरी सेवा से कनेक्ट करने और मान्य करने के लिए उपयोग किए जाते हैं।
यदि आप नए पॉड बनाने में सक्षम हैं, तो आप उनसे नोड में बाहर निकलने में सक्षम हो सकते हैं। ऐसा करने के लिए, आपको एक yaml फ़ाइल का उपयोग करके एक नया पॉड बनाना होगा, बनाए गए पॉड पर स्विच करना होगा और फिर नोड के सिस्टम में chroot करना होगा। आप yaml फ़ाइल के लिए संदर्भ के रूप में पहले से मौजूद पॉड का उपयोग कर सकते हैं क्योंकि वे मौजूदा छवियों और पथों को प्रदर्शित करते हैं।
यदि आपको किसी विशेष नोड पर पॉड बनाना है, तो आप नोड पर लेबल प्राप्त करने के लिए निम्नलिखित कमांड का उपयोग कर सकते हैं
k get nodes --show-labels
सामान्यतः, kubernetes.io/hostname और node-role.kubernetes.io/master सभी अच्छे लेबल हैं चयन के लिए।
फिर आप अपना attack.yaml फ़ाइल बनाते हैं।
उसके बाद आप पॉड बनाते हैं
अब आप निम्नलिखित के अनुसार बनाए गए पॉड पर स्विच कर सकते हैं
और अंत में आप नोड के सिस्टम में chroot करते हैं
Information obtained from: Kubernetes Namespace Breakout using Insecure Host Path Volume — Part 1 Attacking and Defending Kubernetes: Bust-A-Kube – Episode 1
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)