
DLLHijackHunter v2.5.0
Автоматизированное обнаружение, проверка и подтверждение подмены DLL. Превращение локальных неверных конфигураций в вооруженные, подтвержденные пути атаки.
DLLHijackHunter
Автор: ProjectMerai
Автоматизированное обнаружение, проверка и подтверждение DLL-хайжекинга
Превращение локальных ошибок конфигурации в подтверждённые векторы атак.
Обзор
DLLHijackHunter — это автоматизированный инструмент обнаружения DLL-хайжекинга в Windows, который выходит за рамки статического анализа. Он обнаруживает, проверяет и подтверждает возможности DLL-хайжекинга с помощью многоэтапного конвейера:
- Обнаружение — перечисляет исполняемые файлы в службах, запланированных задачах, элементах автозагрузки, COM-объектах и векторах обхода UAC AutoElevate
- Фильтрация — устраняет ложные срабатывания с помощью интеллектуальных жёстких и мягких фильтров
- Подтверждение канарейкой — разворачивает безвредную DLL-канарейку и запускает исполняемый файл, чтобы доказать работоспособность хайжека
- Оценка и отчётность — ранжирует находки по эксплуатируемости с помощью многоуровневой системы доверия
Большинство инструментов DLL-хайжекинга останавливаются на этапе «эта DLL может быть хайжекнута». DLLHijackHunter пытается проверить её, сопоставить с известной разведданной об эксплойтах и подтвердить реальные пути выполнения там, где это возможно.
Архитектура
flowchart TB
subgraph Phase1["Фаза 1: Обнаружение"]
SE["Статический движок<br/>Службы, задачи, автозагрузка,<br/>COM, ключи Run"]
AE["Движок AutoElevate<br/>Манифест + обход UAC через COM"]
PE["Анализатор PE<br/>Таблицы импорта, отложенные загрузки,<br/>манифесты, экспорты"]
ETW["Движок ETW<br/>Мониторинг загрузки DLL<br/>в реальном времени"]
SO["Калькулятор<br/>порядка поиска"]
end
subgraph Phase2["Фаза 2: Конвейер фильтрации"]
direction LR
HG["Жёсткие фильтры<br/>(исключение кандидата)"]
SG["Мягкие фильтры<br/>(корректировка доверия)"]
end
subgraph Phase3["Фаза 3: Проверка загрузки (--verify-load)"]
LP["LoadProbe<br/>Тест загрузки в дочернем процессе<br/>Пробная DLL размещается и удаляется"]
end
subgraph Phase4["Фаза 4: Канарейка"]
CB["Конструктор DLL-канарейки"]
TE["Исполнитель триггеров"]
VF["Проверка"]
end
subgraph Phase5["Фаза 5: Вывод"]
SC["Многоуровневая оценка"]
RC["Отчёт в консоль"]
RJ["Отчёт в JSON"]
RH["Отчёт в HTML"]
end
SE --> PE --> SO
AE --> PE
ETW --> SO
SO --> Phase2
HG --> SG
Phase2 --> Phase3
Phase3 --> Phase4
CB --> TE --> VF
Phase4 --> Phase5
Ключевые возможности
Покрытие типов хайжекинга
| Тип | Описание | Скрытность | Статус |
|---|---|---|---|
| Phantom | DLL не существует нигде на диске | Высокая | Реализовано |
| Search Order | Размещение DLL раньше в порядке поиска Windows | Высокая | Реализовано |
| Side-Loading | Злоупотребление загрузкой легитимным приложением DLL из своей директории | Высокая | Реализовано (путь AutoElevate copy-to-temp) |
| .local Redirect | Хайджек через перенаправление директории .local | Высокая | Реализовано |
| ENV PATH | Использование доступных для записи директорий в системном PATH | Высокая | Реализовано (подобранная карта служб/DLL) |
| AppInit DLLs | Злоупотребление реестром AppInit_DLLs | Низкая | Реализовано |
| AppCert DLLs | Злоупотребление реестром AppCertDLLs (загружается в каждый вызов CreateProcess/WinExec) | Низкая | Реализовано |
| CWD | Хайджек через текущую рабочую директорию | Низкая | Запланировано — в настоящее время не генерируется ни одним путём обнаружения |
Записи IFEO Debugger перечисляются, а указанный исполняемый файл анализируется на предмет импорта DLL, но выделенного типа хайджека IFEO/KnownDLL-bypass не существует — они не заявляются как отдельные детекции.
Обнаружение обхода UAC
DLLHijackHunter включает специализированное обнаружение обхода UAC:
- Манифест AutoElevate — сканирует
System32иSysWOW64на наличие EXE с<autoElevate>true</autoElevate>во встроенных манифестах - COM AutoElevation — сканирует
HKLM\SOFTWARE\Classes\CLSIDна наличие COM-объектов сElevation\Enabled=1 - Симуляция Side-Load — для исполняемых файлов AutoElevate, которые не вызывают
SetDllDirectoryилиSetDefaultDllDirectories, симулирует путь атаки «копирование EXE в доступную для записи папку + размещение DLL»
Целевая база знаний об уязвимостях
- Сопоставление целевых уязвимостей — перекрёстно сопоставляет обнаруженные импорты с встроенным снимком набора данных HijackLibs (≈590 задокументированных записей DLL, охватывающих ≈700 уязвимых исполняемых файлов), встроенным как
Resources/hijacklibs.json. Совпадение повышает доверие и связывает находку со страницей ссылок HijackLibs; отсутствие совпадения ничего не значит. Набор данных управляется данными — обновите его, повторно загрузивhttps://hijacklibs.net/api/hijacklibs.jsonповерх этого ресурса (без изменения кода). Набор данных © проект HijackLibs и его участники. - Автоматизированная эксплуатация PATH — оценивает доступные для записи папки
PATHи генерирует кандидатов на хайджек для подобранной карты нативных служб Windows, известных тем, что ищут отсутствующие DLL вPATH - Расширенный поиск phantom DLL — ищет библиотеку ценных возможностей phantom DLL по нескольким категориям
Конвейер фильтрации
Конвейер снижает количество ложных срабатываний в два этапа:
Жёсткие фильтры
- Фильтрация схем API-наборов (
api-ms-*,ext-ms-*) - Фильтрация KnownDLL
- Проверка доступности записи ACL относительно атакующего — путь считается доступным для записи только если непривилегированный субъект (
Users/Authenticated Users/Everyone, а также защищённые от утечек служебные учётные записи ниже администратора, такие какLOCAL SERVICE/NETWORK SERVICE) имеет эффективные права записи. Важно, что это вычисляется независимо от токена, под которым работает инструмент, поэтому запуск с повышенными привилегиями не делаетSystem32/Program Filesдоступными для записи. Именно это делает запуски с повышенными привилегиями значимыми для триажа LPE.
Мягкие фильтры
- Штраф за манифест WinSxS
- Анализ дельты привилегий
- Проверки обходных мер
LoadLibraryEx - Проверки проверки подписи
- Штрафы за корректную обработку ошибок
Подтверждение канарейкой
Вместо предположений DLLHijackHunter пытается доказать работоспособность хайджеков:
sequenceDiagram
participant H as DLLHijackHunter
participant B as Конструктор DLL-канарейки
participant T as Исполнитель триггеров
participant V as Целевой исполняемый файл
H->>B: Создать DLL-канарейку
B->>B: Извлечь предкомпилированную канарейку<br/>(или скомпилировать прокси с помощью MSVC)
B-->>H: canary.dll + путь к файлу подтверждения
H->>H: Разместить DLL по пути хайджека
H->>T: Запустить исполняемый файл
T->>V: Запустить службу / выполнить задачу / активировать COM
V->>V: Загружает DLL-канарейку
V-->>H: Записывает файл подтверждения<br/>PID, привилегии, уровень целостности
H->>H: Запись: ПОДТВЕРЖДЕНО
H->>H: Очистка DLL-канарейки
DLL-канарейка:
- Поставляется предкомпилированной для x64 и x86, встроенной в сканер, поэтому компилятор не требуется во время сканирования. Правильная архитектура выбирается в соответствии с разрядностью целевого процесса и извлекается по требованию.
- Самоопределяется: выводит путь к файлу подтверждения во время выполнения из пути собственного загруженного модуля (
%ProgramData%\DLLHijackHunter\canary_<hash>.confirm), поэтому один бинарный файл служит для каждого кандидата. Сканер вычисляет тот же хэш из пути развёртывания и опрашивает этот файл. - Использует механизм подтверждения на основе файла
- Захватывает метаданные выполнения, такие как пользователь, уровень целостности и индикаторы привилегий
- Не содержит вредоносной полезной нагрузки; это строго механизм обнаружения и проверки
- Статически связывает CRT, поэтому не имеет зависимостей времени выполнения (ucrtbase/vcruntime) на целевом хосте.
Встроенные бинарные файлы собраны из проверяемого исходного кода в src/DLLHijackHunter/Resources/canary_src.c и могут быть перегенерированы с помощью Resources/build_canary.bat (требуется инструментарий MSVC C++; сканеру он не нужен).
Исключение функционального прокси: Когда хайджек порядка поиска нацелен на DLL, которая существует и предоставляет экспорты, для поддержания жизни хоста после подтверждения требуется прокси с пересылкой экспортов, который компилируется для каждой DLL с помощью MSVC (
cl.exe, находится черезvswhere/vcvarsall). Если инструментарий отсутствует, вместо него используется предкомпилированная канарейка — она по-прежнему подтверждает загрузку (срабатывает DllMain), но не пересылает экспорты, поэтому процесс хоста может завершиться после записи подтверждения. Кандидатам Phantom-DLL и другим без экспортов компилятор вообще не нужен.
Подпись: Встроенные канарейки не подписаны. Подпись кода (чтобы они загружались при более строгих политиках и были атрибутируемы) требует сертификата подписи и оставлена как шаг на этапе выпуска для сопровождающего.
Важное примечание о режиме прокси/пересылки экспортов
Канарейки-прокси с пересылкой экспортов экспериментальны и best-effort. Некоторые цели могут не загружаться корректно или вести себя неожиданно в зависимости от:
- экспортов только по порядковым номерам
- декорированных имён экспортов
- несоответствий соглашений о вызовах
- предположений загрузчика/времени выполнения в целевом процессе
Это означает, что неудачная канарейка-прокси не всегда означает, что базовый путь хайджека невозможен.
Проверка порядка загрузки (--verify-load)
Опциональная проверка от имени стандартного пользователя, которая находится между конвейером фильтрации и фазой канарейки. Для каждого применимого кандидата она кратко записывает безвредную пробную DLL в доступную для записи позицию хайджека, а затем спрашивает настоящий загрузчик Windows — в недолговечном дочернем процессе — разрешить DLL по имени. То, где загрузчик разрешает, определяет вердикт:
- Проверенная победа — загрузчик выбирает доступную для записи позицию. Утверждение о порядке поиска доказано (это подтверждение позволяет находке достичь уровня High; выполнение канарейки остаётся единственным путём к Confirmed).
- Проигрыш защищённым — загрузчик выбирает KnownDLL, копию из System32 или перенаправленную копию SxS. Позиция почти наверняка не хайджекнута, поэтому кандидат сильно понижается. Это ловит классические ложные срабатывания, которые пропускает статический калькулятор порядка поиска (например, «находку»
.local/порядка поиска дляntdll.dll, которую KnownDLLs делает неэксплуатируемой).
Замечания по дизайну и безопасности:
- Выполняется в дочернем процессе, чтобы имя, уже загруженное в сканер, не могло сократить результат, и чтобы любой побочный эффект загрузки или сбой был изолирован. Повышение привилегий не требуется.
- Каждый пробник размещается, разрешается, а затем удаляется; любой существующий файл резервируется и восстанавливается.
- Он моделирует современный порядок
LOAD_LIBRARY_SEARCH, поэтому применяется только к кандидатам Phantom / Search-Order / Side-Load. Кандидаты.local, PATH и AppInit/AppCert используют другие механизмы и сообщаются как Skipped. - Он временно записывает файлы в позиции кандидатов (среднее воздействие); отключите его для полностью пассивного триажа только для чтения.
# Триаж от имени стандартного пользователя с проверкой порядка поиска загрузчиком (без канарейки, без ETW)
.\DLLHijackHunter.exe --lpe-only --no-canary --no-etw --verify-load
Сравнение
| Функция | DLLHijackHunter | Robber | DLLSpy | WinPEAS | Procmon |
|---|---|---|---|---|---|
| Автоматизированное обнаружение | ✅ | ✅ | ✅ | ✅ | ❌ |
| Обнаружение phantom DLL | ✅ | ❌ | ✅ | ❌ | ✅ |
| Анализ порядка поиска | ✅ | ❌ | ❌ | ❌ | ❌ |
| Проверка доступности записи на основе ACL | ✅ | Частично | ❌ | Базовая | ❌ |
| Мониторинг ETW в реальном времени | ✅ | ❌ | ❌ | ❌ | ✅ |
| Подтверждение канарейкой | ✅¹ | ❌ | ❌ | ❌ | ❌ |
| Проверка повышения привилегий | ✅ | ❌ | ❌ | ❌ | ❌ |
| Обнаружение обхода UAC | ✅ | ❌ | ❌ | ❌ | ❌ |
| Снижение ложных срабатываний | ✅² | Нет | Базовая | Нет | Нет |
| Проверка сохранения после перезагрузки | ✅³ | ❌ | ❌ | ❌ | ❌ |
| Генерация прокси-DLL | ✅⁴ | ❌ | ❌ | ❌ | ❌ |
| Оценка доверия | ✅ | ❌ | ❌ | ❌ | ❌ |
| Автоматический триггер (svc/task/COM) | ✅⁵ | ❌ | ❌ | ❌ | ❌ |
| Отчёты HTML/JSON | ✅ | ❌ | ❌ | TXT | ❌ |
| Корреляция с разведданными об угрозах | ✅⁶ | ❌ | ❌ | ❌ | ❌ |
| Автоматизированные эксплойты PATH | ✅ | ❌ | ❌ | ❌ | ❌ |
| Сканирование конкретных целей | ✅ | ❌ | ❌ | ❌ | ✅ |
| Самодостаточный бинарный файл | ✅ | ❌ | ❌ | ✅ | ❌ |
² Через проверку доступности записи ACL относительно атакующего (см. Конвейер фильтрации). Это снижает — но не устраняет — ложные срабатывания; эвристики мягких фильтров (манифест/SxS/LoadLibraryEx) всё ещё несут неопределённость. Непроверенные статические находки теперь ограничены ниже уровня **High**.
³ Выводится из статуса автозапуска, а не проверенного теста перезагрузки.
⁴ Прокси с пересылкой экспортов экспериментален/best-effort (см. примечание выше).
⁵ Только триггеры служб/задач/COM; находки обхода UAC не запускаются канарейкой.
⁶ Поддерживается встроенным снимком набора данных HijackLibs (~590 записей); обновляется с hijacklibs.net.
Использование
Предварительные требования
- Windows 10/11 или Windows Server 2016+
- .NET 8.0 или 10.0 Runtime (или используйте самодостаточную сборку)
- Права администратора рекомендуются (требуются для ETW, развёртывания канарейки и некоторых триггеров служб)
Сборка
git clone https://github.com/ghostvectoracademy/DLLHijackHunter.git
cd DLLHijackHunter
# Сборка (самодостаточный одиночный файл)
dotnet publish src/DLLHijackHunter/DLLHijackHunter.csproj `
-c Release -r win-x64 --self-contained `
-p:PublishSingleFile=true -o ./publish
# Или используйте скрипт сборки
.\build.ps1
Быстрый старт
# Полное агрессивное сканирование (рекомендуется, требует администратора)
.\DLLHijackHunter.exe --profile aggressive
# Безопасное сканирование (без записи файлов, без триггеров)
.\DLLHijackHunter.exe --profile safe
# Сканирование, сфокусированное на обходе UAC
.\DLLHijackHunter.exe --profile uac-bypass
# Нацеливание на конкретный бинарный файл
.\DLLHijackHunter.exe --target "C:\Program Files\MyApp\app.exe"
# Нацеливание по имени файла (частичное совпадение)
.\DLLHijackHunter.exe --target notepad.exe
# Только подтверждённые находки
.\DLLHijackHunter.exe --profile redteam --format json -o report.json
Параметры CLI
DLLHijackHunter — Автоматизированное обнаружение DLL-хайжекинга
Параметры:
-p, --profile <profile> Профиль сканирования [по умолчанию: aggressive]
aggressive | strict | safe | redteam | uac-bypass
-o, --output <path> Путь к выходному файлу (формат определяется автоматически)
-f, --format <format> Формат вывода [по умолчанию: console]
console | json | html
-t, --target <target> Нацеливание на конкретный бинарный файл, директорию или имя файла
--min-confidence <value> Минимальный порог доверия 0-100. Если не указан, применяется
порог выбранного профиля; передача этого параметра переопределяет его.
--no-canary Отключить подтверждение канарейкой
--no-etw Отключить обнаружение ETW во время выполнения
--verify-load Проверить порядок поиска с помощью реального загрузчика (см. ниже).
От имени стандартного пользователя; временно записывает безвредный пробник.
--confirmed-only Показывать только находки, подтверждённые канарейкой
--lpe-only Строгий поиск LPE: игнорировать System32/Program Files, показывать
только уязвимости, доступные для записи стандартному пользователю
--log-file <path> Записать диагностический журнал сканирования в файл
-v, --verbose Подробный вывод
Примечание:
--min-confidenceрассматривается как переопределение только при явной передаче. В противном случае используется порог выбранного профиля (например,safe= 50%,strict= 80%).
Профили сканирования
| Профиль | Сценарий использования | Канарейка | ETW | Обход UAC | Мин. доверие | Триггеры |
|---|---|---|---|---|---|---|
| aggressive | Полный аудит, лабораторные среды | ✅ | ✅ | ✅ | 15% | Службы, задачи, COM |
| strict | Только находки с высоким доверием | ✅ | ✅ | ❌ | 80% | Службы, задачи |
| safe | Производственные системы, только чтение | ❌ | ❌ | ❌ | 50% | Нет |
| redteam | Только подтверждённо эксплуатируемые | ✅ | ✅ | ❌ | 50% | Службы, задачи, COM |
| uac-bypass | Только векторы обхода UAC | ❌ | ❌ | ✅ | 20% | Только AutoElevate |
Оценка
Каждая находка получает сигналы доверия и воздействия, которые объединяются в итоговый уровень приоритизации.
Типичные соображения воздействия включают:
- полученные привилегии
- надёжность триггера
- скрытность
- сохранение после перезагрузки
Подтверждённое выполнение канарейки следует рассматривать как самый сильный сигнал валидации.
Ограничение уровней: уровни High и Confirmed зарезервированы для находок, подкреплённых сигналом доказательства — сработавшей канарейкой, наблюдением загрузки ETW во время выполнения или задокументированным совпадением с базой знаний. Чисто статическое совпадение порядка поиска, каким бы чистым оно ни было, ограничено верхом уровня Medium и помечается как Static-only, чтобы непроверенные эвристики никогда не представлялись как высокодостоверные.
Рекомендуемая конфигурация триажа
Поскольку доступность записи оценивается относительно атакующего, запуски как с повышенными привилегиями, так и от стандартного пользователя значимы:
- Для триажа LPE наиболее надёжной конфигурацией является запуск от стандартного пользователя с
--lpe-only(и--no-canary, если компилятор недоступен) — каждая выжившая находка действительно доступна для записи непривилегированному субъекту. - Запуски с повышенными привилегиями требуются для ETW и подтверждения канарейкой и теперь защищены от исторической инверсии «всё в System32 выглядит доступным для записи».
Безопасность
DLLHijackHunter предназначен для оборонительных исследований безопасности, лабораторной валидации, аудита и симуляции красных команд в авторизованных средах.
Используйте его только на системах и сетях, которыми вы владеете или на оценку которых у вас есть явное разрешение.
Эксплуатационные примечания
- Режим канарейки записывает тестовые DLL в позиции кандидатов
- Некоторые триггеры могут кратко запускать или останавливать службы/задачи во время валидации
- Канарейки-прокси с пересылкой экспортов могут дестабилизировать хрупкие цели
- Профиль safe — предпочтительный режим для производственного триажа, когда запись файлов и триггеры неприемлемы
Вывод
DLLHijackHunter поддерживает:
- отчёт в консоль
- экспорт в JSON
- экспорт в HTML
Рекомендуемый рабочий процесс:
- выполните широкое сканирование
- просмотрите находки с высоким доверием
- используйте подтверждение канарейкой выборочно на ценных путях
- сохраните вывод JSON/HTML для отчётности и триажа
Лицензия
MIT
Авторы
Создано ProjectMerai.