Алексей Баландин, Security Vision

На сегодняшний день невозможно представить защиту конечных точек без системы EDR, которая, в отличие от устаревшего антивируса, основана в первую очередь на поведенческом анализе происходящих в системе событий. Потребность в этой системе резко возросла за последние 10 лет в связи с тем, что угрозы совершенствуются из года в год. Давно стало очевидно, что эффективно противостоять атакующим можно не столько за счет статического анализа кода, сигнатурного метода, сколько за счет изучения, анализа и блокировки их поведенческих паттернов, используемых тактик, техник и процедур. Этим и занимается класс продуктов EDR и активно развивается за счет постоянного пополнения базы знаний о новых методах атак. Обратной стороной медали является то, что атакующие не стоят на месте и разрабатывают все новые способы обхода и противодействия EDR. Далее рассмотрим техники обхода EDR, которые были наиболее популярны у атакующих за последние 5 лет.


В этой статье техники обхода антивируса будут рассматриваться лишь частично, который зачастую является частью самого EDR. Основной акцент будет сделан на обзор техник, направленных на обход поведенческих алгоритмов EDR. Ниже приведен список техник обхода, о которых поговорим далее.

1. Process Hollowing и классическая DLL Injection
2. Reflective DLL Loading
3. API Unhooking, Manual mapping
4. ETW patching
5. Direct Syscalls, Indirect Syscalls
6. Bring Your Own Installer (BYOI)
7. Bring Your Own Vulnerable Driver (BYOVD)
8. DLL Hijacking & Side-Loading
9. Service Abuse
10. Living Off The Land утилиты

1. Process Hollowing и классическая DLL Injection

Эти две давние техники Code Injection направлены на внедрение кода в легитимные процессы с целью повышения привилегий, уклонения от средств Application Whitelisting, антивируса.

Process Hollowing заменяет код легитимного, запущенного процесса на вредоносный, сохраняя имя и метаданные процесса. Это достигается через создание процесса в приостановленном (suspended) состоянии, выгрузку/замену его образа в памяти, корректировку контекста и возобновление выполнения. Техника требует работы с PE-форматом, релокациями, импортами и контекстом потоков и направлена на маскировку вредоносной активности. Реализуется в рамках следующих этапов:

1. Создание процесса в приостановленном состоянии (CreateProcess с флагом CREATE_SUSPENDED)
2. Получение контекста и адресов в памяти целевого процесса (NtQueryInformationProcess)
3. Освобождение или удаление оригинального кода (NtUnmapViewOfSection)
4. Размещение нового (вредоносного) PE-образа в памяти процесса (VirtualAllocEx, WriteProcessMemory)
5. Обновление таблиц и контекста (SetThreadContext)
6. Возобновление выполнения (ResumeThread)

Классическая DLL Injection – исторически самая первая и наиболее простая в исполнении техника внедрения кода в процесс, которая основана на открытии процесса, выделении памяти, создании удаленного потока, вызывающего LoadLibrary с загрузкой нужной DLL библиотеки. Ввиду своей простоты эту технику используют EDR для загрузки своих DLL в целевые процессы с последующей установкой Win32 и Native API хуков.

Данные техники могут быть легко обнаружены современными EDR решениями по характерным API-последовательностям и поведению, поэтому редко используются атакующими.

2. Reflective DLL Loading

Метод запуска кода, при котором DLL библиотека / шеллкод загружаются из памяти средствами собственного минималистичного PE загрузчика в обход средств ОС, не затрагивая диск. Этапы реализации:

1. Подготовка полезной нагрузки

Создаётся специальный модуль (Reflective DLL или shellcode), способный самостоятельно разрешать свои зависимости и выполнять инициализацию. Он содержит встроенный загрузчик, который имитирует действия системного (LoadLibrary и GetProcAddress).

2. Размещение в памяти целевого процесса

Память для внедрения выделяется при помощи системных вызовов вроде VirtualAlloc или VirtualAllocEx. Затем полезная нагрузка записывается в целевой процесс через WriteProcessMemory или аналогичные методы прямой записи.

3. Рефлексивная загрузка

После попадания в память код вызывает собственную функцию загрузки – часто этот этап активируется через CreateRemoteThread, NtCreateThreadEx или вызов уже присутствующей функции (например, RtlCreateUserThread).

