![]() |
https://forum.antichat.xyz/attachmen...6ef858b08c.png
Антивирус говорит «система чиста», а сетевой трафик тем временем утекает на подозрительный C2-сервер. Знакомая картина? Значит, вы наткнулись на kernel-mode руткит. Не на ту поделку, что прячет файлы через перехват FindFirstFile в user-mode, а на зверя, который работает на одном уровне привилегий с самой ОС и напрямую ковыряет структуру ядра. По данным Positive Technologies, руткиты - меньше 1% от всех вредоносных программ. Но каждый такой случай - это серьёзный инцидент: APT-кампании, скрытый майнинг на десятках тысяч машин. Причина простая: руткит режима ядра - верхняя точка эскалации, после которой атакующий контролирует всё, что видит (и чего не видит) операционная система. В MITRE ATT&CK руткиты описаны как техника T1014 (Rootkit). Но реальный руткит - это не одна техника, а комбо (полную классификацию с матрицей обнаружения см. в обзоре техник руткитов): DKOM для скрытия процессов, SSDT hooking для перехвата системных вызовов, minifilter-драйверы для фильтрации файлового I/O и манипуляции с kernel callbacks, чтобы ослепить средства защиты (T1562.001, Disable or Modify Tools). Дальше разберём каждую из этих техник на уровне структур ядра Windows и покажем, как их ловить с помощью WinDbg и Volatility - не по туториалу из первой ссылки в Google, а по реальной методологии анализа. DKOM атака Windows: как работает скрытие процессов через ActiveProcessLinks DKOM (Direct Kernel Object Manipulation) - классика kernel-mode руткитов. Атакующий напрямую правит структуры данных ядра без штатных API. Самый ходовой сценарий - скрытие процесса через удаление из двусвязного списка Код:
ActiveProcessLinksМеханика на уровне ядра Каждый процесс в Windows представлен структурой Код:
EPROCESSКод:
ActiveProcessLinksКод:
LIST_ENTRYКод:
FlinkКод:
BlinkКод:
PsActiveProcessHeadКогда диспетчер задач или Process Explorer запрашивают список процессов через Код:
NtQuerySystemInformationКод: Код:
// Концептуальный псевдокод DKOM-скрытияКод:
PsActiveProcessHeadНюанс: DKOM не ограничивается процессами. Та же техника применяется к спискам драйверов ( Код:
PsLoadedModuleListОбнаружение DKOM в WinDbg Первый шаг - получить список процессов двумя независимыми способами и сравнить. В WinDbg в kernel-mode сессии: Код: Код:
kd> !process 0 0Код:
PsActiveProcessHeadТеперь сравним с другим источником - пулом памяти ядра. Каждый Код:
EPROCESSКод:
ProcКод: Код:
kd> !poolfind Proc 0Код:
EPROCESSКод:
!process 0 0Код:
!poolfindКод:
!poolfindКод:
!poolused ProcКод:
psscanКод: Код:
kd> dt nt!_EPROCESSКод:
ActiveProcessLinks.FlinkКод:
ActiveProcessLinks.BlinkДля проверки целостности цепочки можно пройти весь список вручную: Код: Код:
kd> dl nt!PsActiveProcessHead 200 2Код:
dlОбнаружение DKOM в Volatility Volatility решает проблему обнаружения DKOM через кросс-валидацию - сравнение разных источников информации о процессах. Ключевой плагин - Код:
psxviewКод:
windows.pslistКод:
windows.psscanBash: Код:
# Volatility 2Код:
psxviewИсточникЧто проверяетОбходится DKOMPsActiveProcessHeadДвусвязный список EPROCESSДаETHREAD scanningПотоки, ссылающиеся на процессНетPool tag scanning (psscan)Сигнатуры EPROCESS в памятиНетPspCidTableТаблица объектов по PID/TIDЧастичноCsrss handlesХэндлы csrss.exe к процессамЧастичноSession listСписок процессов в сессииЧастично Если процесс виден в Код:
psscanКод:
pslistКод:
ActiveProcessLinksКод:
pslistКод:
psscanBash: Код:
# Прямое сравнение двух плагиновSSDT (System Service Descriptor Table) - таблица с адресами обработчиков системных вызовов ядра. Когда user-mode код вызывает Код:
NtCreateFileКод:
syscallКод:
sysenterКод:
KiSystemServiceМеханика SSDT hook Руткит подменяет адрес в таблице SSDT, заставляя ядро вызывать свой обработчик вместо оригинального. Через это можно перехватить что угодно: скрывать файлы через хук Код:
NtQueryDirectoryFileКод:
NtQuerySystemInformationКод:
NtDeviceIoControlFileНа современных 64-битных Windows SSDT хранит не абсолютные адреса, а относительные смещения. Каждая запись - 4-байтовое значение, где верхние 28 бит - смещение от базы Код:
KeServiceDescriptorTableНа 64-битных Windows с активным PatchGuard (Kernel Patch Protection) прямая модификация SSDT вызывает BSOD с кодом Код:
CRITICAL_STRUCTURE_CORRUPTIONОбнаружение SSDT hooking через WinDbg Смотрим базу SSDT и проверяем, что все адреса указывают внутрь ntoskrnl.exe: Код: Код:
kd> dps nt!KiServiceTable L 0x200Код:
nt!Nt*Проверяем диапазон ntoskrnl: Код: Код:
kd> lm m ntКод: Код:
kd> dd nt!KiServiceTable L 0x10Код:
базовый_адрес + (offset >> 4)Для проверки конкретного системного вызова, например Код:
NtCreateFileКод: Код:
kd> u nt!NtCreateFileКод:
jmpОбнаружение SSDT hooks в Volatility Bash: Код:
# Volatility 2Код:
ssdtКод:
ntoskrnl.exeКод:
win32k.sysКод: Код:
# Пример подозрительного вывода (для демонстрации концепции)Код: Код:
Entry 0x0049: 0xfffff80001234567 ntoskrnl.exe!NtQueryDirectoryFileMinifilter-драйверы - легитимный фреймворк Windows (Filter Manager, Код:
fltmgr.sysКак работает minifilter Filter Manager организует minifilter-драйверы в стек по altitude - числовому значению, определяющему приоритет обработки. Антивирусные фильтры обычно имеют altitude 320000–329999, фильтры шифрования - 140000–149999. Каждый minifilter регистрирует callback-функции для конкретных операций (Pre-Operation и Post-Operation): создание файла, чтение, запись, запрос директории. Вредоносный minifilter может:
Обнаружение вредоносных minifilter-драйверов В WinDbg проверяем загруженные minifilter-драйверы: Код: Код:
kd> !fltkd.filtersКод:
!fltkdКод: Код:
kd> !fltkd.frames
Код: Код:
kd> !fltkd.filterВ Volatility minifilter-анализ доступен через плагин Код:
driverirpBash: Код:
# driverirp -r fltmgr показывает IRP dispatch table самого fltmgr.sys,Код:
driverscanКод:
modscanКод:
PsLoadedModuleListКод:
!fltkd.filtersКод:
FLT_FILTERKernel callback manipulation: нейтрализация защитных механизмов Ядро Windows предоставляет набор notification callback-механизмов, которые средства защиты используют для мониторинга системных событий. Руткиты манипулируют этими callback-таблицами, чтобы «ослепить» антивирусы и EDR. Целевые callback-механизмы CallbackФункция регистрацииНазначениеProcess creationPsSetCreateProcessNotifyRoutine(Ex)Уве омление о создании/завершении процессовThread creationPsSetCreateThreadNotifyRoutineУведом ление о создании потоковImage loadPsSetLoadImageNotifyRoutineУведомлен е о загрузке образов (DLL, EXE)RegistryCmRegisterCallbackExУведомлен ие об операциях с реестромObject accessObRegisterCallbacksФильтрация доступа к объектам (процессам, потокам) EDR-решения регистрируют свои callback-функции через эти API. Руткит может:
Обнаружение callback-манипуляций в WinDbg Проверяем массив notification routines для процессов: Код: Код:
kd> dt nt!_EX_CALLBACK_ROUTINE_BLOCKКод: Код:
kd> x nt!PspCreateProcessNotifyRoutineКод:
EX_CALLBACK_ROUTINE_BLOCKАналогично для потоков и загрузки образов: Код: Код:
kd> dps nt!PspLoadImageNotifyRoutine L 0x40Код:
ObTypeInitializerКод:
ProcessКод:
ThreadКод: Код:
kd> !object \ObjectTypes\ProcessBash: Код:
# Volatility 2Код:
callbacks
Ниже - пошаговая методология для реального дампа памяти подозрительной системы. Последовательность выстроена так, чтобы каждый шаг сужал область поиска. Шаг 1: Снятие дампа памяти Используем WinPmem или DumpIt для получения raw memory dump. Если подозревается руткит - не доверяйте инструментам, работающим из-под скомпрометированной системы. Идеально - DMA-устройство (PCILeech) или дамп через гипервизор. На практике часто приходится довольствоваться WinPmem с USB-носителя - не идеал, но лучше, чем ничего. Bash: Код:
# WinPmem (запуск с USB-носителя)Bash: Код:
python vol.py -f output.raw windows.pslistШаг 3: Проверка SSDT и драйверов Bash: Код:
python vol.py -f output.raw windows.ssdtКод:
ssdtКод:
ntoskrnl.exeКод:
win32k.sysКод:
driverscanКод:
modulesШаг 4: Анализ callbacks Bash: Код:
python vol.py -f output.raw windows.callbacksШаг 5: Углублённый анализ в WinDbg Если на шагах 2-4 обнаружены аномалии, открываем дамп в WinDbg для детальной процедуры: Код: Код:
kd> .sympath srv*c:\symbols*https://msdl.microsoft.com/download/symbolsКод:
ActiveProcessLinksКод:
ImageFileNameШаг 6: Восстановление полной картины Для каждого обнаруженного артефакта фиксируем:
На 64-битных Windows PatchGuard (Kernel Patch Protection) защищает критические структуры ядра: SSDT, GDT, IDT, системные образы, структуры объектов процессов. Периодические проверки целостности вызывают BSOD при обнаружении модификаций. Классический SSDT hooking на современных 64-битных Windows - техника с высоким риском словить BSOD. Поэтому современные руткиты смещают фокус:
Что упускают стандартные средства защиты Большинство антивирусов работают в user-mode или используют ограниченный набор kernel callbacks. Kernel-mode руткит, работающий на том же уровне привилегий, может:
Rootkit обнаружение Windows - это всегда комбинация: кросс-валидация (сравнение нескольких источников данных о процессах), проверка целостности критических структур (SSDT, callback-массивы) и анализ загруженных драйверов (minifilter-стек, неподписанные модули). Ни один инструмент не ловит всё - поэтому WinDbg и Volatility работают в паре, компенсируя ограничения друг друга. Попробуйте прогнать свой дамп по workflow из шагов 1-6 - даже на «чистой» системе результаты бывают... познавательными. |
| Время: 06:50 |