Троянец Gootkit – это сложный многоступенчатый банковский зловред, впервые обнаруженный в 2014 году аналитиками компании «Доктор Веб». Изначально он распространялся посредством спама и с помощью наборов эксплойтов, таких как Spelevo и RIG. Позднее, в дополнение к спамерским атакам, злоумышленники переключились на атаки через скомпрометированные веб-сайты, с которых пользователей обманом убеждают загружать вредоносное ПО.
Gootkit способен красть информацию из браузеров, осуществлять атаки «человек в браузере» (MitB), перехватывать данные, вводимые с клавиатуры, делать скриншоты и осуществлять множество других вредоносных действий. Загрузчик этого троянца выполняет различные проверки на наличие виртуальных машин и песочниц и использует сложные алгоритмы закрепления. Активность Gootkit была приостановлена в 2019 году, после того как его операторы пострадали от утечки данных, но с ноября 2020 года он снова активен.
Жертвы Gootkit в основном находятся в странах Евросоюза, в частности в Германии и Италии. В этой статье мы проанализировали один из недавних образцов Gootkit.
Техническая информация
Gootkit состоит из загрузчика, написанного на C++, и основного компонента, написанного на JavaScript (JS) и использующего интерпретатор Node.js. Основной компонент программы представляет собой модульный фреймворк, включающий модули для регистрации, шпионажа, обнаружения виртуальных машин и для других целей.
Загрузчик
Образец (MD5 97713132e4ea03422d3915bab1c42074) упакован оригинальным многоступенчатым упаковщиком, который поэтапно расшифровывает полезную нагрузку. На последнем этапе шелл-код расшифровывает исходный исполняемый файл загрузчика и внедряет его в память. После внедрения вызывается начальная точка входа. Следовательно, мы можем легко распаковать исходный исполняемый файл и проанализировать его. Наше ПО определяет загрузчик Gootkit с разными вердиктами, как в таблице ниже.
MD5 | SHA-1 | Вердикт |
97713132e4ea03422d3915bab1c42074 | a90c6e7c5650e73ceb0b329fa8c78045632100ee | Trojan-Downloader.Win32.Injecter |
27626f2c3667fab9e103f32e2af11e84 | 6e9e30c699c7111089fe364ce47f1dc05c8bc703 | HEUR:Trojan.Win32.Generic |
Большинство строк зашифрованы операцией XOR и расшифровываются в процессе выполнения. Другие приемы защиты от статического анализа не используются.
Расшифровка строк
Однако для затруднения динамического анализа загрузчик Gootkit различными методами проверяет, не выполняется ли он в виртуальной или отладочной среде. Если хотя бы одна из проверок сработает, загрузчик входит в бесконечный цикл.
Проверка имени образца
Полный список методов обнаружения виртуальных машин, используемых вредоносной программой
Проверка | Запрещенное значение |
CRC32 имени образца | 0xBC136B46, 0xD84A20AC, 0xEED889C4, 0x58636143, 0xC0F26006, 0x8606BEDD, 0xE8CBAB78, 0x2AB6E04A, 0x31E6D1EA |
GetModuleHandle | dbghelp.dll, sbiedll.dll |
GetUserName | CurrentUser, Sandbox |
GetComputerName | SANDBOX, 7SILVIA |
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\SystemBiosVersion | FTNT1, INTEL-604000, SMCI, QEMU, VBOX, BOCHS, AMI, SONI |
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\VideoBiosVersion | VirtualBox |
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\SystemBiosVersion | 55274-640-2673064-23950 (Joe Sandbox), 76487-644-3177037-23510 (CWSandbox), 76487-337-8429955-22614 (Anubis Sandbox) |
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcess\0\ProcessorNameString | Xeon |
_MEMORYSTATUSEX. ullTotalPhys | Менее 2 100 000 000 |
UuidCreateSequential (результат этой функции зависит от MAC-адреса компьютера, и возвращаемое ей значение используется, чтобы определить, выполняется ли троянец в песочнице) | 0xF01FAF00 (Dell Inc.), 0x505600 (VMWare, Inc.), 0x8002700 (PCS System Technology GmbH), 0xC2900 VMWare, Inc.), 0x56900 (VMWare, Inc.), 0x3FF00 (Microsoft), 0x1C4200 (Parallels), 0x163E00 (XenSource) |
CRC32 имен запущенных процессов | 0xAEA3ED09, 0x2993125A, 0x3D75A3FF, 0x662D9D39,
0x922DF04, 0xC84F40F0, 0xDCFC6E80 |
Процесс выполнения
При запуске образец проверяет аргументы командной строки. Доступные аргументы перечислены ниже:
Аргумент | Описание |
—client | Нет обработчика |
—server | Нет обработчика |
—reinstall | Проверяет все выполняемые процессы (номер процесса является переменной цикла) и завершает все процессы, где process.pid не совпадает с PID текущего процесса, а process.name совпадает с именем текущего файла; затем зловред копирует и запускает сам себя посредством CreateProcessW |
—service | Задает переменную окружения USERNAME_REQUIRED=TRUE |
—test | Останавливает выполнение |
—vwxyz | Загружает с командного сервера основной компонент |
После обработки аргументов командной строки образец проверяет, не выполняется ли он внутри виртуальной машины или в отладочной среде. Если проверка пройдена успешно (ни виртуальная машина, ни отладочная среда не обнаружены), он расшифровывает конфигурацию и запускает четыре потока.
Процедура запуска потоков
- Update_from_c2
Это первый из запускаемых потоков. Он пытается загрузить обновление для загрузчика из расположения <CnC host>/rpersist4/<crc>, где <CnC host> — это адрес командного сервера, а <crc> — это CRC32 первых 0x200 байт текущего файла в десятичном формате. - Browser_inj
Расшифровывает два встроенных исполняемых MZPE-файла (DLL-библиотеки для архитектур x64 и x86), перебирает запущенные процессы и пытается внедрить расшифрованные библиотеки в память определенных процессов посредством API NtCreateSection/NtMapViewOfSection. Сопоставление имен процессов выполняется путем вычисления CRC32 имени процесса. Список поддерживаемых браузеров приведен в таблице ниже.CRC32 Браузер 0xC84F40F0 Chrome 0x662D9D39 Firefox 0x922DF04 Internet Explorer 0x2993125A Microsoft Edge (процесс MicrosoftEdgeCP.exe) 0x3D75A3FF Opera 0xDCFC6E80 Safari 0xEB71057E неизвестно Внедренный код вызывается из процедур веб-инжекта и перехвата трафика в основном компоненте зловреда для осуществления атаки типа «человек в браузере» (MitB). С этой целью код подменяет стандартные функции браузера, отвечающие за проверку сертификатов, чтобы они разрешали использование самоподписанных сертификатов. Это позволяет злоумышленникам внедрять свой JavaScript-код и модифицировать или перенаправлять трафик.
- Persistence_service
Если поток выполняется под учетной записью LOCAL_SYSTEM, механизм закрепления Gootkit эксплуатирует объекты групповых политик (GPO) Windows, ожидающие выполнения. Когда пользователь модифицирует значения реестра для таких объектов, он должен указать следующие параметры:- count — счетчик ожидающих GPO;
- path1, path2, … — пути к специальным INF-файлам, содержащим инструкции по загрузке GPO;
- Section1, Section2, … — имена разделов в INF-файлах.
Gootkit создает INF-файл в каталоге, где находится образец, и записывает в раздел реестра Software\Microsoft\IEAK\GroupPolicy\PendingGPOs следующие значения:
- count — 0x1
- path1 — расположение INF-файла
- Section1 — DefaultInstall
Содержимое INF-файла
Теперь explorer.exe будет загружать объекты групповых политик при каждом запуске. Gootkit создает ожидающий GPO для пакета администрирования Internet Explorer (IEAK), указывающий непосредственно на INF-файл. Когда explorer.exe загружается, он выполняет инструкции раздела [DefaultInstall] в созданном файле, запуская исполняемый файл Gootkit.
Если образец выполняется под другой учетной записью, он создает службу со случайным именем, выбранным из %SystemRoot%, копирует себя в папку %SystemRoot% с выбранным именем и удаляется с диска.
- Stop_switch
Этот поток ищет файл с именем uqjckeguhl.tmp в папках \AppData\Local\Temp и \Local Settings\Temp. Найдя файл, зловред прекращает выполнение.
Загрузка основного компонента
Перед загрузкой основного компонента с командного сервера загрузчик пытается найти разделы реестра с именами и путем следующего формата: HKCU\Software\AppDataLow\<pr_string>_<i>, где i — номер блока данных, начиная с 0, а pr_string — псевдослучайная строка, сгенерированная при запуске бота. Она создается на основе параметров компьютера жертвы, поэтому для одного ПК каждый раз будет генерироваться одно и то же значение.
Каждый раздел содержит блок зашифрованных данных объемом максимум 512 000 байт. Если вышеупомянутые разделы были найдены, их содержимое будет сохранено в специально выделенном буфере, используемом для расшифровки и распаковки. Затем содержимое буфера расшифровывается с помощью той же функции, что и конфигурация, после чего распаковывается.
После распаковки загрузчик загружает с командного сервера основной компонент, вычисляет его контрольную сумму CRC32 и сравнивает полученное значение с CRC полезной нагрузки в реестре (если это значение присутствует). При несовпадении контрольных сумм загрузчик выполняет более новую версию, загруженную с командного сервера. Командный сервер не отправляет DLL-модуль без соответствующего заголовка UserAgent, который жестко задан в образце. Текущее значение UserAgent таково: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/21006101 Firefox/25.0.
Функция расшифровки
Основной компонент
Основной компонент (MD5 20279d99ee402186d1e3a16d6ab9398a, вердикт: HEUR:Trojan.Win32.Generic) представляет собой интерпретатор Node.js со встроенными зашифрованными JS-файлами. При запуске он расшифровывает файлы JavaScript, используя RC4-подобный алгоритм с жестко заданным ключевым потоком.
Информация о встроенных модулях хранится в массиве специальных структур, имеющих следующий формат: BYTE* name_pointer, BYTE* encrypted_data, DWORD data_size, DWORD encr_flag. Эти структуры используются внутри процедуры расшифровки, которая считывает data_size байтов, начиная с позиции encrypted_data. Процедура расшифровывает структуру encrypted_data, если задано значение encr_flag, и записывает результат в файл с именем *name_pointer. Процедура расшифровки перебирает все записи в массиве информации о файлах. После этого выполнение расшифровки передается интерпретатору Node.js.
Массив информации о файлах
Массив содержит 124 зашифрованных файла – как системные библиотеки и пакеты с открытым исходным кодом Node.js, так и вредоносные модули. Интересно, что точкой входа JavaScript является файл с именем malware.js.
Malware.js инициализирует глобальные переменные бота, собирает сохраненные файлы cookie (из IE, Firefox и Chromium) и перебирает список командных серверов в поисках доступного.
Когда вредоносная программа находит командный сервер, она запускает бесконечный цикл прослушки различных внутренних событий, связанных с работой модулей (некоторые процедуры, такие как сбор файлов cookie, запускаются без запроса к командному серверу при старте бота), и отправляет собранные данные на командный сервер в пакетах специального формата. Зловред также получает команды с командного сервера, вызывая соответствующий обработчик для каждой из них. Чтобы взаимодействовать с модулями, вредоносное ПО использует следующие типы пакетов:
Внутреннее имя | Описание |
SLAVE_PACKET_API_TAKESCREEN | Отправка скриншота на командный сервер |
SLAVE_PACKET_MAIL | Отправка информации о полученных электронных письмах |
SLAVE_PACKET_LOGLINE | Отправка лога |
SLAVE_PACKET_LSAAUTH | Отправка учетных данных |
SLAVE_PACKET_PAGE_FRAGMENT | Отправка данных веб-инжектов |
SLAVE_PACKET_FORM | Отправка данных перехваченной формы |
SLAVE_PACKET_LOCAL_VARS | Отправка локальных переменных бота |
SLAVE_PACKET_SECDEVICELOG | Отправка лога событий безопасности устройства |
SLAVE_PACKET_KEYLOG | Отправка данных кейлоггера |
SLAVE_PACKET_WINSPYLOG | Отправка текущего активного окна |
Существует шесть типов обработчиков внутренних событий и соответствующих форматов пакетов.
Обработчики событий
Общая структура пакета выглядит так:
- Длина+8 (4 байта)
- Магическое значение пакета (0xEDB88320 XOR (длина+8))
- Данные пакета (различаются для пакетов разных типов, для сериализации используется protobuf)
- Магическое значение пакета
Процедура генерации пакетов
Наши продукты детектируют угрозу со следующими вердиктами: Trojan-Downloader.Win32.Injecter, HEUR:Trojan.Win32.Generic, Trojan-Downloader.Win32.Gootkit, Trojan-Banker.Win32.Gootkit. Все детали, индикаторы компрометации, данные фреймворка MITRE ATT&CK, правила YARA и хэши, относящиеся к данной угрозе, доступны пользователям нашего сервиса Financial Threat Intelligence. Узнать больше про анализ вредоносного ПО и исследование угроз можно на тренингах, которые проводят эксперты GReAT.
Индикаторы компрометации
Основной компонент (не изменялся с 2019 г.)
20279d99ee402186d1e3a16d6ab9398
Загрузчик
5249c568fb2746786504b049bbd5d9c8
97713132e4ea03422d3915bab1c42074
174A0FED20987D1E2ED5DB9B1019E49B
27626f2c3667fab9e103f32e2af11e84
Домены и IP-адреса
kvaladrigrosdrom[.]top
scellapreambulus[.]top
lbegardingstorque[.]com
kerymarynicegross[.]top
pillygreamstronh[.]com
Осторожный троянец Gootkit