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

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

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

  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».



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

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии