- sha1: 853d6a17f0a1a4035b52699a447eeb4ad1ca6cf7
Описание
Вредоносная программа для ОС Windows, написанная на С++. Основная функциональность трояна заключается в загрузке и управлении модулями, получаемыми от С2-сервера.
Принцип действия
Троян имеет ряд основных и вспомогательных структур, которые инициализируются при запуске и сохраняются как указатели в глобальных переменных.
Основные структуры:
Работа с WinAPI
Троян опосредованно работает с системными функциями WinAPI через структуру-обертку, содержащую таблицу с функциями, указатели на библиотеки, адреса загрузки библиотек и флаг, отвечающий за противодействие отладке.
Таблица функций содержит:
- функции для работы с WinAPI — нахождение указателя на функцию и ее вызова,
- вспомогательные функции — собственная реализация LoadLibrary и GetProcAddress,
- конфигурацию входных параметров для ряда функций,
В самом начале выполнения троян инициализирует основную структуру приложения. Для этого он с помощью модифицированного алгоритма CRC32 находит в структуре PEB_LDR_DATA адреса загрузки библиотек. Для получения функций из библиотек троян использует два способа:
- Собственная реализация вызовов LoadLibrary и GetProcAddress
Троян имеет две функции, которые повторяют реализацию LoadLibrary и GetProcAddress. Данный способ применяется в тех случаях, когда требуется доступ к API, содержащемуся в ещё незагруженной в память процесса библиотеке. - Поиск библиотек по хешам в PEB_LDR_DATA
Троян ищет нужную библиотеку в структуре PEB_LDR_DATA посредством списка InMemoryOrderModuleList, который содержит в том числе указатели на все загруженные в память процесса библиотеки и их имена. При этом совпадение имени библиотеки вычисляется методом сравнения значения хеша модифицированного алгоритма CRC32 с искомым. Далее через таблицу экспортируемых функций библиотеки находится нужная, при этом имена функций хешируются аналогичным способом.
Имена библиотеки и функции считываются с помощью модифицированного алгоритма CRC32.
Структура для журналирования событий
Представляет собой структуру, основное назначение которой — формирование журнала приложения. Журнал содержит как сведения об ошибках, так и сведения о текущем выполняемом этапе.
Структура для сбора системной информации
Основное назначение данной структуры — сбор системной информации для последующей отправки на С2-сервер.
Структура для общения с С2-сервером
Данная структура обеспечивает канал связи для взаимодействия с управляющим сервером. Содержит структуру для работы с библиотекой winhttp.dll и сведения об управляющем сервере: порт, IP-адрес и таблицу маршрутизации.
Структура для работы с модулями и конфигурациями
Основная функция данной структуры заключается в управлении работой модулей и их конфигураций. Содержит векторы, описывающие модули, их конфигурацию, а также вспомогательную системную информацию.
Структура для управления приложением
Основное назначение данной структуры — управление работой программы и централизация остальных структур. Содержит указатели на структуры для работы с WinAPI, журналированием, взаимодействием с управляющим сервером, а также работы с модулями и конфигурациями.
Вспомогательные структуры:
- структуры для работы с криптографией – SHA-1, SHA-256,
- структуры для работы со вспомогательными библиотеками: bcrypt.dll, winhttp.dll,
- структуры, хранящие в себе различные флаги.
Защита от отладки
Также в самом начале инициализируются 3 потока, отвечающие за противодействие отладке.
Проверка отладочных регистров
Троян получает контекст родительского потока и проверяет, чтобы значения отладочных регистров Dr0–Dr7 были равны 0.
Проверка подключенного отладчика
В структуре KUSER_SHARED_DATA троян проверяет первые два бита в поле KdDebuggerEnabled, значение которых должно быть равно 0.
С помощью функции NtQueryInformationProcess троян проверяет наличие отладчика, запрашивая разные параметры структуры PROCESSINFOCLASS: ProcessDebugFlags, ProcessDebugPort, ProcessDebugObjectHandle, ProcessTlsInformation.
Поиск драйверов отладчиков
Выполняет поиск в директории %WINDIR%\System32\drivers на предмет выявления файлов отладочного ПО. Считает хеши имен файлов с помощью модифицированного алгоритма CRC32 и сравнивает результат с хешами из черного списка.
Проверка уникальности трояна в системе
После инициализации троян пытается создать мьютекс, которым является закодированный с помощью Base64 SHA-1 хеш значения строки MachineGuid. При неудачной попытке захватить мьютекс в журнал пишется строчка “Found another agent running. Exiting... ” и выполнение программы завершается.
Проверка ключей и создание хэндшейка
Троян выполняет проверку наличия уже созданного хэндшейка. Она осуществляется путем получения доступа к ключу с помощью функции NCryptOpenKey, при этом поставщиком хранилища ключей CNG является "Microsoft Software Key Storage Provider", а именем ключа — SHA-256-хеш от значения MachineGuid. Если такой ключ отсутствует, то проверяется наличие интернет-соединения: если оно установлено, то начинается создание хэндшейка.
- Создается копия внутреннего ключа RSA из хранилища ключей CNG "Microsoft Software Key Storage Provider".
- Происходит получение ключа от сервера.
- Ключ сохраняется в хранилище с именем, соответствующим SHA-256-хешу значения MachineGuid.
Из пришедшего пакета троян получает новые адрес сервера и номер порта. После создания хендшейка собирается системная информация: архитектура процессора, название ОС, тип пользовательского интерфейса, идентификаторы установленных приложений, сведения о диске, имена пользователей и региональные настройки.
Основные функции
Троян выполняет следующие основные функции:
- загрузка и выгрузка модулей,
- формирование сообщений для С2-сервера о результатах работы или ошибках,
- изменение конфигурации и настройка модулей,
- обновление тела трояна при необходимости.
Структура модулей и конфигурация
Модуль представляет собой динамическую библиотеку, которая проецируется в память и обладает следующими экспортируемыми функциями:
Start
Stop
Configure
GetID
GetStatus
SetStatus
GetStarted
GetHandler
Destroy
PushErrorCMR
Идентификатор модуля обозначает его функцию — то есть, зная идентификатор, можно определить приходящие от сервера задачи.
Идентификатор | Функция |
---|---|
238 | Inject |
27 | Назначение неизвестно |
44 | Назначение неизвестно |
JSON с конфигурацией модуля
{
"triggers": [
{
"schedule": "",
"process": "",
"repetitions": "",
"sendCmr": {
"name": "",
"interval": ""
}
}
]
}
Результат выполнения модуля
После выполнения задачи модуля формируется ответ:
{
"CommandModuleResponse": "",
"requestId": "",
"moduleId": "",
"exitCode": "",
"info": "Error" //если в работе модуля произошла ошибка, иначе данное поле отсутствует
}
Обновление трояна
Во время работы троян проверяет наличие флага обновления своего основного тела. Если данный флаг установлен, троян выполняет ряд системных проверок, по результатам которых выбирается одна из двух стратегий обновления. При выявлении установленного на скомпрометированном ПК антивирусного ПО обновление происходит через загрузку шелл-кодов, в противном случае — с помощью модуля Inject.
Проверка наличия антивирусного ПО
В теле трояна зашит список хешей имен антивирусных программ. В рамках проверки троян получает список процессов и считает хеши запущенных приложений, которые сравниваются со следующим встроенным списком:
• msmpeng
• mssense
• avastsvc
• dwservice
• avp
• nortonsecurity
• coreserviceshell
• avguard
• fshoster32
• vsserv
• mbam
• adawareservice
• avgsvc
• wrsa
Шелл-код для очистки директории
Входные аргументы:
- имя директории.
Основные выполняемые действия:
- поиск в структуре PEB_LDR_DATA адреса библиотеки kernel32.dll,
- получение из экспорта библиотеки функций для работы шелл-кода, при этом имя библиотеки и имена функций определяются по хешу,
- формирование пути до директории %LOCALAPPDATA%\EROCS\,
- перезаписывание нулями и удаление всех файлов в указанной директории,
- удаление самой директории.
Шелл-код для перезапуска трояна
Основные выполняемые действия:
- получение списка процессов посредством функции NtQuerySystemInformation (параметр SystemProcessInformation), проверка совпадения значения поля UniqueProcessId значению 0x434F5245,
- если данное значение не найдено — создание процесса, перезапускающего трояна,
- удаление ключа HKEY_CURRENT_USER\Software\Uninstall.
Самоудаление
Также троян имеет функцию самоудаления, запускаемую при определенном значении ключа реестра “deadline”, который обновляется при получении новых ответов от С2-сервера и отвечает за время жизни трояна.
Также, если в ходе описанных выше проверок были обнаружены ошибки, троян запускает процедуру самоудаления посредством WinAPI. При этом выполняются следующие действия:
- удаляется директория хранения трояна,
- удаляется созданный хендшейк,
- удаляются ключи реестра, созданные во время работы трояна.
Отправка сообщений на С2-сервер
Для отправки сообщений троян использует следующие User-Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.3
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/53
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.3
Все исходящие и входящие сообщения шифруются с помощью RSA.