Загрузчик внутри полезной нагрузки выполняет:

- нахождение адресов функций LoadLibraryA, GetProcAddress,
- чтение таблиц PE-заголовка,
- ручное разрешение импортов и корректировку связываний.

4. Исполнение кода в контексте процесса

Управление передаётся основной логике внедрённого кода, теперь он работает в адресном пространстве целевого процесса. Используются стандартные Windows API для выполнения заданных действий (например, VirtualProtect для смены прав памяти, если нужно).

5. Очистка и сокрытие следов

После исполнения временные участки памяти освобождаются (VirtualFree), структура PE может быть перезаписана или стерта, чтобы затруднить анализ.

Ввиду того, что данная техника не использует LoadLibrary, выполняется целиком из памяти, она более скрытная в сравнении с классической DLL Injection. Она так же легко детектируется по характерной цепочке системных вызовов, но несмотря на это широко применяется в C&C фреймворках.

3. API Unhooking, Manual mapping

Хуки, устанавливаемые EDR, по сути своей это модификации кода в памяти процесса. Продвинутое ВПО может их обнаруживать и восстанавливать оригинальную последовательность байт, приводя код к исходному состоянию. К примеру, если EDR устанавливает хук на функцию NtAllocateVirtualMemory (для обнаружения выделения RWX регионов памяти), ВПО может загрузить чистую копию ntdll.dll и вернуть модифицированную последовательность байт в исходное состояние, удаляя хук. Далее EDR уже не сможет контролировать вызовы этой функции. Звучит как действенный способ, но EDR научились его обнаруживать посредством периодической проверки работоспособности хуков и их восстановления в случае обнаружения деактивации хука.

Manual Mapping – способ, при котором ВПО загружает в память чистую копию ntdll.dll. В этом случае функция LoadLibrary не используется для загрузки библиотеки ntdll.dll в целях большей скрытности. При этом вызовы интересуемых функций идут через загруженную чистую ntdll.dll, таким образом, EDR не в силах как-либо повлиять на них. Недостатком этого способа является то, что в процессе сканирования памяти EDR может обнаружить копию ntdll.dll, что послужит индикатором атаки. Более скрытным способом является загрузка в память кода интересуемой функции вместо целой библиотеки.

4. ETW patching

Для EDR ETW является очень ценным источником телеметрии по многим типам событий: .NET, сетевая активность, DNS, RPC, LDAP, WMI, события ядра и т.д. Поэтому обход/деактивация ETW является для злоумышленника одной из приоритетных задач в борьбе с EDR.

Наиболее популярным способом обхода ETW является патчинг функций, генерирующих ETW события – EtwEventWrite, NtTraceEvent. Алгоритм патчинга следующий:

1. Получение адреса функции VirtualProtect через GetProcAdrress
2. Получение адреса функции EtwEventWrite через GetProcAdrress
3. Выставление атрибутов памяти RWX по адресу функции EtwEventWrite через VirtualProtect
4. Добавление в начало функции инструкций кода, которые делают ее бессмысленной, например, ret или xor rax, rax; ret
5. Восстановление оригинальных атрибутов защиты памяти по адресу EtwEventWrite через VirtualProtect

Данные манипуляции ВПО либо хак-тулза проделывает в контексте своего процесса, чтобы вывести его из поля зрения ETW. Можно проделать их с другим процессом, с которым может взаимодействовать ВПО, но в этом случае потребуется сделать вызов WriteProcessMemory, что может привлечь лишнее внимание у EDR.

Можно так же патчить функции, которые вызывают внутри себя EtwEventWrite, например LDAPSearchLoggingClientTraceEventNoReg, которая отвечает за генерацию LDAP телеметрии.

Если EDR не следит за глобальными манипуляциями с ETW, можно сначала получить список сессий трассировки, далее отключить нужные ETW провайдеры от данных сессий с помощью функции EnableTraceEx2 или используя команду

logman TRACE_NAME --PROVIDER_NAME --ets

В свою очередь, можно остановить сессии трассировки, используя следующую команду

logman.exe stop TRACE_NAME -ets

К примеру, так можно поступить с Sysmon и лишить его ETW событий в качестве источника телеметрии.

Телеметрией ETW можно управлять также через реестр и переменные окружения. К примеру, задание переменной окружения COMPlus_ETWEnabled или ключа реестра ETWEnabled раздела HKCU:\Software\Microsoft\NETFramework в 0 приводит к остановке генерации событий платформы .NET.

5. Direct Syscalls, Indirect Syscalls

Данную технику можно рассматривать как логическое развитие устаревших техник IAT hooking и Inline API hooking. Она базируется на идее, что функции Native API содержат в себе наборы инструкций (стабы), которые являются переходниками к соответствующим функциям ядра. Переходник состоит из следующих инструкций:

mov r10, rcx
mov eax, SSN
syscall
ret

SSN (System Service Number) – номер, по которому происходит обращение к нужному системному вызову в таблице диспетчеризации системных сервисов (SSDT). Искусственное использование таких переходников дает возможность злоумышленнику обращаться к функциям ядра в обход ntdll.dll, будучи уверенным, что его не перехватит EDR на уровне хука, установленного в Win32 API и Native API (ntdll.dll). Неприятным нюансом этой техники является то, что Microsoft часто меняет номера системных вызовов (SSN), таким образом захардкоженный в стабе SSN приведет к тому, что он будет работоспособен только в рамках текущей версии билда Windows. Для примера, системный номер NtCreateThreadEx для Windows 10 1909 - 0xBD, для Windows 10 20H1 – 0xC1. Как следствие, появились техники Hell’s Gate, Halo’s Gate, которые осуществляют динамический резолв номеров системных вызовов, таким образом ушла необходимость их хардкода внутри ассемблерного стаба.

У техники Direct Syscalls есть два характерных индикатора для EDR:

1) Инструкция syscall, расположенная посреди ассемблерного стаба, выполняется вне адресного пространства ntdll.dll.
2) Инструкция ret находится и указывает на адрес вне адресного пространства ntdll.dll.

Оба этих нюанса крайне нетипичны для легитимных Native API функций. Как следствие, чтобы побороть эти обстоятельства, как дальнейшее развитие Direct Syscalls появилась техника Indirect Syscalls.

Схематично техника Indirect Syscalls представлена на следующем рисунке.

Indirect Syscalls

Как видно на схеме, как и в случае с Direct Syscall мы обходим слой Win32 API и частично обходим Native API путем выполнения безусловной инструкции jmp на syscall из ntdll.dll, далее за которой следует инструкция ret. Таким образом, это позволяет избежать появления индикаторов, характерных для Direct Syscalls, о которых выше шла речь.

Indirect Syscall не является серебряной пулей для злоумышленника, т.к. в процессе реализации этой техники в результате подмены инструкций syscall и ret происходит спуфинг верхнего фрейма стека вызовов, но нижние фреймы стека продолжают указывать на оригинальный exe/dll. EDR, использующий ETW и проводящий трассировку стека, обнаружит эту аномалию и вполне вероятно расценит это как индикатор вредоносной активности.

6. Bring Your Own Installer (BYOI)

Современные EDR и антивирусные решения в большинстве своем оснащены механизмами самозащиты и не могут быть завершены или удалены без авторизации. Однако в процессе легитимной переустановки или обновления происходит остановка или удаление службы агента. Злоумышленники взяли на вооружение эту технику, при которой, после запуска инсталлятора, появляется возможность остановки или удаления агента. При этом атакующий должен обладать привилегиями администратора для запуска инсталлятора (чаще всего это msi или .exe файл). Прервав установку в момент, когда агент остановлен или удален, хост оказывается в состоянии уязвимом к дальнейшему запуску ВПО.

Из реальных случаев с использованием данной техники можно отметить атаку шифровальщика Babuk, когда атакующие скомпрометировали доступный из интернета сервер, повысили на нем привилегии. Далее запустили и через некоторое время прервали инсталлятор SentinelOne, что привело к деактивации агента. На хосте был запущен шифровальщик Babuk, на это никак не смог повлиять установленный EDR. Для митигирования угрозы SentinelOne рекомендовала пользователям включить функцию локальной авторизации. Инцидент с SentinelOne показал, что в процессе запуска инсталлятора EDR локальная авторизация должна быть включена в обязательном порядке.

7. Bring Your Own Vulnerable Driver (BYOVD)

Как уже было сказано в нашей прошлой статье, данная техника подразумевает загрузку уязвимого легитимного драйвера (на данный момент их более 700 в проекте LOLDrivers) с целью деактивации EDR/антивируса, обхода их защитных механизмов (завершение процессов, удаление kernel notifications колбеков уровня ядра, закрытие хендлов процесса, выгрузка драйверов EDR, обход механизма защиты процессов PPL). Необходимыми условиями для проведения данной атаки являются: наличие у злоумышленника полных прав администратора, а также отсутствие хеша используемого драйвера в черном списке уязвимых драйверов от Microsoft либо в соответствующих правилах Sysmon.

Популярность этой техники постоянно растет, т.к. в списке LOLDrivers регулярно появляются новые образцы. Вдобавок к этому некоторые вполне легитимные инструменты идут в связке с уязвимыми драйверами и их можно использовать для проведения этой атаки (Process Explorer, Process Hacker, Gmer). В 2023 г. в даркнете продавался тулкит заточенный под деактивацию целого ряда антивирусов и EDR. Говоря о BYOVD, также нельзя не отметить простоту его реализации ввиду того, что стандартной практикой является выдача пользователю административных полномочий на хосте, необходимых для установки драйвера, вследствие чего в большинстве случаев у злоумышленника после компрометации учетной записи нет нужды повышать привилегии.

Из случаев применения данной техники можно отметить следующие инциденты:

1) В 2022 г. BlackByte шифровальщик использовал уязвимый SI Afterburner драйвер (RTCore64.sys) для деактивации ряда EDR.

2) В 2022 - 2023 гг. AvosLocker шифровальщик использовал легитимный драйвер Avast Anti-Rootkit (aswArPot.sys) для отключения антивирусов

3) В начале 2023 г. как минимум в трех инцидентах, связанных с атакой шифровальщика, был задействован инструмент AuKill. Данный инструмент основан на использовании устаревшего уязвимого драйвера Process Explorer (procexp.sys) – пример злоупотребления легитимным инструментом.

Для митигирования данной угрозы со стороны вендора, а также со стороны ОС должен вестись и регулярно актуализироваться черный список драйверов, блокирующий их загрузку.

8. DLL Hijacking & Side-Loading

В рамках данной техники злоумышленник эксплуатирует порядок выбора каталога при загрузке библиотеки легитимным приложением. Если в приложении явно не указан путь для загрузки библиотеки, самым первым каталогом, в котором будет произведен поиск библиотеки — каталог самого приложения. Таким образом, если в приложении нет явно заданного каталога загрузки и нет проверки цифровой подписи библиотеки, это дает возможность разместить рядом с уязвимым .exe файлом приложения вредоносную DLL библиотеку, которая будет загружена при запуске легитимного .exe файла. Следствием этого будет запуск вредоносного кода в контексте доверенного приложения, что в свою очередь может привести к повышению привилегий и обходу защитных механизмов СЗИ и ОС. Это техника DLL Hijacking и ее разновидность DLL Sideloading – когда у злоумышленника нет необходимости устанавливать на атакуемый хост уязвимое приложение, достаточно доставить и запустить соответствующий .exe приложения и рядом разместить DLL с вредоносным кодом.

Можно отметить следующие случаи применения данной техники:

1) В 2024 г. APT группировка ToddyCat использовала уязвимость в ESET сканере командной строки (ecls.exe), который небезопасно загружал библиотеку version.dll из рабочего каталога. Рядом с .exe файлом сканера атакующие расположили вредоносную version.dll, что позволило им обойти проверки антивируса и выполнить свой код в контексте доверенного приложения ESET. Далее был загружен уязвимый легитимный драйвер, посредством которого были модифицированы структуры ядра и отключена подписка на security notifications ядра. Таким образом, это был случай комбинированной атаки, в которой техника DLL Sideloading сочеталась с BYOVD.

2) В середине 2022 г. APT группировка LockBit использовала уязвимость в MpCmdRun.exe — консольной утилите Microsoft Defender, который небезопасно загружал MpClient.dll, что приводило к запуску маяка Cobalt Strike и полной компрометации хоста. Данный случай примечателен тем, что Microsoft Defender должен был предотвратить выполнение вредоносного кода, но оказался не в состоянии это сделать из-за эксплуатации уязвимости в собственном же компоненте.

