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

Введение

Представьте, что компьютерная программа — это дом с правилами (архитектура, протоколы). Эксплойт — это находчивый взломщик, который ищет лазейки в этих правилах (например, дверь, которую забыли запереть, или доверчивого охранника). Сегодня разберем две такие "лазейки": одну в самом фундаменте программ (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-запись.

Шаги атаки:
  1. Найти уязвимость: Программа копирует пользовательские данные (например, из файла или сети) в буфер фиксированного размера в стеке без проверки длины.
  2. Переполнить буфер: Атакующий посылает данных больше, чем размер буфера.
  3. Затопить стек: Избыточные данные перезаписывают:
  • Локальные переменные после буфера.
  • Адрес возврата из функции (если есть).
  • Ключевой момент: Перезаписывают SEH-записьв стеке. Атакующий подменяет:
    • Pointer to Next SEH Record (часто используется для размещения небольшой инструкции типа jmp).
    • Pointer to Exception Handler — ГЛАВНАЯ ЦЕЛЬ! Атакующий подставляет здесь адрес участка памяти под своим контролем (часто где-то в переполненных данных).
  1. Спровоцировать исключение: Атакующий заставляет программу совершить ошибку после переполнения (например, обращение к неверному адресу памяти, который он же и подсунул).
  2. Срабатывание подмененного обработчика: Система видит исключение. Она идет по цепочке SEH и натыкается на подмененный Pointer to Exception Handler. Система доверяет этому указателю и передает управление по этому адресу.
  3. Выполнение кода атакующего: По адресу обработчика атакующий разместил свой вредоносный код (шеллкод), или код, который перенаправляет поток выполнения на шеллкод (часто с помощью инструкции по 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). При обработке исключения система проходит всю цепочку и проверяет:
  1. Корректность связей между записями (указатель Next SEH должен вести на следующую запись).
  2. Наличие "заглушки" в конце.
Почему это мешает атакующему:
  • При 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, которые для подтверждения подлинности проверяют знание хеша пароля, а не сам пароль.

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

  1. Кража хешей
    • Извлечение из памяти процесса LSASS (хранит хеши активных сессий)
    • Получение из локальной базы SAM (для локальных учетных записей)
    • Перехват сетевого трафика аутентификации NTLM
    • Доступ к файлам с кэшированными учетными данными
  2. Использование хеша
    • Атакующий инициирует аутентификацию
    • Сервер отправляет случайный challenge
    • Атакующий шифрует challenge украденным хешем
    • Сервер, проверив ответ, предоставляет доступ
  3. Перемещение в сети
    • Используя полученные хеши, злоумышленник перемещается между системами
    • Повышает привилегии, получая доступ к более важным учетным записям
    • В конечном итоге получает полный контроль над инфраструктурой

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

  1. Отключение устаревших LM-хешей
    • LM-хеши уязвимы для перебора
    • Рекомендуется использовать только NTLMv2 или Kerberos
    • Настройка через групповые политики
  2. Шифрование сетевого трафика
    • Включение SMB Signing для защиты от перехвата
    • Использование Kerberos вместо NTLM, где это возможно
    • Обязательное применение TLS для RDP, WinRM и других протоколов
  3. Credential Guard (Windows 10+/Server 2016+)
    • Изолированное хранение хешей в виртуализированной среде
    • Защита от извлечения хешей даже при компрометации системы
    • Включается через групповые политики
  4. Ограничение прав доступа
    • Принцип минимальных привилегий для пользователей
    • Запрет использования доменных административных учетных записей на рабочих станциях
    • Применение LAPS для управления паролями локальных администраторов
  5. Мониторинг и обнаружение
    • Анализ подозрительной активности (множественные входы с одного IP)
    • Контроль использования NTLM для критически важных ресурсов
    • Использование SIEM-систем для выявления аномалий

Заключение

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab