Содержание статьи
Сегодня давай разберем ряд техник, которые помогают злоумышленникам обойти расширенный мониторинг. В качестве подопытного инструмента будем использовать Sysmon.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Эта статья логически делится на две части — по источникам информации, на основе которых Sysmon формирует свои события. В первой мы посмотрим, как можно нарушить взаимодействие между драйвером SysmonDrv
и службой Sysmon64
, во второй — поговорим о воздействии на подсистему ETW. Итак, поехали!
Воздействуем на устройство SysmonDrv
В моем предыдущем материале я рассказывал о том, как ослепить расширенный мониторинг, манипулируя с дескриптором безопасности объекта коммуникационного устройства \\
и провоцируя Sysmon на повторное открытие хендла этого устройства (вызов DuplicateHandle() с опцией DUPLICATE_CLOSE_SOURCE
).
Сегодня мы посмотрим еще пару техник, с помощью которых можно воздействовать на процесс передачи информации от модуля ядра SysmonDrv
службе Sysmon64
, а соответственно, и на формирование событий безопасности.
Фейковый DosDevice
Суть этой техники заключается в том, чтобы создать символическую ссылку (симлинк) на коммуникационное устройство \\
раньше, чем это сделает драйвер Sysmon. Успешная эксплуатация позволит атакующему подменить объект коммуникационного устройства и тем самым ослепить Sysmon. Процесс режима пользователя Sysmon64.exe не сможет получать никакую информацию и, как следствие, не будет формировать события.
Для понимания работы этой техники давай вспомним, как работает инструмент Sysmon. В его состав входят два компонента:
- Драйвер, который с помощью колбэков и мини‑фильтров отслеживает события, происходящие в системе: создание и завершение процессов, создание файлов, доступ к памяти процесса, создание удаленного потока, загрузку библиотек и другие.
- Служба режима пользователя, которая получает информацию от драйвера
SysmonDrv
и формирует события безопасности.
Драйвер SysmonDrv
в процессе своей инициализации создает коммуникационное устройство \\
, чтобы служба Sysmon64
могла получать от него информацию. Однако здесь существует небольшая особенность: пользовательские приложения не могут напрямую взаимодействовать с девайсами. Для этой цели в системе создается символическая ссылка, через которую и происходит все «общение». Вот как это выглядит в WinObj.
А что будет, если атакующий попытается подменить эту ссылку? Давай посмотрим.
В системе существует специальный вызов DefineDosDevice, который позволяет создавать (и переопределять) символические ссылки на устройства:
BOOL DefineDosDeviceW( [in] DWORD dwFlags, [in] LPCWSTR lpDeviceName, [in, optional] LPCWSTR lpTargetPath);
- В параметре
dwFlags
передаются флаги, контролирующие работу функции. УкажемDDD_NO_BROADCAST_SYSTEM
, что будет означать «не сообщать никому об изменении». - Во втором параметре (
lpDeviceName
) указываем имя симлинка —SysmonDrv
, а в третьем (lpTargetPath
) — фейковый путь к устройству (\
).??\ Device\ fakedrv
Благодаря функции мы можем подменить симлинк SysmonDrv
.
Однако это нужно успеть сделать до того момента, как процесс Sysmon64.
ее откроет. Для этого вредоносный процесс FakeDosDevice.
должен быть зарегистрирован в качестве службы, а у сервиса Sysmon64
в зависимостях должна быть указана ссылка на него.
Для регистрации служб есть специальная функция CreateService:
SC_HANDLE CreateServiceA( [in] SC_HANDLE hSCManager, [in] LPCSTR lpServiceName, [in, optional] LPCSTR lpDisplayName, [in] DWORD dwDesiredAccess, [in] DWORD dwServiceType, [in] DWORD dwStartType, [in] DWORD dwErrorControl, [in, optional] LPCSTR lpBinaryPathName, [in, optional] LPCSTR lpLoadOrderGroup, [out, optional] LPDWORD lpdwTagId, [in, optional] LPCSTR lpDependencies, [in, optional] LPCSTR lpServiceStartName, [in, optional] LPCSTR lpPassword);
- Первым параметром (
hSCManager
) передается хендл базы данных диспетчера управления службами. Его можно получить с помощью функции OpenSCManager. - Второй (
lpServiceName
) и третий (lpDisplayName
) параметры принимают имя регистрируемой службы. Установим их равнымиFakeDosDevice
. - Так как вызов
CreateService
возвращает хендл на созданную службу, с которым можно работать дальше, а сама служба — это объект ядра, в четвертом параметре (dwDesiredAccess
) передается запрашиваемый доступ. - Далее мы указываем тип службы —
SERVICE_WIN32_OWN_PROCESS
(параметрdwServiceType
). - С помощью параметра
dwStartType
указываем тип автозапуска. В нашем случае он равенSERVICE_AUTO_START
. - В параметре
dwErrorControl
передается уровень критичности и действие в случае ошибки (SERVICE_ERROR_NORMAL
). - В конце (
lpBinaryPathName
) указываем путь к исполняемому файлуFakeDosDevice.
, получаемый динамически с помощью функции QueryFullProcessImageName.exe - Оставшиеся параметры установим в
NULL
.
Итак, службу FakeDosDevice
мы зарегистрировали. Теперь ее нужно добавить в зависимости Sysmon64
. Если в системе стоит Sysmon версии 15 и выше, то штатными средствами это сделать не получится, поскольку он работает как Protected Process.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»