
Классическое стековое переполнение буфера в War FTP Daemon 1.65, демонстрирующее удаленное выполнение кода в стиле старой школы через искаженные FTP-команды.
Классическое стековое переполнение буфера в War FTP Daemon 1.65, демонстрирующее старую школу удаленного выполнения кода через неправильно сформированные FTP-команды.
Этот репозиторий является частью материалов, которые я использую при обучении эксплуатации повреждений памяти (в дополнение к основной работе я также преподаю на различных курсах по кибербезопасности, где помогаю обучать следующее поколение специалистов по реверсинжинирингу).
CVE-2007-1567 — это случай, который я использую сразу после введения основ обычных перезаписей EIP. Эксплуатация чиста и прямолинейна, но в ней есть одна деталь, которая делает её немного интереснее, чем типичное первое упражнение: дополнительный плохой символ, который вводит протокол FTP и который студенты должны определить и учесть при создании своего шеллкода. Это небольшое ограничение, но достаточное, чтобы заставить студентов думать, а не просто копировать уже использованный метод.
War FTP Daemon 1.65 — это устаревший FTP-сервер Windows конца 1990-х годов. Уязвимость находится в обработчике команды USER, который использует sprintf для копирования пользовательского ввода в стековый буфер фиксированного размера без проверки его длины. Что делает этот случай полезным для обучения:
War FTP Daemon — это FTP-сервер Windows, изначально написанный в конце 1990-х годов. Он прослушивает TCP-порт 21 и обрабатывает стандартные FTP-команды. Уязвимость находится в обработчике команды USER, который обрабатывает имя пользователя, отправленное подключающимся клиентом, используя sprintf без проверки длины.
Ключевые технические детали:
War FTP Daemon обрабатывает команду USER, передавая предоставленное имя пользователя в sprintf, который копирует его в стековый буфер фиксированного размера без проверки его длины. Упрощенная версия уязвимой логики выглядит так:
char buffer[256];
sprintf(buffer, "%sCRLF", username);
Отправка достаточно длинной строки в качестве аргумента USER заставляет копирование выйти за конец буфера, повреждая стек до тех пор, пока сохранённый адрес возврата не будет перезаписан. Когда функция возвращается, CPU загружает контролируемое атакующим значение из стека в EIP и переходит к нему.
Сбой можно воспроизвести, отправив чрезмерно большой аргумент USER по FTP. Аутентификация не требуется. Пример на Python:
import socket
HOST = '127.0.0.1'
PORT = 21
payload = b"A" * 700
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.recv(1024)
s.send(b"USER " + payload + b"\r\n")
s.close()
При выполнении под отладчиком сбой показывает EIP, перезаписанный данными, контролируемыми пользователем:
EIP = 41414141
что подтверждает повреждение сохранённого адреса возврата из-за переполнения.
Цель этого репозитория — не только продемонстрировать сбой, но и пройти через весь процесс эксплуатации шаг за шагом, от фаззинга до рабочего обратного шелла.
Чтобы основной README оставался чистым, подробные заметки по эксплуатации, скрипты и шаги отладчика помещены в папку Vulnerability 📂 этого репозитория.
Там вы найдете полный рабочий процесс, используемый для эксплуатации этого CVE, включая: