
Автоматизированное обнаружение, проверка и подтверждение подмены DLL. Превращение локальных неверных конфигураций в вооруженные, подтвержденные пути атаки.
Автоматизированное обнаружение, проверка и подтверждение DLL-хайжекинга
Превращение локальных ошибок конфигурации в подтверждённые векторы атак.
DLLHijackHunter — это автоматизированный инструмент обнаружения DLL-хайжекинга в Windows, который выходит за рамки статического анализа. Он обнаруживает, проверяет и подтверждает возможности 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Записи IFEO Debugger перечисляются, а указанный исполняемый файл анализируется на предмет импорта DLL, но выделенного типа хайджека IFEO/KnownDLL-bypass не существует — они не заявляются как отдельные детекции.
DLLHijackHunter включает специализированное обнаружение обхода UAC:
System32 и SysWOW64 на наличие EXE с <autoElevate>true</autoElevate> во встроенных манифестахHKLM\SOFTWARE\Classes\CLSID на наличие COM-объектов с Elevation\Enabled=1SetDllDirectory или SetDefaultDllDirectories, симулирует путь атаки «копирование EXE в доступную для записи папку + размещение DLL»Resources/hijacklibs.json. Совпадение повышает доверие и связывает находку со страницей ссылок HijackLibs; отсутствие совпадения ничего не значит. Набор данных управляется данными — обновите его, повторно загрузив https://hijacklibs.net/api/hijacklibs.json поверх этого ресурса (без изменения кода). Набор данных © проект HijackLibs и его участники.PATH и генерирует кандидатов на хайджек для подобранной карты нативных служб Windows, известных тем, что ищут отсутствующие DLL в PATHКонвейер снижает количество ложных срабатываний в два этапа:
Жёсткие фильтры
api-ms-*, ext-ms-*)Users / Authenticated Users / Everyone, а также защищённые от утечек служебные учётные записи ниже администратора, такие как LOCAL SERVICE/NETWORK SERVICE) имеет эффективные права записи. Важно, что это вычисляется независимо от токена, под которым работает инструмент, поэтому запуск с повышенными привилегиями не делает System32/Program Files доступными для записи. Именно это делает запуски с повышенными привилегиями значимыми для триажа LPE.Мягкие фильтры
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-канарейка:
%ProgramData%\DLLHijackHunter\canary_<hash>.confirm), поэтому один бинарный файл служит для каждого кандидата. Сканер вычисляет тот же хэш из пути развёртывания и опрашивает этот файл.Встроенные бинарные файлы собраны из проверяемого исходного кода в 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 по имени. То, где загрузчик разрешает, определяет вердикт:
.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
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
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%).
Каждая находка получает сигналы доверия и воздействия, которые объединяются в итоговый уровень приоритизации.
Типичные соображения воздействия включают:
Подтверждённое выполнение канарейки следует рассматривать как самый сильный сигнал валидации.
Ограничение уровней: уровни High и Confirmed зарезервированы для находок, подкреплённых сигналом доказательства — сработавшей канарейкой, наблюдением загрузки ETW во время выполнения или задокументированным совпадением с базой знаний. Чисто статическое совпадение порядка поиска, каким бы чистым оно ни было, ограничено верхом уровня Medium и помечается как Static-only, чтобы непроверенные эвристики никогда не представлялись как высокодостоверные.
Поскольку доступность записи оценивается относительно атакующего, запуски как с повышенными привилегиями, так и от стандартного пользователя значимы:
--lpe-only (и --no-canary, если компилятор недоступен) — каждая выжившая находка действительно доступна для записи непривилегированному субъекту.DLLHijackHunter предназначен для оборонительных исследований безопасности, лабораторной валидации, аудита и симуляции красных команд в авторизованных средах.
Используйте его только на системах и сетях, которыми вы владеете или на оценку которых у вас есть явное разрешение.
DLLHijackHunter поддерживает:
Рекомендуемый рабочий процесс:
MIT
Создано ProjectMerai.
| Тип | Описание | Скрытность | Статус |
|---|
| 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 | Хайджек через текущую рабочую директорию | Низкая | Запланировано — в настоящее время не генерируется ни одним путём обнаружения |
| Функция | DLLHijackHunter | Robber | DLLSpy | WinPEAS | Procmon |
|---|
| Автоматизированное обнаружение | ✅ | ✅ | ✅ | ✅ | ❌ |
| Обнаружение phantom DLL | ✅ | ❌ | ✅ | ❌ | ✅ |
| Анализ порядка поиска | ✅ | ❌ | ❌ | ❌ | ❌ |
| Проверка доступности записи на основе ACL | ✅ | Частично | ❌ | Базовая | ❌ |
| Мониторинг ETW в реальном времени | ✅ | ❌ | ❌ | ❌ | ✅ |
| Подтверждение канарейкой | ✅¹ | ❌ | ❌ | ❌ | ❌ |
| Проверка повышения привилегий | ✅ | ❌ | ❌ | ❌ | ❌ |
| Обнаружение обхода UAC | ✅ | ❌ | ❌ | ❌ | ❌ |
| Снижение ложных срабатываний | ✅² | Нет | Базовая | Нет | Нет |
| Проверка сохранения после перезагрузки | ✅³ | ❌ | ❌ | ❌ | ❌ |
| Генерация прокси-DLL | ✅⁴ | ❌ | ❌ | ❌ | ❌ |
| Оценка доверия | ✅ | ❌ | ❌ | ❌ | ❌ |
| Автоматический триггер (svc/task/COM) | ✅⁵ | ❌ | ❌ | ❌ | ❌ |
| Отчёты HTML/JSON | ✅ | ❌ | ❌ | TXT | ❌ |
| Корреляция с разведданными об угрозах | ✅⁶ | ❌ | ❌ | ❌ | ❌ |
| Автоматизированные эксплойты PATH | ✅ | ❌ | ❌ | ❌ | ❌ |
| Сканирование конкретных целей | ✅ | ❌ | ❌ | ❌ | ✅ |
| Самодостаточный бинарный файл | ✅ | ❌ | ❌ | ✅ | ❌ |
| Профиль | Сценарий использования | Канарейка | ETW | Обход UAC | Мин. доверие | Триггеры |
|---|
| aggressive | Полный аудит, лабораторные среды | ✅ | ✅ | ✅ | 15% | Службы, задачи, COM |
| strict | Только находки с высоким доверием | ✅ | ✅ | ❌ | 80% | Службы, задачи |
| safe | Производственные системы, только чтение | ❌ | ❌ | ❌ | 50% | Нет |
| redteam | Только подтверждённо эксплуатируемые | ✅ | ✅ | ❌ | 50% | Службы, задачи, COM |
| uac-bypass | Только векторы обхода UAC | ❌ | ❌ | ✅ | 20% | Только AutoElevate |