Когда заходит речь о песочницах, все представляют себе виртуальную машину, напичканную различными инструментами для отслеживания действий подозрительного ПО. И большинство продуктов работают именно таким образом. Следовательно, возникает вопрос — как же быть, если вредоносное ПО обнаружит ненастоящее окружение и завершит свою работу? Здесь мнения расходятся: кто-то скажет, что мы можем хорошенько поработать с виртуальным образом, изменив значения характеристик среды (харденинг), в которых малварь будет искать подвох. Другие считают, что эта игра не стоит свеч. Тем не менее сам факт попытки провести разведку и определить свойство окружения — подозрительное действие, которое нехарактерно для большинства легитимного софта. Конечно, такого поведения недостаточно, чтобы сделать однозначный вывод о злонамеренных целях ПО, однако в совокупности с другими признаками оно заслуживает отдельного внимания безопасника.
В интернете несложно найти примеры утилит (один, второй), сочетающие в себе сразу несколько хорошо известных техник для обнаружения песочниц, виртуализации или просто окружения для анализа вредоносного ПО (отладочных инструментов, снифферов, мониторов). Эти базы знаний пополняются находками самих исследователей, которые ищут новые методы, и способами, извлекаемыми при анализе вредоносов. Для так называемой массовой малвари, которая рассчитана на заражение произвольно взятой системы, умение определить неподходящее окружение жизненно необходимо, ведь шанс того, что вскоре оно попадет в средство анализа вредоносного ПО или на машину с установленным антивирусом, крайне велик, а значит, нужно уметь не выдавать себя как можно дольше.
С целенаправленными атаками ситуация меняется. Перед проведением такой атаки злоумышленники собирают как можно больше информации о цели, а значит, порой понимают, что нет необходимости тщательно маскироваться от виртуальных сред после успешного заражения. Кроме того, не всякие действия могут расцениваться как подозрительные, особенно если им не сопутствуют чрезмерные попытки малвари себя обезопасить. Также не стоит забывать, что в ряде организаций (например, у разработчиков ПО) существование виртуальной инфраструктуры — типичная ситуация.
В этой статье мы рассмотрим несколько примеров сложного вредоносного ПО, используемого в таргетированных атаках, и покажем, каким образом мы выявляем попытки обойти неподходящую среду по техникам T1497 и T1063 из MITRE ATT&CK.
PlugX можно назвать классическим бэкдором, он известен более 10 лет. Широко используется преимущественно злоумышленниками из азиатских стран (в том числе и APT-группами). Его новые модификации обнаруживаются до сих пор. В качестве примера мы взяли исполняемый PE-файл на платформе .NET. Это лишь обертка для PlugX. Дроппер проверяет, существует ли процесс vmtoolsd в системе, если нет — внедряет шелл-код для распаковки и запуска полезной нагрузки бэкдора.
Поиск процесса vmtoolsd
Для того чтобы найти нужный нам процесс, требуется получить список всех процессов в системе. Убрав за скобки сопутствующие вызовы, мы упремся в вызов функции ядра NtQuerySystemInformation (здесь и далее будем использовать префикс Nt вместо Zw, чтобы не было расхождения с вырезками из журналов событий) со значением поля SystemInformationClass, равным SystemProcessInformation, или 0x5:
syscall Time=??????9276.891649,PID=2996,PPID=1368,TID=2848,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQuerySystemInformation,Module=«nt»,vCPU=1,CR3=0xC7FA000,Syscall=51,SystemInformationClass=0x5,SystemInformation=0x4C36A0,SystemInformationLength=0x20400,ReturnLength=0x8DEF0
К слову, проверить результат можно на более простом примере, проследив вызов хорошо известной API-функции CreateToolhelp32Snapshot из kernel32:
Вызов NtQuerySystemInformation из ntdll в ходе работы функции CreateToolhelp32Snapshot из kernel32
Вызов функции ядра в функции NtQuerySystemInformation из ntdll
В результате мы трактуем перехваченный вызов как попытку перечисления процессов в системе с вытекающим подозрительным поведением Read.Process.Name.Enumeration.
Приведем более свежий пример. Двадцать первого мая наши коллеги из ESET опубликовали статью о новом бэкдоре PipeMon APT-группы Winnti, хорошо известной успешными атаками на цепочку поставок (supply chain) и заражениями крупных организаций из игровой индустрии. В этот раз они использовали новое вредоносное ПО, которое использует множества именованных каналов (named pipe) для взаимодействия между своими модулями. В процессе инсталляции, прежде чем внедрить в процесс главный и сторожевой (watchdog) модули, один из компонентов проверяет, принадлежит ли процесс ESET (ekrn.exe) и Kaspersky (avp.exe). Любопытно, что наличие антивирусного ПО не является преградой: вредонос продолжает свою деятельность, выбирая другой процесс-жертву, минуя обнаружение в попытке внедриться в охраняемый процесс. Не самая сложная техника, но мы не могли пройти мимо, с одной стороны, недавнего, с другой — смелого случая, который аналогичным образом определяется как подозрительное поведение Read.Process.Name.Enumeration.
APT Cozy Bear (она же APT29, The Dukes, YTTRIUM) — одна из группировок, участники которой, предположительно, говорят на русском языке. Про их активность известно с 2008 года, а вредоносная кампания Operation Ghost показывает, что качество используемого ими ВПО по-прежнему высоко. Сфокусируемся на одном из флагманских бэкдоров группы — CozyDuke. В начале своей работы для обнаружения антивирусного ПО (Kaspersky, Dr.Web, Avira) вредонос запускает WMI-запросы SELECT * FROM AntiVirusProduct и SELECT * FROM FireWallProduct.
Кроме этого, бэкдор ищет антивирусные продукты в списке установленного софта, перечисляя ветку реестра SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall. WMI-вызовы отслеживаются путем наблюдения за использованием COM-интерфейса {4590F811-1D3A-11D0-891F-00AA004B2E24} (CLSID_WbemLocator) средствами вызова API CoCreateInstanse и дальнейшего разбора структур класса объекта:
wmimon Time=??????9653.749016,PID=556,PPID=1476,TID=1256,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ConnectServer,Resource=«root\SecurityCenter2»
wmimon Time=??????9653.865526,PID=556,PPID=1476,TID=1256,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ExecQuery,Command="SELECT * FROM AntiVirusProduct"
wmimon Time=??????9654.718217,PID=556,PPID=1476,TID=1256,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ExecQuery,Command="SELECT * FROM FireWallProduct"
Обращение к реестру фиксируется вызовом функции ядра NtEnumerateKey:
regmon Time=??????9653.942010,PID=556,PPID=1476,TID=1256,ProcessName="\Device\HarddiskVolume2\******.exe",Method=NtEnumerateKey,Key="\REGISTRY\MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\UNINSTALL"
В результате получаем подозрительные события Create.Query.WMI.CheckVM и Read.Registry.Key.CheckInstalledSoft:
Опасное поведение CozyDuke, обнаруженное PT Sandbox
APT Fancy Bear (она же APT28, Sofacy, Sednit) является одной из самых продвинутых группировок. За их авторством десятки бэкдоров, проксирующих троянов и инфостилеров: семейства троянов Xagent, Xtunnel, Sedreco, Downdelph и др. Создатели первого в мире UEFI-руткита LoJax не ограничиваются лишь вредоносами для Windows. Мы рассмотрим образец вредоносного семейства Zebrocy, написанный на языке AutoIt. Дополнительный слой упаковки с помощью UPX не усложняет получение Au3-интерпретируемого скрипта, в котором проверяется наличие процессов виртуального окружения VMware, VirtualBox или Parallels:
Поиск процессов VMware, VirtualBox или Parallels
Такая активность регистрируется уже рассмотренным ранее подозрительным поведением Read.Process.Name.Enumeration.
Стоит отметить, что с 2013 года для создания вариаций Zebrocy использовались и другие языки программирования: Delphi, C#, Python, а также набравший популярность Go. В одном из образцов на Go (MD5: f3ec38b8d5a6e29db299e2eadacbcebe) мы обнаружили простой, но очень эффективный трюк для обхода песочницы: троян проверяет, что собственное имя библиотеки (вредонос представляет собой элемент управления OLE, который регистрируется в системе с помощью regsvr) начинается с подстроки sap_. Шанс на то, что случайно попавший в систему для анализа вредонос будет проименован корректно, очень мал. Для успешной работы потребуется запустить цепочку заражения с самого начала, что не гарантирует получение загрузчика Zebrocy в качестве полезной нагрузки от управляющего сервера.
Расшифровка строки spa_ в Zebrocy Go
Мы решили включить известный вредоносный загрузчик SmokeLoader в список рассматриваемых семейств, так как, казалось бы, его достаточно простому целевому назначению (загрузить и запустить полезную нагрузку) сопутствуют немало приемов, усложняющих его анализ. Отметим, что мы наблюдали случаи использования этого вредоносного ПО хакерской группировкой TA505.
Для обнаружения средств виртуализации SmokeLoader считывает значения ключей реестра System\CurrentControlSet\Enum\IDE и System\CurrentControlSet\Enum\SCSI и ищет в них подстроки продуктов виртуализации QEMU, VirtualBox, VMware и Xen:
regmon Time=??????6940.916639,PID=2168,PPID=2716,TID=2848,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtOpenKeyEx,Key="\REGISTRY\MACHINE\System\CurrentControlSet\Enum\IDE"
Кроме этого, вредонос проверяет, запущен ли он под отладкой, обращаясь к API-функции NtQueryInformationProcess со значением параметра ProcessInformationClass, равным ProcessDebugPort:
syscall Time=??????6940.915990,PID=2168,PPID=2716,TID=2848,ProcessName="\Device\HarddiskVolume2\*.exe",Method=NtQueryInformationProcess,Module=«nt»,vCPU=1,CR3=0x1F861000,Syscall=22,ProcessHandle=0xFFFFFFFFFFFFFFFF,ProcessInformationClass=0x7,ProcessInformation=0x8EBD0,ProcessInformationLength=0x8,ReturnLength=0x8E310
Описание значений параметра ProcessInformationClass, ссылка
В результате регистрируются подозрительные события Read.Process.Info.AntiDebug и Read.Registry.Key.CheckVM:
Обратим внимание, что SmokeLoader создает копию библиотеки ntdll и импортирует из нее все необходимые для работы Nt-функции, тем самым избегая трассировки вызовов. Этот пример отражает преимущества перехвата вызовов на уровне ядра, несмотря на некоторые ограничения и сложности реализации.
APT-группу ScarCruft (также известную как APT37, Group123, TEMP.Reaper) ассоциируют с корейским полуостровом, и ее целями являются страны Азии и Среднего Востока. Некоторые исследователи обобщают кластер активности ScarCruft с группировкой Lazarus (HIDDEN COBRA), которая считается причастной к эпидемии WannaCry в 2017 году.
Бэкдор группы ROKRAT, как и SmokeLoader, использует технику антиотладки с помощью API-функции NtQueryInformationProcess с параметром ProcessInformationClass, равным ProcessDebugPort, тем самым создавая подозрительное событие Read.Process.Info.AntiDebug. Кроме этого, он получает значение ключа SystemBiosVersion ветки реестра HARDWARE\DESCRIPTION\System для определения среды виртуализации:
regmon Time=??????8504.062491,PID=3448,PPID=1476,TID=2032,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryValueKey,Key="\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM",ValueName="SystemBiosVersion"
Еще один прием: проверка списка имен библиотек средств анализа (SbieDll.dll, dbghelp.dll, api_log.dll, dir_watch.dll) и того, загружены ли они в адресное пространство вредоноса:
librarymon Time=??????8504.052513,PID=3448,PPID=1476,TID=2032,ProcessName="\Device\HarddiskVolume2\***.exe",Method=LdrGetDllHandle,ModuleName="SbieDll.dll",ModulePath=""
librarymon Time=??????8504.053067,PID=3448,PPID=1476,TID=2032,ProcessName="\Device\HarddiskVolume2\***.exe",Method=LdrGetDllHandle,ModuleName="dbghelp.dll",ModulePath=""
librarymon Time=??????8504.053635,PID=3448,PPID=1476,TID=2032,ProcessName="\Device\HarddiskVolume2\***.exe",Method=LdrGetDllHandle,ModuleName="api_log.dll",ModulePath=""
librarymon Time=??????8504.054151,PID=3448,PPID=1476,TID=2032,ProcessName="\Device\HarddiskVolume2\***.exe",Method=LdrGetDllHandle,ModuleName="dir_watch.dll",ModulePath=""
Таким образом мы получаем еще два подозрительных срабатывания: Read.Registry.Key.CheckBios и Read.File.Module.CheckVM:
Группировка OilRig (APT34, HELIX KITTEN) более пяти лет атакует цели преимущественно в средневосточном регионе. В апреле 2019 года произошла утечка набора инструментов группы, позволившая лучше изучить техники преступников. А в октябре того же года выяснилось, что другая APT-группа Turla взламывала инфраструктуру OilRig для ее дальнейшего использования в своих кампаниях.
Бэкдор группы OopsIE выполняет серию уже знакомых нам WMI-запросов для обнаружения песочницы:
wmimon Time=??????4570.575516,PID=852,PPID=1476,TID=2668,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ExecQuery,Command="Select * from Win32_PointingDevice"
wmimon Time=??????4574.405101,PID=852,PPID=1476,TID=2668,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ExecQuery,Command="Select * from Win32_DiskDrive"
wmimon Time=??????4575.607899,PID=852,PPID=1476,TID=2668,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ExecQuery,Command="Select * from Win32_BaseBoard"
Проверяет библиотеку SbieDll.dll в своем адресном пространстве:
librarymon Time=??????4575.807535,PID=852,PPID=1476,TID=2668,ProcessName="\Device\HarddiskVolume2\***.exe",Method=LdrLoadDll,ModuleName="SbieDll.dll",ModulePath=""
В качестве подозрительных получаем события Create.Query.WMI.CheckVM и Read.File.Module.CheckVM.
В ноябре 2019 года мы опубликовали исследование активности группы Donot Team (APT-C-35, SectorE02). Интерес представляет вредоносный загрузчик Lo2, который является промежуточным звеном в загрузке компонентов yty — модульного вредоносного фреймворка.
После запуска Lo2 пытается определить установленное антивирусное ПО Avast и eScan путем проверки существования каталогов в результате установки продукта:
filetracer Time=??????7260.502664,PID=2648,PPID=1368,TID=1684,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryAttributesFile,FileName="\??\C:\Program Files\eScan",FileHandle=0x0,OBJ_CASE_INSENSITIVE=1
filetracer Time=??????7260.503217,PID=2648,PPID=1368,TID=1684,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryAttributesFile,FileName="\??\C:\Program Files (x86)\eScan",FileHandle=0x0,OBJ_CASE_INSENSITIVE=1
filetracer Time=??????7260.503750,PID=2648,PPID=1368,TID=1684,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryAttributesFile,FileName="\??\C:\Program Files\Avast Software",FileHandle=0x0,OBJ_CASE_INSENSITIVE=1
filetracer Time=??????7260.504231,PID=2648,PPID=1368,TID=1684,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryAttributesFile,FileName="\??\C:\Program Files (x86)\Avast Software",FileHandle=0x0,OBJ_CASE_INSENSITIVE=1
В результате получим подозрительное событие Read.File.Name.CheckAntivirus:
Для обнаружения виртуальной среды используется обращение к порту ввода-вывода 0x5658. Его использует VMware для взаимодействия с виртуальной машиной.
Обнаружение VMware загрузчиком Lo2
Заметить использование такого приема при анализе поведения трудно. Так как последовательность вызовов редко обфусцируется и чаще всего копируется как последовательность ассемблеровских инструкций, идущих подряд, ее можно обнаружить при сканировании записанного дампа памяти вредоносного процесса. Пример детектирующего YARA-правила:
В 2018 году мы проводили вебинар, на котором представили исследование особенностей программы-шпиона FinFisher (FinSpy), разработанной компанией Gamma Group. Ниже перечень действий, направленный на обход песочницы:
regmon Time=??????7840.046022,PID=2724,PPID=1324,TID=2648,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryValueKey,Key="\REGISTRY\MACHINE\SOFTWARE\WOW6432NODE\MICROSOFT\WINDOWS NT\CURRENTVERSION",ValueName="DigitalProductId"
regmon Time=***7840.051014,PID=2724,PPID=1324,TID=2648,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryValueKey,Key="\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM",ValueName="SystemBiosDate"
syscall Time=??????7827.116200,PID=2724,PPID=1324,TID=2648,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQuerySystemInformation,Module=«nt»,vCPU=1,CR3=0x51C15000,Syscall=51,SystemInformationClass=0x5,SystemInformation=0x4036E0,SystemInformationLength=0x10400,ReturnLength=0x9BE290
syscall Time=??????7835.094102,PID=2724,PPID=1324,TID=908,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtSetInformationThread,Module=«nt»,vCPU=1,CR3=0x4E1FC000,Syscall=10,ThreadHandle=0xFFFFFFFFFFFFFFFE,ThreadInformationClass=0x11,ThreadInformation=0x0,ThreadInformationLength=0x0
syscall Time=??????7841.348199,PID=2724,PPID=1324,TID=2648,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryInformationProcess,Module=«nt»,vCPU=0,CR3=0x51C15000,Syscall=22,ProcessHandle=0xFFFFFFFFFFFFFFFF,ProcessInformationClass=0x7,ProcessInformation=0x9BEC20,ProcessInformationLength=0x8,ReturnLength=0x9BE360
syscall Time=??????7841.348624,PID=2724,PPID=1324,TID=2648,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryInformationProcess,Module=«nt»,vCPU=0,CR3=0x51C15000,Syscall=22,ProcessHandle=0xFFFFFFFFFFFFFFFF,ProcessInformationClass=0x1E,ProcessInformation=0x9BEC20,ProcessInformationLength=0x8,ReturnLength=0x9BE360
В результате мы получаем список подозрительных событий:
Опасное поведение FinFisher, обнаруженное PT Sandbox
В этой статье мы рассмотрели некоторые техники обнаружения окружений, не подходящих для работы вредоносного ПО: приемы антиотладки, детект виртуализации и присутствия антивирусного ПО. В качестве примеров рассмотрели различные вредоносные семейства сложных троянов и инструментов APT-атак. Конечно, многообразие используемых подходов не сравнится с комбайнами по распознаванию анализирующих машин. Тем не менее техники применяются пусть и не самые продвинутые, но дополнительный пункт в графе детектов никогда не помешает.
Автор: Алексей Вишняков, старший специалист группы исследования угроз экспертного центра безопасности Positive Technologies
В интернете несложно найти примеры утилит (один, второй), сочетающие в себе сразу несколько хорошо известных техник для обнаружения песочниц, виртуализации или просто окружения для анализа вредоносного ПО (отладочных инструментов, снифферов, мониторов). Эти базы знаний пополняются находками самих исследователей, которые ищут новые методы, и способами, извлекаемыми при анализе вредоносов. Для так называемой массовой малвари, которая рассчитана на заражение произвольно взятой системы, умение определить неподходящее окружение жизненно необходимо, ведь шанс того, что вскоре оно попадет в средство анализа вредоносного ПО или на машину с установленным антивирусом, крайне велик, а значит, нужно уметь не выдавать себя как можно дольше.
С целенаправленными атаками ситуация меняется. Перед проведением такой атаки злоумышленники собирают как можно больше информации о цели, а значит, порой понимают, что нет необходимости тщательно маскироваться от виртуальных сред после успешного заражения. Кроме того, не всякие действия могут расцениваться как подозрительные, особенно если им не сопутствуют чрезмерные попытки малвари себя обезопасить. Также не стоит забывать, что в ряде организаций (например, у разработчиков ПО) существование виртуальной инфраструктуры — типичная ситуация.
В этой статье мы рассмотрим несколько примеров сложного вредоносного ПО, используемого в таргетированных атаках, и покажем, каким образом мы выявляем попытки обойти неподходящую среду по техникам T1497 и T1063 из MITRE ATT&CK.
PlugX .NET Wrapper
MD5: ca8042a6d13751ef5c908cf5bc334600
PlugX можно назвать классическим бэкдором, он известен более 10 лет. Широко используется преимущественно злоумышленниками из азиатских стран (в том числе и APT-группами). Его новые модификации обнаруживаются до сих пор. В качестве примера мы взяли исполняемый PE-файл на платформе .NET. Это лишь обертка для PlugX. Дроппер проверяет, существует ли процесс vmtoolsd в системе, если нет — внедряет шелл-код для распаковки и запуска полезной нагрузки бэкдора.
Поиск процесса vmtoolsd
Для того чтобы найти нужный нам процесс, требуется получить список всех процессов в системе. Убрав за скобки сопутствующие вызовы, мы упремся в вызов функции ядра NtQuerySystemInformation (здесь и далее будем использовать префикс Nt вместо Zw, чтобы не было расхождения с вырезками из журналов событий) со значением поля SystemInformationClass, равным SystemProcessInformation, или 0x5:
syscall Time=??????9276.891649,PID=2996,PPID=1368,TID=2848,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQuerySystemInformation,Module=«nt»,vCPU=1,CR3=0xC7FA000,Syscall=51,SystemInformationClass=0x5,SystemInformation=0x4C36A0,SystemInformationLength=0x20400,ReturnLength=0x8DEF0
К слову, проверить результат можно на более простом примере, проследив вызов хорошо известной API-функции CreateToolhelp32Snapshot из kernel32:
Вызов NtQuerySystemInformation из ntdll в ходе работы функции CreateToolhelp32Snapshot из kernel32
Вызов функции ядра в функции NtQuerySystemInformation из ntdll
В результате мы трактуем перехваченный вызов как попытку перечисления процессов в системе с вытекающим подозрительным поведением Read.Process.Name.Enumeration.
{
"detect.name": "Read.Process.Name.Enumeration",
"detect.type": "suspicious",
"process.id": "2996",
"process.name": "***.exe",
"unixtime": "??????9276.891649"
}
PipeMon
SHA1: 93628ed36d3b70c685be8a3436bd489a
Приведем более свежий пример. Двадцать первого мая наши коллеги из ESET опубликовали статью о новом бэкдоре PipeMon APT-группы Winnti, хорошо известной успешными атаками на цепочку поставок (supply chain) и заражениями крупных организаций из игровой индустрии. В этот раз они использовали новое вредоносное ПО, которое использует множества именованных каналов (named pipe) для взаимодействия между своими модулями. В процессе инсталляции, прежде чем внедрить в процесс главный и сторожевой (watchdog) модули, один из компонентов проверяет, принадлежит ли процесс ESET (ekrn.exe) и Kaspersky (avp.exe). Любопытно, что наличие антивирусного ПО не является преградой: вредонос продолжает свою деятельность, выбирая другой процесс-жертву, минуя обнаружение в попытке внедриться в охраняемый процесс. Не самая сложная техника, но мы не могли пройти мимо, с одной стороны, недавнего, с другой — смелого случая, который аналогичным образом определяется как подозрительное поведение Read.Process.Name.Enumeration.
CozyDuke
MD5: 3d3363598f87c78826c859077606e514
APT Cozy Bear (она же APT29, The Dukes, YTTRIUM) — одна из группировок, участники которой, предположительно, говорят на русском языке. Про их активность известно с 2008 года, а вредоносная кампания Operation Ghost показывает, что качество используемого ими ВПО по-прежнему высоко. Сфокусируемся на одном из флагманских бэкдоров группы — CozyDuke. В начале своей работы для обнаружения антивирусного ПО (Kaspersky, Dr.Web, Avira) вредонос запускает WMI-запросы SELECT * FROM AntiVirusProduct и SELECT * FROM FireWallProduct.
Кроме этого, бэкдор ищет антивирусные продукты в списке установленного софта, перечисляя ветку реестра SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall. WMI-вызовы отслеживаются путем наблюдения за использованием COM-интерфейса {4590F811-1D3A-11D0-891F-00AA004B2E24} (CLSID_WbemLocator) средствами вызова API CoCreateInstanse и дальнейшего разбора структур класса объекта:
wmimon Time=??????9653.749016,PID=556,PPID=1476,TID=1256,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ConnectServer,Resource=«root\SecurityCenter2»
wmimon Time=??????9653.865526,PID=556,PPID=1476,TID=1256,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ExecQuery,Command="SELECT * FROM AntiVirusProduct"
wmimon Time=??????9654.718217,PID=556,PPID=1476,TID=1256,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ExecQuery,Command="SELECT * FROM FireWallProduct"
Обращение к реестру фиксируется вызовом функции ядра NtEnumerateKey:
regmon Time=??????9653.942010,PID=556,PPID=1476,TID=1256,ProcessName="\Device\HarddiskVolume2\******.exe",Method=NtEnumerateKey,Key="\REGISTRY\MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\UNINSTALL"
В результате получаем подозрительные события Create.Query.WMI.CheckVM и Read.Registry.Key.CheckInstalledSoft:
{
"detect.name": "Create.Query.WMI.CheckVM",
"detect.type": "suspicious",
"process.id": "556",
"process.name": "***.exe",
"unixtime": "??????9653.865526"
}
{
"detect.name": " Read.Registry.Key.CheckInstalledSoft ",
"detect.type": "suspicious",
"process.id": "556",
"process.name": "***.exe",
"unixtime": "??????9653.942010"
}
Опасное поведение CozyDuke, обнаруженное PT Sandbox
Zebrocy AutoIt loader
MD5: 4d552f8927599915990c27fd606bd82f
APT Fancy Bear (она же APT28, Sofacy, Sednit) является одной из самых продвинутых группировок. За их авторством десятки бэкдоров, проксирующих троянов и инфостилеров: семейства троянов Xagent, Xtunnel, Sedreco, Downdelph и др. Создатели первого в мире UEFI-руткита LoJax не ограничиваются лишь вредоносами для Windows. Мы рассмотрим образец вредоносного семейства Zebrocy, написанный на языке AutoIt. Дополнительный слой упаковки с помощью UPX не усложняет получение Au3-интерпретируемого скрипта, в котором проверяется наличие процессов виртуального окружения VMware, VirtualBox или Parallels:
Поиск процессов VMware, VirtualBox или Parallels
Такая активность регистрируется уже рассмотренным ранее подозрительным поведением Read.Process.Name.Enumeration.
Стоит отметить, что с 2013 года для создания вариаций Zebrocy использовались и другие языки программирования: Delphi, C#, Python, а также набравший популярность Go. В одном из образцов на Go (MD5: f3ec38b8d5a6e29db299e2eadacbcebe) мы обнаружили простой, но очень эффективный трюк для обхода песочницы: троян проверяет, что собственное имя библиотеки (вредонос представляет собой элемент управления OLE, который регистрируется в системе с помощью regsvr) начинается с подстроки sap_. Шанс на то, что случайно попавший в систему для анализа вредонос будет проименован корректно, очень мал. Для успешной работы потребуется запустить цепочку заражения с самого начала, что не гарантирует получение загрузчика Zebrocy в качестве полезной нагрузки от управляющего сервера.
Расшифровка строки spa_ в Zebrocy Go
SmokeLoader
MD5: 5fc6f24d43bc7ca45a81d159291955d1
Мы решили включить известный вредоносный загрузчик SmokeLoader в список рассматриваемых семейств, так как, казалось бы, его достаточно простому целевому назначению (загрузить и запустить полезную нагрузку) сопутствуют немало приемов, усложняющих его анализ. Отметим, что мы наблюдали случаи использования этого вредоносного ПО хакерской группировкой TA505.
Для обнаружения средств виртуализации SmokeLoader считывает значения ключей реестра System\CurrentControlSet\Enum\IDE и System\CurrentControlSet\Enum\SCSI и ищет в них подстроки продуктов виртуализации QEMU, VirtualBox, VMware и Xen:
regmon Time=??????6940.916639,PID=2168,PPID=2716,TID=2848,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtOpenKeyEx,Key="\REGISTRY\MACHINE\System\CurrentControlSet\Enum\IDE"
Кроме этого, вредонос проверяет, запущен ли он под отладкой, обращаясь к API-функции NtQueryInformationProcess со значением параметра ProcessInformationClass, равным ProcessDebugPort:
syscall Time=??????6940.915990,PID=2168,PPID=2716,TID=2848,ProcessName="\Device\HarddiskVolume2\*.exe",Method=NtQueryInformationProcess,Module=«nt»,vCPU=1,CR3=0x1F861000,Syscall=22,ProcessHandle=0xFFFFFFFFFFFFFFFF,ProcessInformationClass=0x7,ProcessInformation=0x8EBD0,ProcessInformationLength=0x8,ReturnLength=0x8E310
Описание значений параметра ProcessInformationClass, ссылка
В результате регистрируются подозрительные события Read.Process.Info.AntiDebug и Read.Registry.Key.CheckVM:
{
"detect.name": "Read.Process.Info.AntiDebug",
"detect.type": "suspicious",
"process.id": "2168",
"process.name": "***.exe",
"unixtime": "??????6940.915990"
}
{
"detect.name": Read.Registry.Key.CheckVM",
"detect.type": "suspicious",
"process.id": "2168",
"process.name": "*.exe",
"unixtime": "??????6940.916639"
}
Обратим внимание, что SmokeLoader создает копию библиотеки ntdll и импортирует из нее все необходимые для работы Nt-функции, тем самым избегая трассировки вызовов. Этот пример отражает преимущества перехвата вызовов на уровне ядра, несмотря на некоторые ограничения и сложности реализации.
ROKRAT
MD5: bedc4b9f39dcc0907f8645db1acce59e
APT-группу ScarCruft (также известную как APT37, Group123, TEMP.Reaper) ассоциируют с корейским полуостровом, и ее целями являются страны Азии и Среднего Востока. Некоторые исследователи обобщают кластер активности ScarCruft с группировкой Lazarus (HIDDEN COBRA), которая считается причастной к эпидемии WannaCry в 2017 году.
Бэкдор группы ROKRAT, как и SmokeLoader, использует технику антиотладки с помощью API-функции NtQueryInformationProcess с параметром ProcessInformationClass, равным ProcessDebugPort, тем самым создавая подозрительное событие Read.Process.Info.AntiDebug. Кроме этого, он получает значение ключа SystemBiosVersion ветки реестра HARDWARE\DESCRIPTION\System для определения среды виртуализации:
regmon Time=??????8504.062491,PID=3448,PPID=1476,TID=2032,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryValueKey,Key="\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM",ValueName="SystemBiosVersion"
Еще один прием: проверка списка имен библиотек средств анализа (SbieDll.dll, dbghelp.dll, api_log.dll, dir_watch.dll) и того, загружены ли они в адресное пространство вредоноса:
librarymon Time=??????8504.052513,PID=3448,PPID=1476,TID=2032,ProcessName="\Device\HarddiskVolume2\***.exe",Method=LdrGetDllHandle,ModuleName="SbieDll.dll",ModulePath=""
librarymon Time=??????8504.053067,PID=3448,PPID=1476,TID=2032,ProcessName="\Device\HarddiskVolume2\***.exe",Method=LdrGetDllHandle,ModuleName="dbghelp.dll",ModulePath=""
librarymon Time=??????8504.053635,PID=3448,PPID=1476,TID=2032,ProcessName="\Device\HarddiskVolume2\***.exe",Method=LdrGetDllHandle,ModuleName="api_log.dll",ModulePath=""
librarymon Time=??????8504.054151,PID=3448,PPID=1476,TID=2032,ProcessName="\Device\HarddiskVolume2\***.exe",Method=LdrGetDllHandle,ModuleName="dir_watch.dll",ModulePath=""
Таким образом мы получаем еще два подозрительных срабатывания: Read.Registry.Key.CheckBios и Read.File.Module.CheckVM:
{
"detect.name": "Read.Registry.Key.CheckBios",
"detect.type": "suspicious",
"process.id": "3448",
"process.name": "***.exe",
"unixtime": "??????8504.062491"
}
{
"detect.name": "Read.File.Module.CheckVM",
"detect.type": "suspicious",
"process.id": "3448",
"process.name": "***.exe",
"unixtime": "??????8504.054151"
}
OopsIE
MD5: 5998ef679682878e68d5ac4a1733fac5
Группировка OilRig (APT34, HELIX KITTEN) более пяти лет атакует цели преимущественно в средневосточном регионе. В апреле 2019 года произошла утечка набора инструментов группы, позволившая лучше изучить техники преступников. А в октябре того же года выяснилось, что другая APT-группа Turla взламывала инфраструктуру OilRig для ее дальнейшего использования в своих кампаниях.
Бэкдор группы OopsIE выполняет серию уже знакомых нам WMI-запросов для обнаружения песочницы:
wmimon Time=??????4570.575516,PID=852,PPID=1476,TID=2668,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ExecQuery,Command="Select * from Win32_PointingDevice"
wmimon Time=??????4574.405101,PID=852,PPID=1476,TID=2668,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ExecQuery,Command="Select * from Win32_DiskDrive"
wmimon Time=??????4575.607899,PID=852,PPID=1476,TID=2668,ProcessName="\Device\HarddiskVolume2\***.exe",Method=ExecQuery,Command="Select * from Win32_BaseBoard"
Проверяет библиотеку SbieDll.dll в своем адресном пространстве:
librarymon Time=??????4575.807535,PID=852,PPID=1476,TID=2668,ProcessName="\Device\HarddiskVolume2\***.exe",Method=LdrLoadDll,ModuleName="SbieDll.dll",ModulePath=""
В качестве подозрительных получаем события Create.Query.WMI.CheckVM и Read.File.Module.CheckVM.
Lo2
MD5: 22f41b6238290913fc4d196b8423724d
В ноябре 2019 года мы опубликовали исследование активности группы Donot Team (APT-C-35, SectorE02). Интерес представляет вредоносный загрузчик Lo2, который является промежуточным звеном в загрузке компонентов yty — модульного вредоносного фреймворка.
После запуска Lo2 пытается определить установленное антивирусное ПО Avast и eScan путем проверки существования каталогов в результате установки продукта:
filetracer Time=??????7260.502664,PID=2648,PPID=1368,TID=1684,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryAttributesFile,FileName="\??\C:\Program Files\eScan",FileHandle=0x0,OBJ_CASE_INSENSITIVE=1
filetracer Time=??????7260.503217,PID=2648,PPID=1368,TID=1684,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryAttributesFile,FileName="\??\C:\Program Files (x86)\eScan",FileHandle=0x0,OBJ_CASE_INSENSITIVE=1
filetracer Time=??????7260.503750,PID=2648,PPID=1368,TID=1684,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryAttributesFile,FileName="\??\C:\Program Files\Avast Software",FileHandle=0x0,OBJ_CASE_INSENSITIVE=1
filetracer Time=??????7260.504231,PID=2648,PPID=1368,TID=1684,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryAttributesFile,FileName="\??\C:\Program Files (x86)\Avast Software",FileHandle=0x0,OBJ_CASE_INSENSITIVE=1
В результате получим подозрительное событие Read.File.Name.CheckAntivirus:
{
"detect.name": "Read.File.Name.CheckAntivirus",
"detect.type": "suspicious",
"process.id": "2648",
"process.name": "***.exe",
"unixtime": "??????7260.504231"
}
Для обнаружения виртуальной среды используется обращение к порту ввода-вывода 0x5658. Его использует VMware для взаимодействия с виртуальной машиной.
Обнаружение VMware загрузчиком Lo2
Заметить использование такого приема при анализе поведения трудно. Так как последовательность вызовов редко обфусцируется и чаще всего копируется как последовательность ассемблеровских инструкций, идущих подряд, ее можно обнаружить при сканировании записанного дампа памяти вредоносного процесса. Пример детектирующего YARA-правила:
rule tool_mem_ZZ_antiVM__Risktool__VMwarePort{
strings:
$asm_code_x86 = {
BB 00 00 00 00
B9 0A 00 00 00
BA 58 56 00 00
ED
81 FB 68 58 4D 56
}
condition:
any of them
}
FinFisher
MD5: a7b990d5f57b244dd17e9a937a41e7f5
В 2018 году мы проводили вебинар, на котором представили исследование особенностей программы-шпиона FinFisher (FinSpy), разработанной компанией Gamma Group. Ниже перечень действий, направленный на обход песочницы:
- Проверяет ключ DigitalProductId ветки реестра SOFTWARE\Microsoft\Windows NT\CurrentVersion на содержание следующих строк: «55274-649-6478953-23109», «A22-00001», «47220».
regmon Time=??????7840.046022,PID=2724,PPID=1324,TID=2648,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryValueKey,Key="\REGISTRY\MACHINE\SOFTWARE\WOW6432NODE\MICROSOFT\WINDOWS NT\CURRENTVERSION",ValueName="DigitalProductId"
- Проверяет ключ SystemBiosDate ветки реестра HARDWARE\Description\System на равенство строке «01/02/03».
regmon Time=***7840.051014,PID=2724,PPID=1324,TID=2648,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryValueKey,Key="\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM",ValueName="SystemBiosDate"
- Проверяет имена процессов и драйверов через вызов API-функции NtQuerySystemInformation.
syscall Time=??????7827.116200,PID=2724,PPID=1324,TID=2648,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQuerySystemInformation,Module=«nt»,vCPU=1,CR3=0x51C15000,Syscall=51,SystemInformationClass=0x5,SystemInformation=0x4036E0,SystemInformationLength=0x10400,ReturnLength=0x9BE290
- Вызывает API-функцию NtSetInformationThread с параметром ThreadInformationClass, равным 0x11 (HideFromDebugger).
syscall Time=??????7835.094102,PID=2724,PPID=1324,TID=908,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtSetInformationThread,Module=«nt»,vCPU=1,CR3=0x4E1FC000,Syscall=10,ThreadHandle=0xFFFFFFFFFFFFFFFE,ThreadInformationClass=0x11,ThreadInformation=0x0,ThreadInformationLength=0x0
- Вызывает API-функцию NtQueryInformationProcess с параметром ProcessInformationClass, равным 0x7 (DebugPort).
syscall Time=??????7841.348199,PID=2724,PPID=1324,TID=2648,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryInformationProcess,Module=«nt»,vCPU=0,CR3=0x51C15000,Syscall=22,ProcessHandle=0xFFFFFFFFFFFFFFFF,ProcessInformationClass=0x7,ProcessInformation=0x9BEC20,ProcessInformationLength=0x8,ReturnLength=0x9BE360
- Вызывает API-функцию NtQueryInformationProcess с параметром ProcessInformationClass, равным 0x1e (ProcessDebugObjectHandle).
syscall Time=??????7841.348624,PID=2724,PPID=1324,TID=2648,ProcessName="\Device\HarddiskVolume2\***.exe",Method=NtQueryInformationProcess,Module=«nt»,vCPU=0,CR3=0x51C15000,Syscall=22,ProcessHandle=0xFFFFFFFFFFFFFFFF,ProcessInformationClass=0x1E,ProcessInformation=0x9BEC20,ProcessInformationLength=0x8,ReturnLength=0x9BE360
В результате мы получаем список подозрительных событий:
- Read.Registry.Key.DigitalProductId,
- Read.Registry.Key.CheckBios,
- Read.Process.Name.Enumeration.
- Write.Thread.Info.AntiDebug,
- Read.Process.Info.AntiDebug.
Опасное поведение FinFisher, обнаруженное PT Sandbox
Заключение
В этой статье мы рассмотрели некоторые техники обнаружения окружений, не подходящих для работы вредоносного ПО: приемы антиотладки, детект виртуализации и присутствия антивирусного ПО. В качестве примеров рассмотрели различные вредоносные семейства сложных троянов и инструментов APT-атак. Конечно, многообразие используемых подходов не сравнится с комбайнами по распознаванию анализирующих машин. Тем не менее техники применяются пусть и не самые продвинутые, но дополнительный пункт в графе детектов никогда не помешает.
Автор: Алексей Вишняков, старший специалист группы исследования угроз экспертного центра безопасности Positive Technologies
arero
Это получается можно свою домашнюю систему настроить так что бы она представлялась вирутальной машиной и теперь вирусы будут встрахе закрываться, что и антивирус можно не ставить =)
Deosis
В природе это называется мимикрией.