семинары по безопасности ЗАЙЦЕВ ОЛЕГ Хакер, номер #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». |