SEH-основанный переполнение буфера в Easy File Sharing Web Server 7.2, демонстрирующее, как аутентифицированный параметр HTTP POST может повредить цепочку обработчиков исключений.
SEH-переполнение буфера в Easy File Sharing Web Server 7.2, демонстрирующее, как аутентифицированный параметр HTTP POST может повредить цепочку обработчиков исключений.
Этот репозиторий является частью материалов, которые я использую при преподавании эксплуатации повреждений памяти (в дополнение к основной работе я также преподаю на различных курсах по кибербезопасности, где помогаю обучать следующее поколение специалистов по реверс-инжинирингу).
CVE-2018-18912 — это пример, который я использую для перехода от простых перезаписей EIP к эксплуатации на основе SEH. Как только студенты понимают, как работает прямая перезапись адреса возврата, следующим шагом является понимание того, что происходит, когда стек настолько поврежден, что программа вызывает исключение до возврата, и как эта цепочка обработчиков исключений становится поверхностью атаки. Этот CVE наглядно демонстрирует этот переход: переполнение достаточно глубокое, чтобы достичь цепочки SEH, а путь эксплуатации следует классической технике POP POP RETN, которую должен понимать каждый разработчик эксплойтов. Необязательный обход DEP с помощью ROP оставлен как расширение для студентов, желающих пойти дальше: то же переполнение, другая стратегия гаджетов, гораздо более сложная задача.
Эта уязвимость затрагивает Easy File Sharing Web Server 7.2, легковесное веб-серверное приложение для Windows, которое широко использовалось для простого обмена файлами. Программное обеспечение было написано без учета современных средств защиты. Что делает этот случай особенно интересным с точки зрения обучения, так это комбинация вовлеченных факторов:
Эта комбинация делает CVE-2018-18912 отличным примером для обучения техникам разработки эксплойтов за пределами основ.
Easy File Sharing Web Server 7.2 — это Windows-приложение, позволяющее пользователям обмениваться файлами по HTTP. Оно включает такие функции, как просмотр файлов, аутентификация пользователей и встроенная система форумов.
Функционал форума принимает POST-запросы для создания новых тем. Одним из полей формы, обрабатываемых этой конечной точкой, является параметр author. Внутренне приложение копирует это управляемое пользователем значение в стековый буфер фиксированного размера без проверки длины.
Уязвимость была обнаружена и сообщена в 2018 году. Вскоре после этого был опубликован оригинальный PoC, демонстрирующий как сбой, так и рабочую цепочку эксплойта, включая ROP-гаджеты из встроенного модуля ImageLoad.dll.
Ключевые технические детали:
Easy File Sharing Web Server обрабатывает HTTP POST-запросы, направленные на /forum.ghp, когда пользователь создает новую тему форума. Один из принимаемых параметров — author, который копируется в локальный стековый буфер без какой-либо проверки длины.
При реверс-инжиниринге двоичного файла можно заметить, что обработчик этого поля формы использует буфер фиксированного размера и небезопасную операцию копирования. Упрощенная версия уязвимой логики выглядит так:
char author_buffer[64];
strcpy(author_buffer, user_input);
Поскольку целевой буфер имеет фиксированный размер, а длина ввода не проверяется, отправка достаточно длинной строки в поле author приводит к записи за конец буфера.
По мере записи большего количества данных структура стека повреждается. В отличие от простой перезаписи адреса возврата, переполнение достигает цепочки структурированного обработчика исключений (SEH), хранящейся в стеке. Когда в результате повреждения стека возникает исключение, ОС проходит по цепочке SEH и передает управление на адрес обработчика, контролируемый злоумышленником.
Таким образом, поток эксплуатации следует технике перезаписи SEH:
Это делает уязвимость более сложной для эксплуатации, чем базовая перезапись EIP, но также более репрезентативной для реальных сценариев.
Сбой можно воспроизвести, отправив длинную строку в параметре author POST-запроса к /forum.ghp после аутентификации с действующими учетными данными. Пример на Python:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 500
request = (
b"POST /forum.ghp?forumid=1 HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Content-Type: application/x-www-form-urlencoded\r\n"
b"Cookie: UserID=test; PassWD=test; SESSIONID=1234\r\n"
b"Connection: close\r\n"
b"\r\n"
b"author=" + payload + b"&passwd=test&title=test&content=test&Submit=Submit\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
При выполнении под отладчиком сбой показывает поврежденную цепочку SEH и нарушение доступа, что подтверждает, что управляемые пользователем данные перезаписали указатель обработчика исключений.
Цель этого репозитория — не только продемонстрировать сбой, но и провести через полный процесс эксплуатации шаг за шагом, следуя методологии, используемой при разработке реальных эксплойтов на основе SEH.
Чтобы сохранить основной README чистым, подробные заметки по эксплуатации, скрипты и шаги отладчика помещены в папку Vulnerability 📂 этого репозитория.
Там вы найдете полный рабочий процесс, используемый для эксплуатации этого CVE, включая: