
Переполнение буфера в FreeFloat FTP Server 1.0, иллюстрирующее, как один небезопасный обработчик может породить несколько записей CVE для разных команд.
Переполнение буфера в FreeFloat FTP Server 1.0, демонстрирующее, как один небезопасный обработчик может породить несколько записей CVE для разных команд.
Этот репозиторий — часть материалов, которые я использую при обучении эксплуатации повреждений памяти (помимо основной работы я также преподаю на различных курсах по кибербезопасности, где помогаю готовить следующее поколение специалистов по реверс-инжинирингу).
CVE-2025-5548 — это пример, который я использую, чтобы показать студентам, что исследование уязвимостей — доступный навык, а не прерогатива старших исследователей с многолетним опытом. FreeFloat FTP Server 1.0 — небольшое устаревшее приложение для Windows, которое легко установить, легко запустить и легко аварийно завершить. Переполнение происходит через стандартную FTP-команду, путь эксплуатации — чистая перезапись EIP, а весь процесс от фазинга до работающего шелла можно выполнить за один сеанс.
Этот пример также напрямую связан с моим докладом «Путь, ведущий к вашему первому CVE», где я объясняю, что одна из самых реалистичных точек входа в исследование уязвимостей для новичков — это анализ старого ПО, понимание его внутреннего устройства и поиск недостающих проверок длины, которые приводят именно к такому классу уязвимостей. FreeFloat — один из примеров, который я использую, чтобы показать: для обнаружения и документирования реальной ошибки не нужны годы опыта, нужны любопытство, отладчик и методичный подход.
Особенно эффективным этот пример делает то, как он связан с более широким уроком о назначении CVE. Один и тот же небезопасный обработчик ввода в FreeFloat вызывает переполнения во множестве различных FTP-команд: USER, PASS, NOOP и других — каждая из них была независимо зарегистрирована и получила свой собственный номер CVE. Студенты, которые смотрят на список CVE для этой программы и видят десятки записей, быстро усваивают: количество CVE не равно количеству уязвимостей, а понимание первопричины важнее, чем каталогизация симптомов.
Как только студенты понимают процесс на подобных примерах, я показываю им реальный пример того, что будет дальше. Спустя две недели практики с переполнениями буфера и повреждениями памяти та уязвимость, которую они способны найти, уже существует в реальном ПО. Следующий репозиторий документирует уязвимость, которую я нашёл специально, чтобы показать студентам полный цикл: обнаружение, анализ, документирование и запрос CVE — на чём-то достаточно доступном, чтобы найти это в начале учебного пути, например CVE-2025-70330.
Этот репозиторий — часть более крупной коллекции. Если вы хотите попрактиковаться в эксплуатации широкого спектра техник, типов уязвимостей и целевых архитектур, загляните в репозиторий Binary-Exploitation, где весь этот материал организован и поддерживается вместе со множеством других CVE, методологий и упражнений по эксплуатации.
Эта уязвимость затрагивает FreeFloat FTP Server 1.0, очень старый FTP-сервер для Windows, написанный без учёта современных практик безопасности. В 2025 году один исследователь сообщил о многих CVE, затрагивающих этот же бинарник.
Примеры:
Каждый CVE относится к разной FTP-команде, но при реверс-инжиниринге программы становится ясно, что многие из них проходят по одному и тому же уязвимому пути кода.
Это делает данный случай интересным не только как пример переполнения буфера, но и как демонстрация того, что:
При реверс-инжиниринге бинарника можно заметить, что все FTP-команды обрабатываются одной и той же функцией-диспетчером. Строка команды сохраняется внутри структуры сессии, и несколько обработчиков команд копируют пользовательский ввод в буферы фиксированного размера с использованием небезопасных функций, таких как strcpy, strcat и memcpy, без проверки длины полученных данных.
Из-за этого разные команды могут перезаписывать стек, даже если в описании CVE упоминается только одна конкретная команда.
Например, сбой можно вызвать с помощью:
NOOP AAAAA...
USER AAAAA...
PASS AAAAA...
HOST AAAAA...
ANYTHING AAAAA...
Единственное различие — количество байт, необходимое для перезаписи адреса возврата. Это означает, что многие задокументированные для этого ПО CVE имеют одну и ту же первопричину.
FreeFloat FTP Server обрабатывает команды, полученные через TCP-порт 21, и сохраняет строку команды внутри внутренней структуры сессии. Затем обработчик команды копирует контролируемые пользователем данные в локальные стековые буферы без надлежащей проверки длины.
При реверс-инжиниринге бинарника можно заметить, что несколько обработчиков команд используют буферы фиксированного размера и небезопасные операции копирования. Упрощённая версия уязвимой логики выглядит так:
char buffer[256];
strcpy(buffer, user_input);
Поскольку целевой буфер имеет фиксированный размер, а длина входных данных не проверяется, отправка длинной строки приводит к записи за пределы буфера.
По мере записи большего количества данных стековая разметка нарушается, пока не перезаписывается сохранённый адрес возврата.
Когда функция завершается, выполнение переходит к значению, контролируемому атакующим, что приводит к сбою. Под отладчиком это выглядит как перезапись указателя инструкции данными, подконтрольными атакующему.
Сбой можно воспроизвести, отправив длинную строку после допустимой FTP-команды. Пример на Python:
import socket
ip = "127.0.0.1"
port = 21
payload = b"A" * 500
s = socket.socket()
s.connect((ip, port))
s.recv(1024)
s.send(b"USER anonymous\r\n")
s.recv(1024)
s.send(b"PASS anonymous\r\n")
s.recv(1024)
s.send(b"NOOP " + payload + b"\r\n")
s.close()
При запуске под отладчиком сбой покажет:
EIP = 41414141
что подтверждает: контролируемые пользователем данные перезаписывают адрес возврата.
Цель этого репозитория — не просто показать сбой, но и продемонстрировать полный процесс эксплуатации уязвимости шаг за шагом, используя ту же методологию, которая обычно применяется при разработке эксплойтов.
Чтобы основной README оставался чистым, подробные заметки об эксплуатации, скрипты и шаги с отладчиком размещены в папке Vulnerability 📂 этого репозитория.
Там вы найдёте полный рабочий процесс, использованный для эксплуатации этого CVE, включая фазинг, определение смещения, анализ недопустимых символов, поиск гаджетов и выполнение шеллкода.