- Упаковщик: отсутствует
- Дата компиляции: 07.03.2019 07:04:48
- SHA1-хеш: fc698eb0d7d6948605a7e5ba6708752b691a3fec
Описание
Многокомпонентный троян-бэкдор, написанный на C++ с использованием библиотеки Active Template Library (ATL) предназначенный для работы в 32- и 64-битных операционных системах семейства Microsoft Windows. Используется для несанкционированного управления зараженным компьютером и доступа к содержащейся на устройстве информации. Троян представляет собой COM-сервер, работающий в оперативной памяти в контексте системного процесса.
Принцип действия
Троян функционирует только в случае его загрузки в процесс с именем explorer.exe или regsvr32.exe. Это объясняется спецификой работы образца — через regsvr32.exe троян регистрируется в системе, а его выполнение происходит в контексте explorer.exe.
При запуске через regsvr32 (с ключом /i или без ключей) вызывается экспортируемая трояном функция DllRegisterServer, которая отвечает за регистрацию в системе его COM-интерфейса:
[<HKLM>\Software\Classes\Server.ServerMain.1] '' = 'ServerMain Class'
[<HKLM>\Software\Classes\Server.ServerMain.1\CLSID] '' = '{D8956119-6E66-43BD-AAA5-231F94859EE6}'
[<HKLM>\Software\Classes\Server.ServerMain] '' = 'ServerMain Class'
[<HKLM>\Software\Classes\Server.ServerMain\CLSID] '' = '{D8956119-6E66-43BD-AAA5-231F94859EE6}'
[<HKLM>\Software\Classes\Server.ServerMain\CurVer] '' = 'Server.ServerMain.1'
[<HKLM>\Software\Classes\CLSID\{D8956119-6E66-43BD-AAA5-231F94859EE6}] '' = 'ServerMain Class'
[<HKLM>\Software\Classes\CLSID\{D8956119-6E66-43BD-AAA5-231F94859EE6}\ProgID] '' = 'Server.ServerMain.1'
[<HKLM>\Software\Classes\CLSID\{D8956119-6E66-43BD-AAA5-231F94859EE6}\VersionIndependentProgID] '' = 'Server.ServerMain'
[<HKLM>\Software\Classes\CLSID\{D8956119-6E66-43BD-AAA5-231F94859EE6}\InprocServer32] '' = ''
[<HKLM>\Software\Classes\CLSID\{D8956119-6E66-43BD-AAA5-231F94859EE6}\InprocServer32] 'ThreadingModel' = 'Apartment'
[<HKLM>\Software\Classes\CLSID\{D8956119-6E66-43BD-AAA5-231F94859EE6}\TypeLib] '' = '{1CAE5CEB-54C5-49E3-B195-4A76DD1A7C21}'
[<HKLM>\Software\Classes\TypeLib\{1CAE5CEB-54C5-49E3-B195-4A76DD1A7C21}\1.0] '' = 'Server 1.0 Type Library'
[<HKLM>\Software\Classes\TypeLib\{1CAE5CEB-54C5-49E3-B195-4A76DD1A7C21}\1.0\FLAGS] '' = '0'
[<HKLM>\Software\Classes\TypeLib\{1CAE5CEB-54C5-49E3-B195-4A76DD1A7C21}\1.0\0\win32] '' = ''
[<HKLM>\Software\Classes\TypeLib\{1CAE5CEB-54C5-49E3-B195-4A76DD1A7C21}\1.0\HELPDIR] '' = ''
[<HKLM>\Software\Classes\Interface\{CFDA1C1C-DB4B-431C-88A1-2C799A80A4BB}] '' = 'IServerMain'
[<HKLM>\Software\Classes\Interface\{CFDA1C1C-DB4B-431C-88A1-2C799A80A4BB}\ProxyStubClsid] '' = '{00020424-0000-0000-C000-000000000046}'
[<HKLM>\Software\Classes\Interface\{CFDA1C1C-DB4B-431C-88A1-2C799A80A4BB}\ProxyStubClsid32] '' = '{00020424-0000-0000-C000-000000000046}'
[<HKLM>\Software\Classes\Interface\{CFDA1C1C-DB4B-431C-88A1-2C799A80A4BB}\TypeLib] '' = '{1CAE5CEB-54C5-49E3-B195-4A76DD1A7C21}'
[<HKLM>\Software\Classes\Interface\{CFDA1C1C-DB4B-431C-88A1-2C799A80A4BB}\TypeLib] 'Version' = '1.0'
где <path> — путь к файлу трояна, а <homedir> — его домашний каталог.
Также через regsvr32 обеспечивается автозагрузка трояна: [<HKLM>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\ServerShellIcon] '' = '{D8956119-6E66-43BD-AAA5-231F94859EE6}'.
Таким образом, процесс explorer.exe загрузит троянскую программу при следующем своем перезапуске.
Основная функциональность
Троян приступает к выполнению основных функций либо путем вызова экспортируемой функции DllUnregisterServerA, либо при загрузке процессом explorer.exe. Отличие в том, что при загрузке процессом explorer.exe троян создает мьютекс FEca72d-abc-efef для предотвращения параллельного запуска еще одной своей копии.
Далее читает свою конфигурацию из ключа реестра [HKCU\\Software\\Microsoft\\Keyboard\\Set] 'HPConf'. Если указанного ключа не существует или сохраненная там конфигурация не совпадает с конфигурацией, зашитой в теле трояна, использует зашитую конфигурацию и записывает ее в реестр.
Конфигурация и в реестре, и в теле трояна хранится в зашифрованном виде, для шифрования используется алгоритм RC4. Ключ шифрования зашит в теле трояна:
13 36 CF 83 2E CC 79 DF 2E AB 79 64
Функция дешифровки:
Расшифрованная конфигурация имеет следующую структуру:
struct st_config
{
_DWORD compname_sum;
wchar_t compname[16];
wchar_t cnc_addr1[64];
wchar_t cnc_addr2[64];
wchar_t cnc_addr3[64];
_WORD cnc_port1;
_WORD cnc_port2;
_DWORD interval;
wchar_t sleep_time[64];
wchar_t fallback_url[128];
};
В зашитой конфигурации поля compname_sum и compname имеют нулевые значения. Как только троян расшифровывает ее, он присваивает этим полям значения, затем зашифровывает уже обновленную конфигурацию и записывает ее в реестр. compname_sum вычисляется на основе имени компьютера:
Далее троян загружает имеющиеся плагины. Для этого проверяет наличие папки %APPDATA%\\Microsoft\\Media Player и, если она существует, ищет в ней библиотеки с двумя экспортируемыми функциями — GetValue и PluginEntryPoint. Для каждой найденной библиотеки последовательно вызываются PluginEntryPoint, затем GetValue. Вторая функция возвращает дескриптор потока, завершение которого ожидает троян. После завершения потока файл библиотеки выгружается из процесса и удаляется.
В параметре конфигурации sleep_time могут содержаться две даты (год, месяц, день, час, минута), определяющие период времени, когда троян не связывается с управляющим сервером. Если текущая дата и время не попадают в этот промежуток или данный параметр не задан, то переходит к общению с управляющим сервером.
Связь с управляющим сервером
В конфигурации трояна может быть задано до двух адресов управляющих серверов. Для каждого сервера задаются домен и порт. Кроме того, в конфигурации может быть указан URL, по которому троян отправляет запрос с целью получения адреса управляющего домена — fallback_url.
Все запросы к управляющему серверу содержат идентификатор бота:
Троян может отправлять два вида запросов:
- POST-запрос с URI /result?hl=en&meta=<botid>, где botid — идентификатор бота. Данные запроса зашифровываются по тому же алгоритму, что и конфигурация;
- GET-запрос с URI /search?hl=en&q=<data>&meta=<botid>, где botid — идентификатор бота, data — данные запроса, которые зашифрованы так же, как и конфигурация, после чего закодированы в Base64 и urlencode.
POST-запрос используется только для отправки файла с зараженного компьютера на управляющий сервер при условии, что размер отправляемых данных превышает 528 байтов.
В запросах используется строка User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32).
Для проверки работоспособности управляющего сервера троян отправляет пакет st_pkt_hello:
struct st_pkt_hello
{
_DWORD rnd;
_DWORD cmdid; // 0x10001000
_BYTE gap[36]; // 0x00
};
где rnd — случайное число. Если сервер отвечает на этот запрос, то троян будет использовать этот сервер для дальнейшей работы. Если ни один из указанных в конфигурации серверов не работает, троян отправляет запрос Get (именно так, а не GET) на указанный URL. В ответ ожидает адрес управляющего сервера, зашифрованный по тому же алгоритму, что и конфигурация трояна. Полученный таким образом управляющий сервер проверяется на работоспособность аналогичным образом — при помощи пакета st_pkt_hello.
Когда троян находит управляющий сервер, он начинает периодически запрашивать команды. Пакет для запроса команды имеет вид:
struct st_pkt_req_cmd
{
_DWORD rnd;
_DWORD cmdid; // 0x10001001
_DWORD compname_sum;
char compname[16];
_BYTE gap[16]; // 0x00
};
где rnd — случайное число, compname_sum — число, полученное на основе имени компьютера, compname — имя компьютера.
Если сервер ответил строкой *NONE*, то троян не учитывает указанное в конфигурации время «молчания» и повторяет запрос. Если полученный ответ отличен от *NONE*, троян сохраняет эти данные в файл %APPDATA%\\jbl. Далее этот файл расшифровывается (по тому же алгоритму, что и конфигурация) и разбивается на команды. Команду для выполнения троян определяет на основе ее первых трех символов:
opcode = cmdbuf[2] ^ (cmdbuf[1] * cmdbuf[0]);
Список команд:
Код команды | cmd | Описание команды |
---|---|---|
0x2718 | del | Удалить файл |
0x28D7 | get | Отправить текущую конфигурацию |
0x2A43 | cmd | Запустить команду в командной оболочке и выслать результат работы |
0x2B2B | dow | Отправить на сервер указанный файл |
0x2C89 | sde | Изменить интервал обращения к управляющему серверу |
0x2C97 | rem | Самоудалиться |
0x2D7E | wai | Бездействовать в указанный промежуток времени |
0x2EB5 | loa | Запустить плагин трояна |
0x2F3D | exe | Запустить файл |
0x30E1 | sle | Установить период бездействия трояна |
0x322A | unl | Выгрузить плагин и удалить его с диска |
0x3353 | upc | Обновить конфигурацию |
0x3354 | upd | Запросить и установить обновления вредоносного модуля |
0x335C | upl | Получить от сервера файл и сохранить его по указанному пути |