Lors du lancement du programme malveillant, un composant exécute le décryptage du corps du Trojan. Ensuite, il charge les sections dans la mémoire, configure les importations et transmet la gestion au point d'entrée.
Puis un autre module charge l'image dans la mémoire de l'ordinateur infecté.
Downloader
Le downloader du Trojan s'installe en se copiant dans le dossier %USER%\<rnd>.exe, et s'enregistre à l'autodémarrage :
software\microsoft\windows\currentversion\run <rnd>=%USER%\<rnd>.exe
Il crypte le trafic en utilisant les clés RSA.
Il fait une demande au serveur en la cryptant avec la clé publique :
la réponse est décryptée avec la clé privée :
Le chargeur inclut dans son corps une liste de noms de domaine, dont une partie est cryptée. Il s'adresse aux domaines de la liste avec une demande GET via le protocole HTTPS, en réponse il reçoit la page d'accueil se trouvant à l'adresse du site, analyse sa structure HTML en recherchant la balise d'insertion de l'image <img src="data:image/jpeg;base64 … >.
Il décrypte à partir des arguments de cette balise un fichier malveillant (par la commande ou lance le processus svchost.exe) et essaye d'incorporer le fichier dans ce processus ou de l'enregistrer dans un dossier temporaire.
Ensuite, il récupère de son corps le module BackDoor.Bulknet.739 (DDoS) et la liste d'adresses, et le charge dans la mémoire.
Il s'adresse à l'un des serveurs de la liste avec une demande http, télécharge la page Web et analyse sa structure HTML en recherchant la balise d'insertion de l'image <img src="data:image/jpeg;base64 … >. Il décrypte à partir des arguments de cette balise le fichier, masqué sous un fichier au format JPEG. Ce fichier comprend le conteneur de données, compressé gzip. De ce conteneur, le deuxième module de BackDoor.Bulknet.739, conçu pour envoyer du spam est décrypté.
Protocole du downloader
Le downloader envoie les données sous la forme d'un contenu, dont l'algorithme de cryptage est le suivant :
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;
}
Le paquet a la structure suivante :
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
Pour lancer des attaques DDoS, le Trojan crée 8 threads, choisit par hasard une adresse et envoie une demande POST suivante :
http://%s/?ptrxcz_%s
или
http://%s/
contenu aléatoire et longueur libre. En outre, après avoir connecté le serveur SMTP, le Trojan peut envoyer des emails avec n'importe quel contenu.
Le bot s'enregistre dans le dossier% System32% ou%% USERDIR sous le nom regedit.exe et modifie la branche du registre Microsoft\Windows\CurrentVersion\Run pour assurer l'auto démarrage. Il multiplie le nombre des connexions tcp possibles en modifiant la branche du registre SYSTEM\CurrentControlSet\Services\Tcpip\Parameters.
Machine spam
Pour envoyer des emails, le Trojan utilise une machine spam spéciale utilisant un jeu de templates, par exemple le template de messages :
La liste des adresses email :
Le template contenant une liste de noms :
En cas de faille, le bot peut envoyer un message d'erreur via UDP au serveur de gestion.
Le protocole de la machine spam
Tous les messages du bot représentent l’unité de données suivante :
struct MSG{
DWORD size;
BYTE data[size]; //les données sont cryptées
};
L'algorithme de cryptage est le suivant :
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];
}
}
}
Les clés de cryptage et de décryptage :
0xe0:eto ochen prostoarelkioiqyrut
0xe1:turyqioikleraotsorp nehco ote
Les messages sortants ont la structure suivante :
struct HEAD_REQ{
DWORD bid;
DWORD lip;
DWORD bver;
DWORD num_cfg;
DWORD subop;
DWORD os;
WORD dns;
WORD smtp;
};
DWORD size;
//les données de ce champ sont cryptées
HEAD_REQ head;
BYTE data[size];
Les paquets entrants :
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, //stopper le spam, effacerles templates
OP_1 = 1, //la liste des templates des noms
OP_4 = 4, //stopper le bot
OP_5 = 5, //l'initialisation du bid, l'identification du nom de hôte du bot
OP_6 = 6, //les templates du spam
OP_7 = 7, //la configuration principale du bot
OP_8 = 8, //la liste email
};
DWORD size;
//les données de ce champ sont cryptées
HEAD_RES head;
U_OP op;
BYTE data[size+sizeof(op)+sizeof(HEAD_RES)];
L'ordre d'envoi des paquets par le Trojan est le suivant :
- Sortant. le bid n'est pas initialisé (si le bot est lancé pour la première fois). Comprend l’IP lip local, la version de l’OS, les indicateurs dns, la version du bot bver, le nombre des serveurs smtp vérifiés. И 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 - Entrant. OP_7, inclut le fichier de configuration principal pour la machine spam.
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 - Sortant. 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 - Entrant. OP_5, comprend un bid, attribué au bot, son IP externe, le temps.
0x14
Le bot détermine le nom de l’hôte pour son IP externe et met l’indicateurdns. .
05 00 00 00 97 68 1F 00 5F D3 A8 0A C8 E1 53 51
00 00 00 00 - Sortant. num_cfg = head.num_cfg, dns | 1 et le bid attribué figurera dans tous les paquets.
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 - Entrant OP_8. La liste 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 - Sortant. 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 - Entrant. OP_6 template de spam.
- Sortant. Comme le précédent, mais des données additionnelles sont ajoutées.
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;
- Entrant. OP_1 la liste de noms.
OP_1.num_tmpl==OP_6.num_tmpl est le numéro de template.