CVE-2026-44403-WingFTP-v8.1.2-POC-Exploit
O Wing FTP Server v8.1.2 contém uma vulnerabilidade de Execução Remota de Código (RCE) no mecanismo de serialização de sessão. Um administrador autenticado pode injetar código Lua arbitrário através do campo mydirectory (basefolder) do administrador de domínio, que é executado no lado do servidor via loadfile().
Esta é uma vulnerabilidade separada da CVE-2025-47812. A correção aplicada na v7.4.4 para a CVE-2025-47812 tratou apenas do vetor de injeção de byte nulo no campo de nome de usuário. A serialização de sessão insegura subjacente não foi corrigida e permanece explorável através do campo basefolder do administrador na v8.1.2.
A função de serialização de sessão serialize() em SessionModule.lua (linha 103) e SessionModuleAdmin.lua (linha 104) escreve valores de string usando a notação de strings longas [[...]] do Lua:
outf("_SESSION["..k.."]=[["..v.."]]\r\n")
Se um valor de sessão contiver ]], a string longa é fechada prematuramente e o conteúdo restante é interpretado como código Lua executável.
O código de sanitização de colchetes existe em cgi.lua (linhas 274-275) e cgiadmin.lua (linhas 277-278), mas está comentado:
--v = string.gsub(v,"%[","")
--v = string.gsub(v,"%]","")
A metatable de sessão que aplicaria essa sanitização também está desabilitada:
--setmetatable(_SESSION,session_metatable) -- cgi.lua:282, cgiadmin.lua:285
Passo 1 — Injetar o payload através do basefolder do administrador de domínio:
Um administrador completo autenticado cria ou modifica uma conta de administrador de domínio. O campo mydirectory é definido como:
C:\ftproot]]os.execute("whoami > C:\\proof.txt")--
Os endpoints service_add_admin.html e service_modify_admin.html não sanitizam os caracteres de colchetes do campo mydirectory. (service_add_admin.html remove colchetes do nome de usuário nas linhas 14-15, mas não do mydirectory.)
Passo 2 — Acionar a execução:
Quando o administrador de domínio envenenado faz login via service_login.html, o basefolder é armazenado diretamente na sessão:
rawset(_SESSION,"admin_basefolder",basefolder) -- service_login.html:95
rawset(_SESSION,"admin_nowpath",basefolder) -- service_login.html:96
SessionModuleAdmin.save() grava isso no arquivo de sessão como:
_SESSION['admin_basefolder']=[[C:\ftproot]]os.execute("whoami > C:\\proof.txt")--]]
Passo 3 — Execução de código:
Na próxima solicitação HTTP usando essa sessão, SessionModuleAdmin.load() chama loadfile() seguido de f() (linhas 184-188). O interpretador Lua interpreta o arquivo de sessão como:
_SESSION['admin_basefolder']=[[C:\ftproot]] --> assigns string "C:\ftproot"
os.execute("whoami > C:\\proof.txt") --> EXECUTES AS CODE
--]] --> rest is commented out
O payload é executado com os privilégios do processo do Wing FTP Server (SYSTEM no Windows, root no Linux).
Um exploit de PoC funcional foi desenvolvido e testado contra o Wing FTP Server v8.1.2 no Windows.
Passos para reprodução:
Faça login no painel administrativo
Crie um novo administrador de domínio com o seguinte valor mydirectory:
C:\ftproot]]os.execute("whoami > C:\\wingftp_rce_proof.txt")--
Faça login como o administrador de domínio recém-criado
Navegue para qualquer página administrativa (aciona o carregamento da sessão)
Verifique se C:\wingftp_rce_proof.txt foi criado contendo o nome de usuário do servidor