Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Получив доступ к взломанной системе, атакующий первым делом реализует техники уклонения от обнаружения, которые позволяют ослабить мониторинг безопасности инфраструктуры и, как следствие, действовать максимально незаметно.
Сегодня давай разберем ряд техник, которые помогают злоумышленникам обойти расширенный мониторинг. В качестве подопытного инструмента будем использовать Sysmon.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Эта статья логически делится на две части — по источникам информации, на основе которых Sysmon формирует свои события. В первой мы посмотрим, как можно нарушить взаимодействие между драйвером SysmonDrv
и службой Sysmon64
, во второй — поговорим о воздействии на подсистему ETW. Итак, поехали!
\DeviceSysmonDrv
В моем предыдущем материале я рассказывал о том, как ослепить расширенный мониторинг, манипулируя с дескриптором безопасности объекта коммуникационного устройства \DeviceSysmonDrv
и провоцируя Sysmon на повторное открытие хендла этого устройства (вызов DuplicateHandle() с опцией DUPLICATE_CLOSE_SOURCE
).
Сегодня мы посмотрим еще пару техник, с помощью которых можно воздействовать на процесс передачи информации от модуля ядра SysmonDrv
службе Sysmon64
, а соответственно, и на формирование событий безопасности.
Суть этой техники заключается в том, чтобы создать символическую ссылку (симлинк) на коммуникационное устройство \DeviceSysmonDrv
раньше, чем это сделает драйвер Sysmon. Успешная эксплуатация позволит атакующему подменить объект коммуникационного устройства и тем самым ослепить Sysmon. Процесс режима пользователя Sysmon64.exe не сможет получать никакую информацию и, как следствие, не будет формировать события.
Для понимания работы этой техники давай вспомним, как работает инструмент Sysmon. В его состав входят два компонента:
SysmonDrv
и формирует события безопасности. Драйвер SysmonDrv
в процессе своей инициализации создает коммуникационное устройство \DeviceSysmonDrv
, чтобы служба Sysmon64
могла получать от него информацию. Однако здесь существует небольшая особенность: пользовательские приложения не могут напрямую взаимодействовать с девайсами. Для этой цели в системе создается символическая ссылка, через которую и происходит все «общение». Вот как это выглядит в WinObj.
А что будет, если атакующий попытается подменить эту ссылку? Давай посмотрим.
В системе существует специальный вызов DefineDosDevice, который позволяет создавать (и переопределять) символические ссылки на устройства:
BOOL DefineDosDeviceW( [in] DWORD dwFlags, [in] LPCWSTR lpDeviceName, [in, optional] LPCWSTR lpTargetPath);
dwFlags
передаются флаги, контролирующие работу функции. Укажем DDD_NO_BROADCAST_SYSTEM
, что будет означать «не сообщать никому об изменении». lpDeviceName
) указываем имя симлинка — SysmonDrv
, а в третьем (lpTargetPath
) — фейковый путь к устройству (??Devicefakedrv
). Благодаря функции мы можем подменить симлинк SysmonDrv
.
Однако это нужно успеть сделать до того момента, как процесс Sysmon64.exe
ее откроет. Для этого вредоносный процесс FakeDosDevice.exe
должен быть зарегистрирован в качестве службы, а у сервиса 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.exe
, получаемый динамически с помощью функции QueryFullProcessImageName. NULL
. Итак, службу FakeDosDevice
мы зарегистрировали. Теперь ее нужно добавить в зависимости Sysmon64
. Если в системе стоит Sysmon версии 15 и выше, то штатными средствами это сделать не получится, поскольку он работает как Protected Process.
Источник: xakep.ru