Злобные программисты не спят ночами и не отдыхают днями, пытаясь засадить очередного спам-бота в компьютер честного пользователя. Они зарабатывают деньги на нашем трафике, засвечивая нас в блеклистах и выставляя в дурном свете перед начальством. В этой статье мы взглянем на спам-боты с позиции защитника добра и справедливости, проведем вскрытие и научимся их убивать.

Капля истории

Исторически методики рассылки спама пережили три базовых этапа:

  1. Рассылка вручную. Этот метод до сих пор применятся, но эффективность его невелика, и с таким спамом очень просто бороться путем внесения почтового и ip-адреса отправителя спама в черный список.
  2. Программы автоматической рассылки спама. Могут быть выполнены в виде утилиты под Windows или скрипта для размещения на web-сайте. В сущности, это автоматизированная разновидность метода 1, и иногда она работает по принципу лохотрона — пользователю обещаются золотые горы, если он примет участие в рассылке спама при помощи указанной программы. Доверчивые пользователи ловятся на это, принимают участие – в результате они и денег не получат, и их ip попадает в черные списки.
  3. Рассылка спама при помощи сети троянских прокси и спам-ботов. Этот метод наиболее популярен и актуален в настоящее время и поэтому заслуживает детального рассмотрения.


Схема работы типового спам-бота

Во-первых, для построения сети троянских прокси или ботов необходимо каким-либо образом заразить множество компьютеров этим самым ботом. Достигнуть этого можно при помощи эксплойтов, Trojan-Downloader, почтовых или сетевых червей. Наиболее простая схема – это Trojan-Downloader, который после запуска доверчивым пользователем затаскивает на пораженный компьютер все остальные компоненты.

Далее, после установки и запуска, спам-бот связывается с сервером владельцев. Несложно догадаться, что для работы ему необходим список email-адресов, по которым следует рассылать спам, параметры рассылки и шаблоны самих писем. Чаще всего получение этой информации ведется по многоступенчатой схеме – на первом этапе спам-бот посылает своим хозяевам информацию о том, что он запущен (с указанием IP-адреса пораженной машины, ее характеристиками и неким уникальным идентификатором – шаг 1 на схеме), в ответ получает конфигурацию (шаг 2), содержащую, в частности, URL серверов, с которых ему следует загружать списки адресов и шаблоны спама. Далее спам-бот загружает базу адресов (шаг 3) и шаблоны (шаг
4), после чего приступает к рассылке. Важной особенностью является то, что спам-бот вместо тупой рассылки заданной текстовки по списку адресов может модифицировать текст, дополнять его картинками или представлять в виде графики в соответствии с заданным алгоритмом и шаблоном. После завершения рассылки порции писем многие спам-боты посылают отчет о проделанной работе (шаг 5). Отчет может содержать статистические данные (количество успешных рассылок и ошибок) и список адресов, по которым не удалось разослать спам.

Для пользователя появление на компьютере спам-бота является крайне неприятным событием. Во-первых, он накрутит ему десятки мегабайт трафика. А во-вторых, IP пораженной машины с высокой степенью вероятности попадет в черные списки, и в дальнейшем возникнут проблемы с отправкой нормальной почты. Это особенно важно для фирм, имеющих свой почтовый сервер и статический IP-адрес – всего один юзер со спам-ботом может причинить массу головной боли админам.

Построение сетей из спам-ботов является прибыльным бизнесом – объектом торгов может быть сам спам-бот, готовая сеть из таких ботов или платная рассылка спама, осуществляемая ботами. Бороться с рассылаемым при помощи ботов спамом намного сложнее – фильтрация по IP не эффективна, а модификация писем затрудняет отсев по контексту при помощи байесовских фильтров или сигнатурных анализаторов.

Помимо спам-ботов существует еще одна методика рассылки спама, основанная на применении так называемых троянских прокси (Trojan-Proxy), которые позволяют злоумышленнику работать в сети от имени пораженной машины. Типовой алгоритм работы троянского прокси состоит в открытии на прослушивание некоторого TCP-порта (иногда номер порта статический, но чаще произвольный – для затруднения обнаружения путем сканированием портов), после чего он связывается с владельцами и передает им IP и порт. Далее он работает как обычный прокси-сервер. Многие троянские прокси умеют размножаться по принципу сетевых червей или при помощи уязвимостей.

Важно отметить, что существует множество гибридов – например, спам-бот может обладать функцией Trojan-Downloader для загрузки своих обновлений или установки дополнительных компонентов.

