При запуске вредоносной программы срабатывает компонент, расшифровывающий тело троянца. Затем он загружает секции в память, настраивает импорты и передает управление на точку входа.
Затем срабатывает другой модуль, загружающий образ в память инфицированного компьютера.
Загрузчик
Загрузчик троянца устанавливается копированием себя в папку %USER%\<rnd>.exe, прописывает себя в автозапуск:
software\microsoft\windows\currentversion\run <rnd>=%USER%\<rnd>.exe
Шифрует трафик с использованием RSA-ключей.
Выполняет запрос к серверу, который шифрует публичным ключом:
ответный запрос расшифровывает приватным ключом:
Загрузчик содержит в своем теле список доменных имен, часть имен зашифрована. Обращается к доменам по списку с GET-запросом по протоколу HTTPS, в ответ получает главную веб-страницу располагающегося по данному адресу сайта и разбирает ее HTML-структуру в поисках тега вставки изображения <img src="data:image/jpeg;base64 … >.
Расшифровывает из аргументов данного тега вредоносный файл (по команде либо запускает процесс svchost.exe) и пытается встроить файл в данный процесс, либо сохраняет его во временную папку.
Далее расшифровывает из своего тела модуль BackDoor.Bulknet.739 (DDoS) , и список адресов к нему, загружает его в память.
Обращается к одному из серверов в списке с HTTP-запросом, загружает веб-страницу и разбирает ее HTML-структуру в поисках тега вставки изображения <img src="data:image/jpeg;base64 … >. Расшифровывает из аргументов данного тега файл, маскирующийся под изображение в формате JPEG. Этот файл содержит контейнер данных, сжатых gzip. Из gzip расшифровывается второй модуль BackDoor.Bulknet.739, предназначенный для рассылки спама.
Протокол загрузчика
Загрузчик отправляет данные в виде контента, алгоритм шифрования выглядит следующим образом:
int crypt_send_data(DWORD *data, signed int size, int key1)
{
int count; // ecx@1
int key; // edi@4
int n; // eax@4
int size_add; // ebx@7
DWORD *v7; // esi@8
int v9; // [sp+4h] [bp-8h]@1
int v10; // [sp+8h] [bp-4h]@8
count = 0;
v9 = 0;
if ( data && size && key1 )
{
key = 0x19660D * key1 + 0x3C6EF35F;
n = size / 4;
if ( size / 4 > 0 )
{
v9 = 4 * n;
do
{
data[count] ^= key;
key = 0x19660D * key + 0x3C6EF35F;
++count;
}
while ( count < n );
}
size_add = size % 4;
if ( size % 4 )
{
v10 = 0;
v7 = &data[count];
memcpy(&v10, &data[count], size_add);
v10 ^= key;
memcpy(v7, &v10, size_add);
v9 += size_add;
}
}
return v9;
}
Пакет имеет такую структуру:
struct HEAD{
uint32 rnd1;
uint32 rnd2;
uint32 crc32;
};
struct BOT_INFO{
uint32 field2;// 1
uint32 field3;// 2
uint32 field4;// 1
uint32 field5;// 0
uint32 field6;// 0
uint32 field7;// 15
uint32 rnd3[4];
uint32 bid[4];
uint32 instal_flag;
uint32 len_host_crc32;
uint32 host_crc32;
};
HEADER 0xC
97 73 BC F2 DB 00 76 E0 72 88 73 07
BOT_INFO 0x44
01 00 00 00 02 00 00 00 01 00 00 00 00 00 00 00
00 00 00 00 15 00 00 00 FA 13 29 40 56 6C 82 99
AF C5 DB F2 09 1F 35 4C 68 55 ED 52 F5 60 43 1E
1E 95 41 3A 33 21 C3 3B 0C 00 00 00 04 00 00 00
4B ED 16 27 00 00 00 00 00 00 00 00 00 00 00 00
DDoS
Для осуществления DDoS-атаки троянец создает 8 тредов, случайным образом выбирает адрес и направляет на него POST-запрос вида:
http://%s/?ptrxcz_%s
или
http://%s/
со случайным содержимым произвольной длины. Также, соединившись с сервером SMTP, троянец может отправлять сообщения электронной почты с произвольным содержимым.
Бот сохраняет себя в папку %SYSTEM32% или %USERDIR% с именем regedit.exe и изменяет ветвь системного реестра Software\Microsoft\Windows\CurrentVersion\Run для обеспечения автозагрузки. Увеличивает количество возможных tcp-соединений путем модификации ветви реестра SYSTEM\CurrentControlSet\Services\Tcpip\Parameters.
Спам-машина
Для рассылки почтовых сообщений троянцем применяется специальная спам-машина, использующая набор шаблонов, например шаблон сообщений:
Список адресов электронной почты:
Шаблон, содержащий список имен:
В случае отказа бот может направить на собственный управляющий сервер сообщение об ошибке с использованием протокола UDP.
Протокол спам-машины
Все сообщения бота представляют собой следующий блок данных:
struct MSG{
DWORD size;
BYTE data[size]; //данные зашифрованы
};
Данные шифруются с использованием следующего алгоритма:
void ciper(char *key, char* data, int size){
uint32 max=sizeof(KEY_ENC)-1;
int j=0;
if ( key && data ){
if ( size > max){
do{
for (int i=0;i<max;i++){
data[i+j]^= key[i];
}
for (int i=0;i<max/2;i++){
char tmp = data[i+j];
data[i+j] = data[j-i+(max-1)];
data[j-i+(max-1)]= tmp;
}
if ( j & 1 ){
for (int i=0;i<max;i++){
data[i+j]=~data[i+j];
}
}
j+=max;
}while (j+max< size );
}
size=size%max;
for (int i=0;i<size;i++){
data[i+j]=~data[i+j];
}
}
}
И ключами для шифрования и дешифровки:
0xe0:eto ochen prostoarelkioiqyrut
0xe1:turyqioikleraotsorp nehco ote
Исходящие сообщения имеют следующую структуру:
struct HEAD_REQ{
DWORD bid;
DWORD lip;
DWORD bver;
DWORD num_cfg;
DWORD subop;
DWORD os;
WORD dns;
WORD smtp;
};
DWORD size;
//данные с этого поля шифруются
HEAD_REQ head;
BYTE data[size];
Входящие пакеты:
struct HEAD_RES{
DWORD cmd;
};
union U_OP{
OP_0 op0;
OP_1 op1;
OP_4 op4;
OP_5 op5;
OP_6 op6;
OP_7 op7;
OP_8 op8;
};
struct OP_0{
};
struct OP_1{
DWORD build;
DWORD size;
};
struct OP_4{
};
struct OP_5{
DWORD bid;
DWORD remote_addr;
DWORD seed_time;
DWORD d4;
};
struct OP_6{
DWORD num_tmpl;
DWORD d2;
DWORD d3;
DWORD num_x;
DWORD d5;
};
struct OP_7{
DWORD flag_op;
DWORD num_cfg;
};
struct OP_8{
DWORD sub_opcode;
BYTE b1;
};
enum OP_RES{
OP_0 = 0, //остановить спам, очистить шаблоны
OP_1 = 1, //список шаблонов имен
OP_4 = 4, //обновить бота
OP_5 = 5, //инициализация bid, определение имени хоста бота
OP_6 = 6, //спам шаблоны
OP_7 = 7, //основной конфиг бота
OP_8 = 8, //список email
};
DWORD size;
//данные с этого поля шифруются
HEAD_RES head;
U_OP op;
BYTE data[size+sizeof(op)+sizeof(HEAD_RES)];
Троянец отправляет пакеты в следующей последовательности:
- Исходящий. bid еще не инициализирован (если бот запускается впервые). Содержит локальный IP lip, версию ОС, dns-флаги, версию бота bver, количество проверенных smtp-серверов. И num_cfg=0
0x1C
00 00 00 00 C0 A8 EE 83 AC 01 00 00 00 00 00 00
00 00 00 00 05 01 28 0A 20 00 04 00 - Входящий. OP_7, содержит основной конфигурационный файл для спам-машины.
0x1F1
07 00 00 00 01 00 00 00 08 00 00 00 75 64 70 73
6F 63 6B 63 6F 75 6E 74 00 32 30 00 69 66 68 6F
73 74 75 73 65 69 6E 6D 61 69 6C 66 72 6F 6D 00
31 00 6D 61 78 74 72 79 63 6F 6E 6E 00 33 23 23
23 23 00 62 63 63 00 30 00 65 78 65 5F 75 72 6C
00 00 61 64 64 72 00 37 38 2E 34 36 2E 34 36 2E
31 32 34 00 70 6F 72 74 00 32 35 00 6D 61 78 63
6F 6E 6E 00 31 30 30 00 68 65 6C 6F 73 65 6C 65
63 74 69 66 68 6F 73 74 00 33 00 74 72 79 61 67
61 69 6E 74 72 79 00 33 00 6D 61 78 74 72 79 65
72 72 00 32 00 64 69 65 69 66 6E 6F 73 70 61 6D
00 31 30 00 6D 61 78 74 72 79 62 61 64 66 72 6F
6D 00 32 00 63 6F 6E 73 74 63 6F 6E 6E 65 63 74
00 31 00 63 6F 6D 5F 62 6F 74 5F 63 6F 6E 74 72
5F 64 69 76 00 00 63 68 65 63 6B 73 6D 74 70 64
65 6C 61 79 00 32 35 30 00 74 75 72 62 6F 6D 69
6E 00 35 00 74 72 79 61 67 61 69 6E 70 61 75 73
65 00 33 36 30 00 74 72 79 70 69 70 65 6C 69 6E
69 6E 67 00 31 00 62 6F 74 5F 64 69 76 00 00 68
65 6C 6F 73 65 6C 65 63 74 69 66 6E 6F 68 6F 73
74 00 31 00 6B 6E 6F 63 6B 64 65 6C 61 79 00 36
30 00 6D 61 78 74 72 79 62 6C 61 63 6B 00 32 00
73 77 6F 74 74 69 6E 67 00 00 6D 61 78 75 64 70
74 72 79 00 35 00 63 6F 6D 5F 62 6F 74 5F 64 69
76 00 00 74 75 72 62 6F 6D 61 78 00 32 30 00 63
63 00 30 00 75 64 70 72 65 63 76 74 69 6D 65 6F
75 74 00 32 30 00 6D 78 63 6F 6E 6E 74 69 6D 65
6F 75 74 00 38 30 00 62 6F 74 5F 63 6F 6E 74 72
5F 64 69 76 00 00 73 61 76 65 75 6E 6B 61 6E 73
77 00 00 6D 78 72 65 63 76 74 69 6D 65 6F 75 74
00 38 30 00 6D 61 78 64 6F 6D 63 6F 6E 6E 00 32
00 - Исходящий. num_cfg=head.num_cfg
0x1C
00 00 00 00 C0 A8 EE 83 AC 01 00 00 08 00 00 00
00 00 00 00 05 01 28 0A 20 00 04 00 - Входящий. OP_5, содержит bid, присвоенный боту, внешний IP бота, время.
0x14
Бот пытается определить имя хоста для своего внешнего IP и выставляет dns-флаг.
05 00 00 00 97 68 1F 00 5F D3 A8 0A C8 E1 53 51
00 00 00 00 - Исходящий. num_cfg=head.num_cfg, dns|1 и присвоенный bid теперь будут присутствовать во всех пакетах.
0x1C
97 68 1F 00 C0 A8 EE 83 AC 01 00 00 08 00 00 00
00 00 00 00 05 01 28 0A 21 00 04 00 - Входящий OP_8. Список e-mail
0x35
08 00 00 00 0B 00 00 00 00 50 41 59 56 45 53 55
50 50 4F 52 54 40 41 45 58 50 2E 43 4F 4D 00 77
70 70 69 6D 30 30 31 2E 41 45 58 50 2E 43 4F 4D
00 0C 0A DB 1A - Исходящий. HEAD_REQ.subop=OP_8.sub_opcode, num_cfg=head.num_cfg
0x1C
97 68 1F 00 C0 A8 EE 83 AC 01 00 00 08 00 00 00
0B 00 00 00 05 01 28 0A 21 00 04 00 - Входящий. OP_6 спам-шаблон.
- Исходящий. Аналогичный предыдущему, но только добавляются дополнительные данные.
struct OP_1_EXT{
DWORD field4;
DWORD field5;
DWORD field6;
DWORD field7;
DWORD field8;
};0x1C
97 68 1F 00 C0 A8 EE 83 AC 01 00 00 08 00 00 00
0B 00 00 00 05 01 28 0A 21 00 04 00
OP_1_EXT.field4=OP_6.num_tmpl;
OP_1_EXT.field5=OP_6.d2;
OP_1_EXT.field6=HEAD_REG.num_cfg;
- Входящий. OP_1 список имен.
Причем OP_1.num_tmpl==OP_6.num_tmpl номер шаблона.