Упаковщик: отсутствует
Даты компиляции:
- 11.01.2018 12:14:28 (версия для архитектуры x86)
- 11.01.2018 12:16:21 (версия для архитектуры x64)
SHA1-хеши:
- fc4844a6f9b5c76abc1ec50b93597c5cfde46075 (x86)
- 2bf5cfe30265a99c13f5adad7dd17ccb9db272e0 (x64)
Описание
Многофункциональный троян-бэкдор для 32- и 64-битных операционных систем семейства Microsoft Windows. Является одним из компонентов семейства троянов Trojan.XPath. Используется для несанкционированного доступа к зараженным компьютерам и по команде выполняет на них различные вредоносные действия.
Trojan.XPath.4 написан на C++ и создан с использованием нескольких проектов с открытым исходным кодом. Один из них — библиотека Cyclone TCP, предназначенная для низкоуровневой работы с сетью. Вирусописатели модифицировали ее таким образом, что она задействует драйвер WinDivert вместо WinPcap. Второй проект — модифицированная библиотека libdsm, которая реализует работу через протокол SMB.
Принцип действия
Троян считывает и расшифровывает конфигурационный файл из параметра Video или Scsi в ключе реестра [HKLM\\SOFTWARE\\Microsoft\\LoginInfo]. Далее он проверяет, совпадают ли первые 4 байта со значением 1E 5A CF 24 и равен ли 16-й байт 0xCE.
Затем Trojan.XPath.4 формирует уникальный идентификатор HWID (Hardware ID) зараженного компьютера на основе его аппаратной конфигурации.
Далее он проверяет доступность сетевого драйвера, для чего открывает устройство \\.\BainduHips. При этом в зависимости от версии операционной системы любые обращения к драйверу происходят различными способами. Первый задействуется в ОС Windows, начиная с Windows 2000 и заканчивая Windows Server 2003 R2, где используется драйвер на основе WinPcap. В более поздних редакциях Windows, в которых используется драйвер на основе WinDivert, применяется второй способ.
Чтобы определить, через какие сетевые интерфейсы должен работать троян, он ищет подключенные к сети интерфейсы с типами MIB_IF_TYPE_ETHERNET и IF_TYPE_IEEE80211. Если Trojan.XPath.4 запущен в системе младше Windows Vista, он отправляет своему драйверу IOCTL-код 0x80000800. Получив такой IOCTL-код, драйвер устанавливает собственные хуки на обработчики, которые отвечают за некоторые функции протокола TCP/IP.
Фактически троян способен функционировать в двух режимах. Первый — работа в режиме клиента (Client Mode), когда он соединяется с управляющим сервером и ждет от него команд. Второй — работа в режиме агента (Agent Mode), когда он прослушивает определенные порты, ожидая подключения к ним других клиентов и принимая от них команды. В этом режиме Trojan.XPath.4 выполняет функции сервера.
Работа в режиме Agent (Server) Mode
При работе с сетевым драйвером Trojan.XPath.4 фактически не прослушивает порт и не принимает на нем соединений. Вместо этого драйвер прослушивает трафик на сетевом интерфейсе и передает трояну отфильтрованные пакеты, поэтому порт, прослушиваемый трояном, нигде не фигурирует как открытый.
Trojan.XPath.4 проверяет текущий день недели и время, установленные в системе, и сравнивает их значение с данными из конфигурационного файла. В нем для каждого часа каждого дня недели выставлен флаг, который сигнализирует, должен ли троян работать в это время. Если для текущего времени флаг не выставлен, вредоносная программа не будет осуществлять прием пакетов.
Trojan.XPath.4 ожидает поступления пакета размером 32 байта. Далее он берет первые 4 байта в качестве XOR-ключа для расшифровки остальных 28 байт. Алгоритм расшифровки представлен на следующем изображении:
После расшифровки он сверяет байты с 4 по 12, и, если они совпадают со строкой 1I2#aLeb, больше не выполняет никаких действий. Если же указанной строки нет, он пытается расшифровать пакет не XOR-ключом, а одним из AES-ключей. Затем троян сверяет первые 4 расшифрованных байта со строкой 7r#K. Если совпадение не было найдено, то будет считать, что произошла ошибка, и дальнейшая обработка пакета прекращается. Если же искомая строка обнаруживается, то пакет после расшифровки будет иметь следующую структуру:
#pragma pack(push,1)
struct st_packet_header
{
_BYTE com_flag[4];
_DWORD packed_size;
_DWORD decomp_size;
_DWORD cmdid;
_BYTE pad[16];
};
#pragma pack(pop)
Если поле packed_size имеет значение 32, а поле decomp_size имеет значение 0, троян проверяет, создан ли туннель до другого бота. Если туннель создан, Trojan.XPath.4 перенаправляет команду в него, чтобы ее выполнил подключенный бот. Если же туннеля нет, троян выполняет команду самостоятельно.
Если значения указанных выше полей отличны от ожидаемых, троян округляет размер поля packed_size в большую сторону до значения, кратного 16, которое составляет размер полезной нагрузки пакета. Затем он принимает оставшуюся часть данных, расшифровывает их одним из двух AES-ключей и распаковывает алгоритмом LZMA. Далее он проверяет, совпадает ли размер распакованных данных с размером, указанным в поле decomp_size пакета st_packet_header. Если размеры совпадают, Trojan.XPath.4 отправляет полученную команду в туннель или выполняет ее сам, если туннель не создан.
Работа в режиме Client Mode
Троян будет работать в этом режиме, если в конфигурационном файле указан адрес управляющего сервера, а также режим работы 3, который соответствует режиму клиента (Client). В исследованном образце указан режим работы 4, который соответствует режиму агента (Agent).
Троян генерирует случайный номер порта в пределах 10000 ≤номер_порта≤ 65530 и привязывается к нему.
Далее он формирует пакет вида:
#pragma pack(push,1)
struct st_hello
{
_DWORD key;
_BYTE magic[8]; // "1I2#aLeb
_DWORD packet_id; // 0x00
_DWORD dword14; // 0x00
_WORD port;
_BYTE byte16[10];
};
#pragma pack(pop)
В поле port он указывает номер сгенерированного ранее порта. Далее он берет значение GetTickCount() в качестве XOR-ключа для шифрования пакета, после чего шифрует и сохраняет это значение в его первых 4 байтах. Троян создает сокет, подключается к управляющему серверу, указанному в конфигурационном файле, отправляет пакет и разрывает соединение. При получении этого пакета драйвер трояна внесет IP:port, с которого он был отправлен, в исключения сетевого экрана.
Далее Trojan.XPath.4 снова подключается к этому серверу, но в качестве сокета использует тот, к которому ранее троян привязывался через случайный порт. Затем Trojan.XPath.4 посылает серверу пакет TOKEN_CLIENT_LOGIN и ожидает дальнейших команд (дополнительная информация о командах указана в соответствующей таблице в разделе «Список команд»). Прием и отправка пакетов осуществляется также, как и в случае работы в режиме сервера (Agent (Server) Mode).
Отправка пакета
Если в пакете есть какие-либо данные, они упаковываются алгоритмом LZMA. При этом получается следующая структура данных:
- Заголовок в виде структуры st_packet_header (эта структура описана в разделе работы в режиме Agent (Server) Mode):
#pragma pack(push,1) struct st_packet_header { _BYTE com_flag[4]; _DWORD packed_size; _DWORD decomp_size; _DWORD cmdid; _BYTE pad[16]; }; #pragma pack(pop)
- Сжатые данные
Полученные данные вместе с заголовком шифруются первым AES-ключом, после чего отправляются адресату. Единственным пакетом, который не сжимается и не шифруется AES, является пакет st_hello.
Список команд
Идентификатор команды | Имя команды | Действие |
---|---|---|
0x138A | AGENT_SERVER_ALIVE | Подтверждение работы Agent-сервера |
0x138D | Выделить дополнительный сокет или выполнить команду, указанную в данных пакета | |
0x138E | AGENT_CLIENT_NEW_CONNECT_ACCEPT | Установить дополнительное соединение с Agent-сервером и выполнить команду |
0x4E21 | COMMAND_SERVER_ALIVE | Подтверждение работы управляющего сервера |
0x4E22 | COMMAND_SERVER_CONNECT | Отправить команду на подключение к управляющему серверу |
0x4E24 | COMMAND_SERVER_NOTIFY_CLIENT | Установить дополнительное соединение с управляющим сервером и выполнить команду |
0x4E25 | Разорвать соединение | |
0x4E26 | Обновить драйвер и модули трояна | |
0x4E27 | Команда на самоудаление трояна | |
0x4E28 | COMMAND_SERVER_READY | Проверка готовности сервера |
0x4E2A | Завершить процесс трояна | |
0x4E34 | Принудительно выключить компьютер | |
0x4E35 | Принудительно выйти из учетной записи пользователя компьютера | |
0x4E36 | Принудительно перезагрузить компьютер | |
0x4E37 | Выключить компьютер | |
0x4E38 | Принудительно выйти из учетной записи пользователя компьютера | |
0x4E39 | Перезагрузить компьютер | |
0x5014 | COMMAND_SHELL_START | Запустить оболочку Shell |
0x5015 | COMMAND_CMDDLG_OPENED | Запустить чтение данных из Shell |
0x5016 | Отправить данные в Shell | |
0x5017 | COMMAND_SHELL_EXIT | Закрыть Shell |
0x5078 | COMMAND_TUNNEL_START | Запустить плагин для создания туннеля |
0x5079 | Отправить данные на сервер, к которому подключен туннель | |
0x507A | Установить адрес сервера, до которого будет создан туннель | |
0x507B | COMMAND_TUNNEL_NEW_CONNECTION | Создать туннель до заданного сервера |
0x507C | Получить NetBios-имя для заданного IP-адреса | |
0x5082 | COMMAND_TUNNEL_EXIT | Отключить туннель |
0x5E30 | COMMAND_FILE_START | Запустить файловый менеджер |
0x5E31 | Листинг каталога | |
0x5E32 | Прочитать файл с указанной позиции | |
0x5E33 | Создать файл | |
0x5E34 | Записать в файл с указанной позиции | |
0x5E36 | Прочитать файл с указанной позиции | |
0x5E37 | Передать пустой пакет с кодом 0x98BC на сервер | |
0x5E38 | Удалить заданный файл | |
0x5E39 | Рекурсивно удалить заданный каталог или файлы | |
0x5E40 | Получить размер файла | |
0x5E41 | Создать папку | |
0x5E42 | Переместить файл | |
0x5E43 | Запустить файл с окном | |
0x5E44 | Запустить файл без окна | |
0x5E45 | Игнорируется | |
0x5E46 | Игнорируется | |
0x5E47 | Получить данные о файле (время создания, модификации, доступа, размер файла, тип файла, имя приложения, через которое этот файл может быть открыт) | |
0x5E49 | Присвоить файлу заданные атрибуты | |
0x5E51 | Отключить файловый менеджер | |
0x5E52 | Рекурсивный листинг заданного каталога | |
0x891C | TOKEN_CLIENT_LOGIN | Авторизовать клиент на сервере |
0xEA66 | PUBLIC_ACTIVE | Установить флаг public_active |
Артефакты
Файл трояна содержит следы отладочной информации, которая раскрывает пути и имена исходных кодов:
..\\common\\LzmaLib.c
z:\\desk_codes\\project_xpath\\xpath\\ringqueue.h
z:\\desk_codes\\project_xpath\\xpath\\untils.h
z:\\desk_codes\\project_xpath\\xpath\\ShellManager.h
z:\\desk_codes\\project_xpath\\xpath\\file.h
z:\\desk_codes\\project_xpath\\xpath\\tunnel.h
z:\\desk_codes\\project_xpath\\xpath\\network.h
z:\\desk_codes\\project_xpath\\xpath\\clientmode.h
xPathMain.c
cyclone_tcp\\core\\bsd_socket.c
Оригинальные имена функций:
SendClientMagic
FindPluginData
DeCompressData
GetSockInfo nocase
StartShell
UnInitShell
UnInitFileManager
recv_pack2
x_gethostbyname
OutputData
tcpF
WorkThread
alloc_new_si
x_decompress
Оригинальные названия команд:
COMMAND_FILE_START
PUBLIC_ACTIVE
COMMAND_TUNNEL_EXIT
COMMAND_TUNNEL_NEW_CONNECTION
COMMAND_SERVER_READY
AGENT_SERVER_ALIVE
COMMAND_SERVER_CONNECT
TOKEN_CLIENT_CONNECT
AGENT_SERVER_ALIVE
COMMAND_SERVER_ALIVE
COMMAND_SERVER_NOTIFY_CLIENT
AGENT_CLIENT_NEW_CONNECT_ACCEPT
COMMAND_SHELL_START
COMMAND_TUNNEL_START
COMMAND_CMDDLG_OPENED
COMMAND_SHELL_EXIT
COMMAND_TUNNEL_EXIT
TOKEN_CLIENT_LOGIN
Различные отладочные сообщения:
get conf,agent:%d,client:%d,interval:%d,listen1:%d,addr1:%s:%d \n
os init:%d-%d-%d bGetConfig:%d %d\tver:%10d\n
ver:%d remote:%d listen:%d\n
x_decompress bad in tcpR,socket:%d token:%d len:%d,target len:%d,%d\n
dir: %ws,%ws,%ws,%d,%d,%d
file: %ws,%ws,%ws,%d,%d,%d
tunnel connect error :%x--%d,%d,%d\n
init get ip:%s,%s,%s,%02x-%02x-%02x-%02x-%02x-%02x,%s\n
ready accept port of client to agent:%d,local: %x--%d\n
stack set ip:%s mask:%s gw:%s
baidu_tx_web%d
stack add ip:%s mask:%s gw:%s
agent must with driver\n
current if:%d\n
the connect thread is ending.....\n
the sub connect thread is ending.....\n
listen thread1 out\n
client unknown token %d\n
errorrrrrrrrrrrrrrrrrr:%d,%d,%d\n
tcp reverse decrypt error\n
tcp reverse com flag error\n
%04d %02d %02d-%02d:%02d:%02d :
update alloc memory false\n
update depack false,%d,%d,%d\n
create update driver error\n
alloc driver memory error,%d\n
depack driver error\n
write driver error\n
client type wrong:%d,%d,%d