Найти и вскрыть!

Рассмотрим реальный пример – зловреда Trojan.Win32.Spabot.ai. Его установка начинается с загрузки из интернета дроппера размером около 29 Кб. Запустившись, дроппер создает на диске файл C:\WINDOWS\system32\rpcc.dll и регистрирует себя в автозапуск в качестве расширения Winlogon (ключик HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\rpcc). Далее он внедряет троянский код в процесс winlogon.exe и запускает его через CreateRemoteThread – в результате деятельности троянского кода происходит подгрузка библиотеки rpcc.dll (это классическая методика инжекта библиотек в процесс «по Рихтеру»). Работает библиотека по описанному выше алгоритму – получает задание и начинает методичную
рассылку спама. В качестве лирического отступления следует заметить, что среди троянских прокси и спам-ботов метод автозапуска в качестве расширения Winlogon весьма популярен. Его плюс в том, что работа идет из контекста winlogon.exe, отдельного процесса у зловреда нет, а библиотеку с «системным» именем типа rpcc.dll не всякий юзер решится удалить. Если еще добавить руткит-маскировку, восстановление ключей реестра и монопольное открытие файла, то получим труднообнаруживаемого и трудноудаляемого зловреда.

Теперь посмотрим на спам-бота с точки зрения защиты. Конечно, для борьбы с ними можно посоветовать антивирусы, Firewall и проактивную защиту… Но на самом деле детектировать наличие спам-бота очень несложно и без них. Дело в том, что даже в случае идеальной руткит-маскировки, спам-бота выдает рассылка спама – достаточно вооружиться сниффером и посмотреть, что твориться в сети. Выбор сниффера в данном случае не важен, но желательно, чтобы он умел реконструировать TCP-сессии и накапливать статистику. Мне для таких опытов нравится использовать CommView, очень неплох Ethereal. Обнаружив в сети зараженную спам-ботом машину, мы увидим примерно такую статистику (на рисунке 2 показан трафик
сегмента сети из двух компьютеров: на одном сниффер, на втором – спам-бот).


Статистика обмена с сетью зараженного спам-ботом ПК за 30 секунд

Как видно, весь трафик — это SMTP + DNS, что очень характерно для спам-бота. Далее можно отфильтровать обмен по порту 25 TCP и посмотреть содержимое пакетов. Протокол SMTP — текстовый, поэтому рассылка спама засвечивается по содержимому писем.


Фрагмент обмена с SMTP-сервером

Аналогичным способом, кстати, можно ловить почтовых червей – разница с точки зрения трафика лишь в том, что червь рассылает свои копии вместо спама.

Однако у сниффера есть один большой минус – он слишком громоздкий для оперативной проверки компьютера и требует инсталляции. Для исследования локального компьютера выходом из положения является утилита TDIMon, которая поможет не только обнаружить «нездоровую» сетевую активность, но и вычислить порождающее ее приложение.

Кроме того, не сложно изготовить собственный детектор спам-ботов при помощи C на основе анализа сетевого трафика. Рассмотрим его исходник:

#include <stdafx.h>
#include <winsock2.h>
#include <mstcpip.h>

// Буфер для приема данных
#define MAX_PACKET_SIZE 65535
static BYTE Buffer[MAX_PACKET_SIZE];

int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsadata; //
Инициализация WinSock
SOCKET RawSocket; //
Слушающий сокет
int res = 0;

// Инициализация WS2_32
WSAStartup(MAKEWORD(2,2), &wsadata);
//
Создание RAW-сокета
RawSocket = socket( AF_INET, SOCK_RAW, IPPROTO_IP );

// Определение имени хоста для нашего ПК
char HostName[256] ="localhost";
gethostname(HostName, sizeof(HostName));
printf("HostName = %s \n", HostName);

// Определение информации по имени хоста
PHOSTENT pLocalHostEnt;
pLocalHostEnt = gethostbyname(HostName);

// ППодготовка структуры SockAddr с адресом нашего хоста
SOCKADDR_IN SockAddr;
ZeroMemory(&SockAddr, sizeof(SockAddr));
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = ((in_addr *)pLocalHostEnt->h_addr_list[0])->s_addr;
/*
//
Если на ПК несколько сетевых карт, то вместо определения IP его нужно задать вручную
SockAddr.sin_addr.s_addr = inet_addr("x.x.x.x");
*/
printf("Host IP = %s \n", inet_ntoa(SockAddr.sin_addr));

