Pull to refresh

Trojan-Dropper.Win32.Agent.rek: «легальный» руткит

Reading time4 min
Views22K
В заметке описывается драйвер, который загружается вирусом, рассмотренным в предыдущей части. Драйвер работает на уровне ядра операционной системы, и обеспечивает «привилегированное» прикрытие основной функциональности трояна, которая работает в режиме пользователя (авторское название компоненты — winnt32.dll. Подробнее о ней см. habrahabr.ru/blog/virus/43787.html).

Краткое описание.
Программа представляет собой nt-драйвер (так же известны, как legacy-драйвера, то есть не связанные ни с каким физическим устройством). Является руткитом: используя механизмы ядра ОС, лишает другие программы доступа к некоторым файлам и ключам реестра.
Детектируется касперским как Trojan-Dropper.Win32.Agent.rek. Размер 27548 байтов.
Лирическое отсутпление. «Обычный» руткит может использовать недостатки в реализации ОС для сокрытия объектов: файлов, сетевых соединений, и так далее вплоть до секторов жесткого диска. Для этого в простейшем случае делается перехват системного вызова. Системный вызов по сути — это вызов функции, а вызов функции — это передача управления по указанному адресу. Руткит записывает по этому адресу свой код, который трансформирует результат оригинальной функции. К примеру, проверяет, пытается ли кто-то открывать файл с телом вируса, и возвращает какой-нибудь код ошибки, например «доступ заперещен».
Руткит перехватывает обращения с реестру и файлам, используя легальные методы самой ОС.

Файловая система
Используя функцию ядра IoRegisterFsRegistrationChange, драйвер подписыватеся на получение события об активизации/отключении файловой системы. То есть ОС сама уведомляет драйвер, да еще и передает ему структуру DEVICE_OBJECT, описывающую «устройство» файловой системы и ее драйвер. «Устройство файловой системы» — это, грубо говоря, то, посредством чего пользователь видит данные на диске, организованные в виде папок и фалов.
Справочник говорит следующее: The IoRegisterFsRegistrationChange routine registers a file system filter driver's notification routine to be called whenever a file system registers or unregisters itself as an active file system.


В структуре DEVICE_OBJECT, описывающей устройство, драйвер заменяет обработчик запроса IRP_MJ_CREATE на свой. Запрос IRP_MJ_CREATE генерируется изнутри NtCreateFile при открытии файла. Новый обработчик сравнивает запрошенное имя с именем файла собственно драйвера (которое задается дроппером в форме Wwwdd.sys, например Jer24.sys), и, в случае совпадения, возвращает код ошибки STATUS_ACCESS_DENIED.

Ключи реестра
Обращение к ключам реестра реализованно не менее легально: используя функцию CmRegisterCallback, драйвер подписывается на уведомление о всех обращениях к реестру. Стоит ли говорить о том, как начинает тормозить компьютер?

A driver calls CmRegisterCallback to register a RegistryCallback routine, which is called every time a thread performs an operation on the registry.


При обращении к ключам реестра:
HKLM\System\CurrentControlSet\Sevices\DRIVER-NAME
HKLM\System\ControlSet001\Sevices\DRIVER-NAME
HKLM\System\ControlSet002\Sevices\DRIVER-NAME
HKLM\System\CurrentControlSet\Control\SafeBoot\Minimal\DRIVER-NAME
HKLM\System\CurrentControlSet\Control\SafeBoot\Network\DRIVER-NAME
HKLM\System\ControlSet001\Control\SafeBoot\Minimal\DRIVER-NAME
HKLM\System\ControlSet001\Control\SafeBoot\Minimal\DRIVER-NAME
HKLM\System\ControlSet002\Control\SafeBoot\Network\DRIVER-NAME
HKLM\System\ControlSet002\Control\SafeBoot\Network\DRIVER-NAME

драйвер возвращает код ошибки STATUS_ACCESS_DENIED.

Слайды.

Запрет на удаление файла:
Запрет на удаление файла

Запрет на удаление ключа реестра:
Запрет на удаление ключа реестра

