PDA

Просмотр полной версии : Сложные эксплойты без паники: Разбираем SEH Overwrite и Pass-the-Hash на пальцах


User17
21.07.2025, 15:45
Введение
Представьте, что компьютерная программа — это дом с правилами (архитектура, протоколы). Эксплойт — это находчивый взломщик, который ищет лазейки в этих правилах (например, дверь, которую забыли запереть, или доверчивого охранника). Сегодня разберем две такие "лазейки": одну в самом фундаменте программ (SEH Overwrite), другую в системе пропусков (Pass-the-Hash).

SEH Overwrite – Ломаем "аварийную лестницу" программы
Что такое SEH (Structured Exception Handler)?
SEH (Structured Exception Handler) - это механизм обработки программных и аппаратных исключений в операционной системе Microsoft Windows, позволяющий программистам контролировать обработку исключений, а также являющийся отладочным средством.

Или же иными словами: SEH — это встроенная система "скорой помощи" для программ на Windows. Представьте, что программа — это многоэтажное здание (стек вызовов функций). На каждом этаже есть аварийная инструкция (SEH-запись), что делать, если тут случилась ЧП (деление на ноль, обращение к несуществующей памяти). Эти инструкции связаны в цепочку (SEH Chain), ведущую к главному аварийному выходу (стандартный обработчик ОС).

Механизм атаки SEH Overwrite: Как взломщик использует "аварию"?
Атакующий намеренно вызывает ошибку после того, как переполнил буфер и подменил SEH-запись.

Шаги атаки:

Найти уязвимость: Программа копирует пользовательские данные (например, из файла или сети) в буфер фиксированного размера в стеке без проверки длины.

Переполнить буфер: Атакующий посылает данных больше, чем размер буфера.

Затопить стек: Избыточные данные перезаписывают:

Локальные переменные после буфера.

Адрес возврата из функции (если есть).

Ключевой момент: Перезаписывают SEH-записьв стеке. Атакующий подменяет:
Pointer to Next SEH Record (часто используется для размещения небольшой инструкции типа jmp).

Pointer to Exception Handler — ГЛАВНАЯ ЦЕЛЬ! Атакующий подставляет здесь адрес участка памяти под своим контролем (часто где-то в переполненных данных).


Спровоцировать исключение: Атакующий заставляет программу совершить ошибку после переполнения (например, обращение к неверному адресу памяти, который он же и подсунул).

Срабатывание подмененного обработчика: Система видит исключение. Она идет по цепочке SEH и натыкается на подмененный Pointer to Exception Handler. Система доверяет этому указателю и передает управление по этому адресу.

Выполнение кода атакующего: По адресу обработчика атакующий разместил свой вредоносный код (шеллкод), или код, который перенаправляет поток выполнения на шеллкод (часто с помощью инструкции по Pointer to Next SEH). Этот код выполняется с привилегиями уязвимой программы!
Пример:

Код:



function VulnerableFunction(userData):
char buffer[256]; // Буфер в стеке
strcpy(buffer, userData); // БЕЗ ПРОВЕРКИ ДЛИНЫ! Уязвимость!
main:
data = read_from_network() // Атакующий присылает >256 байт + Шеллкод + Подмененный SEH
VulnerableFunction(data) // Буфер переполняется, SEH перезаписывается
... // Позже происходит ошибка в программе или из-за данных атакующего
// Система: "Ой, ошибка! Смотрю SEH цепочку..."
// Переходит по подмененному адресу обработчика -> Выполняется шеллкод атакующего!


Защита от SEH Overwrite: Укрепляем "аварийные выходы"
/SAFESEH: "Белый список" для обработчиков исключений
Принцип работы:Компилятор (например, Microsoft Visual Studio) помечает безопасные SEH-обработчики на этапе компиляции и создаёт таблицу их адресов, которая сохраняется в исполняемом файле (PE-заголовок). При запуске программы эта таблица загружается в память.

Как это предотвращает атаку:

При возникновении исключения система проверяет адрес обработчика из SEH-записи:

Если адрес есть в таблице /SAFESEH — исключение передаётся обработчику.

Если адреса нет (например, атакующий подменил его на адрес в стеке/куче) — программа аварийно завершается.
SEHOP (Structured Exception Handler Overwrite Protection)
Принцип работы:Windows добавляет в конец SEH-цепочки фиктивную запись — "заглушку" (например, адрес 0xFFFFFFFF). При обработке исключения система проходит всю цепочку и проверяет:

Корректность связей между записями (указатель Next SEH должен вести на следующую запись).

Наличие "заглушки" в конце.
Почему это мешает атакующему:

При SEH Overwrite атакующий перезаписывает записи в стеке, нарушая целостность цепочки.

Система не находит заглушку или обнаруживает "битые" связи — атака блокируется.
Как включить:

SEHOP активен по умолчанию в Windows 7+ и Server 2008+.

Для принудительного включения (если отключен):# Через реестр:

Код:



reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel" /v DisableExceptionChainValidation /t REG_DWORD /d 0 /f

Pass-the-Hash (PtH): Механизм атаки и методы защиты
Суть атаки Pass-the-Hash
Pass-the-Hash (PtH) - это техника аутентификации, при которой злоумышленник использует украденный хеш пароля вместо самого пароля для получения доступа к системе. В Windows-средах это возможно из-за особенностей протоколов NTLM и Kerberos, которые для подтверждения подлинности проверяют знание хеша пароля, а не сам пароль.

Как работает атака

Кража хешей
Извлечение из памяти процесса LSASS (хранит хеши активных сессий)

Получение из локальной базы SAM (для локальных учетных записей)

Перехват сетевого трафика аутентификации NTLM

Доступ к файлам с кэшированными учетными данными


Использование хеша
Атакующий инициирует аутентификацию

Сервер отправляет случайный challenge

Атакующий шифрует challenge украденным хешем

Сервер, проверив ответ, предоставляет доступ


Перемещение в сети
Используя полученные хеши, злоумышленник перемещается между системами

Повышает привилегии, получая доступ к более важным учетным записям

В конечном итоге получает полный контроль над инфраструктурой

Методы защиты

Отключение устаревших LM-хешей
LM-хеши уязвимы для перебора

Рекомендуется использовать только NTLMv2 или Kerberos

Настройка через групповые политики


Шифрование сетевого трафика
Включение SMB Signing для защиты от перехвата

Использование Kerberos вместо NTLM, где это возможно

Обязательное применение TLS для RDP, WinRM и других протоколов


Credential Guard (Windows 10+/Server 2016+)
Изолированное хранение хешей в виртуализированной среде

Защита от извлечения хешей даже при компрометации системы

Включается через групповые политики


Ограничение прав доступа
Принцип минимальных привилегий для пользователей

Запрет использования доменных административных учетных записей на рабочих станциях

Применение LAPS для управления паролями локальных администраторов


Мониторинг и обнаружение
Анализ подозрительной активности (множественные входы с одного IP)

Контроль использования NTLM для критически важных ресурсов

Использование SIEM-систем для выявления аномалий

Заключение
Помните: понимание механизмов атак - первый шаг к построению надежной защиты. Эти знания помогут вам не только предотвращать известные угрозы, но и предугадывать новые векторы атак.