// Привязка
res = bind(RawSocket, (SOCKADDR *)&SockAddr, sizeof(SOCKADDR));

// Переключение сетевой карты в "promiscuous mode" для захвата всех пакетов
unsigned long flag = 1;
res = ioctlsocket(RawSocket, SIO_RCVALL, &flag);

// Приём IP-пакетов в «мертвом» цикле
while( true )
{
//
Ожидание очередного пакета
int count;
ZeroMemory(&Buffer, sizeof(Buffer));
count = recv( RawSocket, (char *)Buffer, sizeof(Buffer), 0 );
//
Анализ только пакетов TCP v4
if (count > 33 && Buffer[0] == 0x45 && Buffer[9] == 0x06) {
//
Порт = 110 ? Это POP3
if ((Buffer[20] == 0 && Buffer[21] == 110) ||
(Buffer[22] == 0 && Buffer[23] == 110))
//
Отлов пакетов, у которых выставлены флаги SYN + ACK
if (Buffer[33] & 0x12 == 0x12)
printf("POP3: %d.%d.%d.%d -> %d.%d.%d.%d \n",
Buffer[12], Buffer[13], Buffer[14], Buffer[15],
Buffer[16], Buffer[17], Buffer[18], Buffer[19]);
//
Порт = 25 ? Это SMTP
if ((Buffer[20] == 0 && Buffer[21] == 25) ||
(Buffer[22] == 0 && Buffer[23] == 25))
//
Отлов пакетов, у которых выставлены флаги SYN + ACK
if (Buffer[33] & 0x12 == 0x12)
printf("SMTP: %d.%d.%d.%d -> %d.%d.%d.%d \n",
Buffer[12], Buffer[13], Buffer[14], Buffer[15],
Buffer[16], Buffer[17], Buffer[18], Buffer[19]);
}

}

closesocket(RawSocket);
WSACleanup();
}

Принцип действия данного детектора крайне прост – в его основе лежит сниффер на базе RAW-сокетов. Приведенный выше код инициализирует библиотеку WS2_32, затем определяет имя хоста и его IP (в реальной утилите стоит предусмотреть возможность указания IP через командную строку – пригодится для запуска на компьютере с несколькими сетевыми картами). Далее сетевая карта переключается в promiscuous mode для приема всех пакетов. Данную фичу тоже можно сделать опциональной – тогда появится возможность анализировать трафик только того компьютера, на котором запущена утилита. Прием и анализ пакетов организован в цикле: ожидаем приема очередного пакета и анализируем его заголовки. Для каждого принятого
пакета мы определяем тип по его заголовку – нас интересуют только пакеты TCP/IP v4. Если это так, то далее проверяем номер порта – для отлова спам-бота нам интересен порт 25, соответствующий SMTP-протоколу. При обнаружении таких пакетов на экран выводятся IP-адреса источника и получателя пакета. Для уменьшения протокола в данном исходнике предусмотрен еще один уровень фильтрации – утилита реагирует только на пакеты с установленными флагами SYN + ACK. Если запустить такую утилиту на зараженном спам-ботом компьютере (или такой компьютер будет в одном сегменте сети с тем, на котором запущена утилита), то зафиксируется бурный обмен по порту 25.

Подобная утилита, конечно, не панацея, но в ряде случаев она может весьма пригодиться сисадмину, тем более что программа очень простая, и ее несложно модифицировать для других видов оперативного анализа трафика. Если дополнить этот пример статистическим анализатором, то несложно построить собственную IDS-систему – тут поле деятельности не ограниченно :). Естественно, что при применении такой утилиты или сниффера следует помнить, что невозможно анализировать трафик компьютеров в сети, построенной на базе свитчей – в этом случае анализ трафика следует вести на маршрутизаторе, отвечающем за обмен локальной сети с внешним миром. В UNIX-системах для такого мониторинга удобно применять tcpdump –
он является штатным средством, и полученный в результате его работы текстовый протокол несложно проанализировать. Простейший пример запуска этого сниффера – «tcpdump -I tcp port 25 > smtp.log».



Полную версию статьи ты можешь
прочитать в январском
номере
"Спеца"

Оставить мнение

Check Also

LUKS container vs Border Patrol Agent. Как уберечь свои данные, пересекая границу

Не секрет, что если ты собрался посетить такие страны как США или Великобританию то, прежд…