Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #74, ЯНВАРЬ 2007 г.

семинары по безопасности

ЗАЙЦЕВ ОЛЕГ

Хакер, номер #074, стр. 022


СПАМ-БОТЫ: ВСКРЫТИЕ И БОРЬБА

ЗЛОБНЫЕ ПРОГРАММИСТЫ НЕ СПЯТ НОЧАМИ И НЕ ОТДЫХАЮТ ДНЯМИ, ПЫТАЯСЬ ЗАСАДИТЬ ОЧЕРЕДНОГО СПАМ-БОТА В КОМПЬЮТЕР ЧЕСТНОГО ПОЛЬЗОВАТЕЛЯ. ОНИ ЗАРАБАТЫВАЮТ ДЕНЬГИ НА НАШЕМ ТРАФИКЕ, ЗАСВЕЧИВАЯ НАС В БЛЕКЛИСТАХ И ВЫСТАВЛЯЯ В ДУРНОМ СВЕТЕ ПЕРЕД НАЧАЛЬСТВОМ. В ЭТОЙ СТАТЬЕ МЫ ВЗГЛЯНЕМ НА СПАМ-БОТЫ С ПОЗИЦИИ ЗАЩИТНИКА ДОБРА И СПРАВЕДЛИВОСТИ, ПРОВЕДЕМ ВСКРЫТИЕ И НАУЧИМСЯ ИХ УБИВАТЬ

[капля истории.]

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

1 РАССЫЛКА ВРУЧНУЮ. ЭТОТ МЕТОД ДО СИХ ПОР ПРИМЕНЯТСЯ, НО ЭФФЕКТИВНОСТЬ ЕГО НЕВЕЛИКА, И С ТАКИМ СПАМОМ ОЧЕНЬ ПРОСТО БОРОТЬСЯ ПУТЕМ ВНЕСЕНИЯ ПОЧТОВОГО И IP-АДРЕСА ОТПРАВИТЕЛЯ СПАМА В ЧЕРНЫЙ СПИСОК.

2 ПРОГРАММЫ АВТОМАТИЧЕСКОЙ РАССЫЛКИ СПАМА. МОГУТ БЫТЬ ВЫПОЛНЕНЫ В ВИДЕ УТИЛИТЫ ПОД WINDOWS ИЛИ СКРИПТА ДЛЯ РАЗМЕЩЕНИЯ НА WEB-САЙТЕ. В СУЩНОСТИ, ЭТО АВТОМАТИЗИРОВАННАЯ РАЗНОВИДНОСТЬ МЕТОДА 1, И ИНОГДА ОНА РАБОТАЕТ ПО ПРИНЦИПУ ЛОХОТРОНА - ПОЛЬЗОВАТЕЛЮ ОБЕЩАЮТСЯ ЗОЛОТЫЕ ГОРЫ, ЕСЛИ ОН ПРИМЕТ УЧАСТИЕ В РАССЫЛКЕ СПАМА ПРИ ПОМОЩИ УКАЗАННОЙ ПРОГРАММЫ. ДОВЕРЧИВЫЕ ПОЛЬЗОВАТЕЛИ ЛОВЯТСЯ НА ЭТО, ПРИНИМАЮТ УЧАСТИЕ – В РЕЗУЛЬТАТЕ ОНИ И ДЕНЕГ НЕ ПОЛУЧАТ, И ИХ IP ПОПАДАЕТ В ЧЕРНЫЕ СПИСКИ.

3 РАССЫЛКА СПАМА ПРИ ПОМОЩИ СЕТИ ТРОЯНСКИХ ПРОКСИ И СПАМ-БОТОВ. ЭТОТ МЕТОД НАИБОЛЕЕ ПОПУЛЯРЕН И АКТУАЛЕН В НАСТОЯЩЕЕ ВРЕМЯ И ПОЭТОМУ ЗАСЛУЖИВАЕТ ДЕТАЛЬНОГО РАССМОТРЕНИЯ.

Схема работы типового спам-бота показана на рисунке 1.

Во-первых, для построения сети троянских прокси или ботов необходимо каким-либо образом заразить множество компьютеров этим самым ботом. Достигнуть этого можно при помощи эксплойтов, 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 показан трафик сегмента сети из двух компьютеров: на одном сниффер, на втором – спам-бот).

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

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

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

Кроме того, не сложно изготовить собственный детектор спам-ботов при помощи 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».

Содержание