Вот система передает руткиту информацию о CDFS:
kd> kb
ChildEBP RetAddr  Args to Child              
f9dfbc10 80568d01 818158b8 00000001 818cff38 Qvk71+0x1970
f9dfbc2c f9d3d10b 818cff38 f9d3d970 f9dfbc7c nt!IoRegisterFsRegistrationChange+0xab
f9dfbc3c f9d3cdb0 818cff38 00000000 00000000 Qvk71+0x110b
f9dfbc7c 805757dc 818cff38 815dd000 00000000 Qvk71+0xdb0
f9dfbd4c 805758eb 000005b8 00000001 00000000 nt!IopLoadDriver+0x66c
f9dfbd74 80533fe6 000005b8 00000000 819ca3c8 nt!IopLoadUnloadDriver+0x45
f9dfbdac 805c4cce f7e48cf4 00000000 00000000 nt!ExpWorkerThread+0x100
f9dfbddc 805411c2 80533ee6 00000001 00000000 nt!PspSystemThreadStartup+0x34
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16

kd> dt -r1 _DEVICE_OBJECT poi(esp+4)
nt!_DEVICE_OBJECT
   +0x000 Type             : 3
   +0x002 Size             : 0xb8
   +0x004 ReferenceCount   : 1
   +0x008 DriverObject     : 0x817eba20 _DRIVER_OBJECT
      +0x000 Type             : 4
      +0x002 Size             : 168
      +0x004 DeviceObject     : 0x8172e020 _DEVICE_OBJECT
      +0x008 Flags            : 0x92
      +0x00c DriverStart      : 0xf9c0c000 
      +0x010 DriverSize       : 0xf900
      +0x014 DriverSection    : 0x818c9960 
      +0x018 DriverExtension  : 0x817ebac8 _DRIVER_EXTENSION
      +0x01c DriverName       : _UNICODE_STRING "\FileSystem\Cdfs"
      +0x024 HardwareDatabase : 0x8066ecd8 _UNICODE_STRING "\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM"
      +0x028 FastIoDispatch   : 0xf9c0e400 _FAST_IO_DISPATCH
      +0x02c DriverInit       : 0xf9c19a85        long  Cdfs!GsDriverEntry+0
      +0x030 DriverStartIo    : (null) 
      +0x034 DriverUnload     : 0xf9c0fca5        void  Cdfs!CdUnload+0
      +0x038 MajorFunction    : [28] 0xf9c0c400        long  Cdfs!CdFsdDispatch+0
   +0x00c NextDevice       : (null) 
   +0x010 AttachedDevice   : (null) 
   +0x014 CurrentIrp       : (null) 
   +0x018 Timer            : (null) 
   +0x01c Flags            : 0x10840
   +0x020 Characteristics  : 0
   +0x024 Vpb              : (null) 
   +0x028 DeviceExtension  : (null) 
   +0x02c DeviceType       : 3
   +0x030 StackSize        : 1 ''
   +0x034 Queue            : __unnamed
   +0x05c AlignmentRequirement : 0
   +0x060 DeviceQueue      : _KDEVICE_QUEUE
   +0x074 Dpc              : _KDPC
   +0x094 ActiveThreadCount : 0
   +0x098 SecurityDescriptor : 0xe139df00 
   +0x09c DeviceLock       : _KEVENT
   +0x0ac SectorSize       : 0x800
   +0x0ae Spare1           : 0
   +0x0b0 DeviceObjectExtension : 0x81815970 _DEVOBJ_EXTENSION
   +0x0b4 Reserved         : (null) 


Вывод.
В невидимой борьбе вирусов с антивирусами, когда все на свете перехватыватся и переперехватывается, используемый данным руткитом метод легален, а поэтому наиболее опасен. Со своей большой колокольни могу предположить, что снять такой хук на практике нереально. Либо перехватывать собственно процедуры регистрации таких уведомлений (типа CmRegisterCallback), запретив вызывать ее кому не попадя.
С другой стороны, грань, разделюящая вирусы и антивирусы, становится все тоньше и терерь едва заметна. Они используют одинаковые механизмы для сокрытия данных или отслеживания работы обычных программ. И, кстати, шаги к этому совершаются больше темной стороной.
Tags:
Hubs:
+44
Comments62

Articles

Change theme settings