Пакер: Winlicense
Дата компиляции и SHA1-хэши:
- 2420d5ad17b21bedd55309b6d7ff9e30be1a2de1 (ssdp32.dll, x86) - 20.02.2018 13:03:18
Описание
Является одним из компонентов троянца Belonard. Оригинальное имя ssdp32.dll, имеет экспорт "x". Скачивается троянцем Trojan.Belonard.6 и устанавливается в систему с именем ssdp32.dll. Представляет собой полезную нагрузку троянца Belonard.
Принцип действия
Расшифровывает адрес управляющего сервера - ixtzhunk.valve-ms[.]ru:37811. В отличие от других модулей, Trojan.Belonard.9 связывается с сервером по UDP.
Формирует структуру:
struct client_info
{
_BYTE aeskey[32];
_WORD port;
}
Данные шифруются находящимся в троянце RSA-ключом, после чего в начало зашифрованных данных дописывается нулевой байт, и полученный буфер отправляется на управляющий сервер. В ответ сервер отправляет файл размером не менее 97 байт. Полученные данные расшифровываются с помощью AES в режиме CFB с длинной блока 128 бит, ключ создается с помощью client_info->aeskey, вызовом EVP_BytesToKey(cipher, md_sha256, 0, &st_packet->aeskey2, 32, 5, key, iv). При этом первые 32 байта должны совпадать с SHA256-хэшем от остальных расшифрованных данных.
Полученные данные содержат различные параметры, которые в дальнейшем используются для создания игровых прокси-серверов:
struct fake_srv_params
{
_DWORD steamappid;
_DWORD stamapi_param;
unsigned __int16 num_of_fake_servers;
unsigned __int16 game_srv_low_port;
_DWORD sleep_delay;
unsigned __int16 fakesrvbatch;
_DWORD SrvQueryAnsDelay;
_DWORD rnd_data_update_interval;
_DWORD min_param_value;
_DWORD max_param_value;
unsigned __int8 min_players_on_server;
unsigned __int8 max_players_on_server;
unsigned __int8 min_players_on_server_for_naming;
unsigned __int8 max_players_on_server_for_naming;
_DWORD min_player_kills;
_DWORD max_player_kills;
_DWORD min_player_uptime;
_DWORD max_player_uptime;
_DWORD uptimemul;
_DWORD check_period;
char szGameName[];
char szProtocolVersion[];
char szServerName[];
};
Троянец создает некоторое количество игровых прокси-серверов, равное значению параметра num_of_fake_servers, после чего регистрирует их через Steam API. Порты игровых серверов берутся последовательно от нижнего значения game_srv_low_port, указанного сервером. Также сервер задает fakesrvbatch, от значения которого зависит количество потоков эмулятора протокола.
Эмулятор поддерживает следующие базовые запросы к серверу игр на движке Goldsource: A2S_INFO, A2S_PLAYER, A2A_PING, получение challenge steam/non-steam клиента, а также команду клиента Counter-Strike "connect". После формирования валидного ответа на команду "connect" троянец отслеживает только первый и второй пакеты от клиента.
После получения валидного ответа от сервера на команду «connect» клиент посылает команду «new» (пакет \x03new\x00\x01\x01\x01), на которую троянец отвечает пакетом:
В ответ на это клиент посылает пакет svc_nop - \x01\x01\x01\x01\x01\x01\x01\x01. На что троянец отвечает:
Последний переданный троянцем пакет - это svc_director с типом сообщения DRC_CMD_STUFFTEXT, который позволяет выполнить произвольные команды клиента Counter-Strike.
Данная уязвимость известна компании Valve с 2014 года. Описание доступно на GitHub.
Таким образом, при попытке подключиться к игровому прокси-серверу игрок перенаправляется на сервер разработчика троянца - bmeadaut[.]valve-ms[.]ru:28372, где производится попытка эксплуатации нескольких уязвимостей в клиенте для установки компонентов Trojan.Belonard.
В эмуляторе существует баг в реализации ответов на запрос challenge от клиента. В ответе отсутствует случайная составляющая, что делает возможным обнаружение прокси-серверов.
- На запрос A2S_PLAYER без challenge (\xff\xff\xff\xffU\xff\xff\xff\xff") сервер отвечает \xff\xff\xff\xffAxH0a.
- На запрос challenge valve (\xff\xff\xff\xffgetchallenge valve\0a) сервер отвечает \xff\xff\xff\xffA00000000 629446400 2\0a.
- На запрос challenge steam (\xff\xff\xff\xffgetchallenge steam\0a) сервер отвечает \xff\xff\xff\xffA00000000 629446400 3 1 0\0a.
Кроме того, часть вредоносных серверов можно распознать по названию в клиенте Counter-Strike. У некоторых игровых прокси-серверов в графе "Game" будет строка вида "Counter-Strike n", где n равно числу от 1 до 3.
Часть строк троянца зашифрована. Такой же алгоритм используется в других модулях троянца. Скрипт для расшифровки:
def decrypt(d):
s = ''
c = ord(d[0])
for i in range(len(d)-1):
c = (ord(d[i+1]) + 0xdc*c - 0x31*ord(d[i]) - 0x26) & 0xff
s += chr(c)
return s