Отличительная особенность данной техники в том, что она очень эффективно справляется с задачей сокрытия вредоносного кода в контексте легитимных доверенных приложений, что значительно повышает его выживаемость.

Для митигирования данной угрозы: со стороны вендора необходимо использовать безопасные пути загрузки библиотек, использовать проверку цифровых подписей; со стороны защиты необходимо выявлять события запуска легитимных приложений из нетипичных каталогов, а также загрузки легитимными приложениями неподписанных библиотек, особенно из временных каталогов.

9. Service Abuse

В рамках данной техники атакующий манипулирет настройками ОС для деактивации или обхода EDR без эксплуатации уязвимостей. Примером этой техники может служить перезагрузка ОС в безопасном режиме, в рамках которого EDR и его защитные возможности могут не функционировать. В таком случае ВПО может выполнять свои действия, не встречая никакого противодействия со стороны EDR. Примером использования данной техники может служить случай заражения шифровальщиком Snatch в 2019 г. Он устанавливал свою службу в системе с командой перезагрузки в безопасном режиме и добавлял Run ключ реестра для автозагрузки. После перезагрузки системы в безопасном режиме с выключенным антивирусом и EDR Snatch начинал шифрование файлов. Также можно привести пример случая с шифровальщиком Black Basta, который перезагружал систему в режиме восстановления и деактивировал установленную EDR.

Для митигирования данной угрозы EDR должны запрашивать авторизацию перед загрузкой системы в режиме восстановления, безопасном режиме и сигнализировать об этом.

10. Living Off The Land утилиты

Эту технику и способы ее применения мы подробно расписывали в одной из прошлых статей. Одним из действенных вариантов ее реализации является обход EDR с использованием инструментов Microsoft либо разработанных другими доверенными вендорами. Далее приведен список LOL утилит с разбивкой па тактикам матрицы Mitre ATT@CK. Данные утилиты не вызывают подозрений у многих EDR сейчас либо ранее на протяжении долгого времени и активно используются злоумышленниками.

1. Сетевая разведка (Advanced IP Scanner, Angry IP Scanner)
2. Повышение привилегий: Nsudo (повышение привилегий до NT AUTHORITY\SYSTEM, Trusted Installer)
3. Обход защитных механизмов: Process Explorer, Process Hacker
4. Доступ к данным аутентификации (снятие дампа LSASS, получение данных логин/пароль): Sysinternals procdump, Deepl CreateDump, Avast AvDump; NirSoft ChromePass, PasswordFox, Remote Desktop PassView, Mail PassView
5. Сбор данных с сети, хоста: Powershell Active Directory module, adfind, adrecon, psrecon, Kansa, wmi
6. Горизонтальное перемещение: PsExec, wmic
7. Command and Control (TeamViewer, AmmyAdmin, Dameware, AnyDesk)
8. Причинение ущерба (шифрование данных, затирание данные): BitLocker, DiskCryptor; SDelete

Митигированием данной угрозы является ведение черных/белых списков приложений (WDAC, AppLocker).

Заключение

В статье приведен обзор техник обхода EDR, как и простых, так и более сложных, требующих определенной подготовки и знаний у злоумышленника. Есть техники, которые уже давно стоят на вооружении у злоумышленников, есть те, которые появились сравнительно недавно. Всех их объединяет то обстоятельство, что ни одна из них не является серебряной пулей в борьбе с EDR. Каждую из них можно своевременно обнаружить по прямым либо косвенным признакам. При соблюдении следующего ряда условий можно исключить или минимизировать риск успешной эксплуатации каждой из техник.

1. Соблюдать принцип минимальных полномочий, по возможности не выдавать пользователям административные учетные записи на АРМ.
2. Регулярно устанавливать системные обновления, а также обновления EDR.
3. Регулярно оценивать эффективность работы установленной EDR путем проведения киберучений или как минимум путем запуска RedTeam утилит направленных на обход и тестирования EDR.
4. Вести черные списки приложений и драйверов.
5. Своевременно реагировать на служебные оповещения EDR, особенно на те, которые касаются изменения конфигурации и отключения компонент и самозащиты EDR.

Комментарии (0)