Не зря я опубликовал черновик моей заметки про пиринговые сети . Комментарии читателей оказались очень полезными. Именно они вдохновили меня на дальнейшую работу в этом направлении. Что из этого вышло — смотрите под катом.
Как видно из названия поста, сегодня речь пойдет только о ботнетах. Про обмен файлами, прокси-сети, пиринговые блоги и p2p-валюту на время забудем.
Под словом «ботнет» не следует понимать что-то противозаконное. Когда пользователь добровольно скачивает и устанавливает «бота» с целью пожертвовать свой трафик и вычислительные ресурсы на нужды научного проекта, это тоже ботнет. Соответственно ботмастер не обязательно является преступником. Группа из 30 ученых, занимающихся научным проектом, это тоже «ботмастер».
1. Управление ботнетом через сервер
Самый простой способ управления ботами — запустить irc/http сервер. Через него боты будут получать команды и с его же помощью отсылать результат их выполнения.
Рисую, как умею 🙂 В данном случае иллюстрация может и не требуется, но я решил подготовить вас к шоку, который произведут остальные рисунки.
Плюсы:
- Очень простая реализация, особенно в случае с IRC.
- Быстрый ответ ботов.
- Можно отдавать команды как всей сети, так и конкретному боту.
- Если сеть состоит из сотни узлов, для управления ею достаточно одного канала в DalNet. Для сетей покрупнее можно раскошелится на недорогой (около 300 руб/мес) веб-хостинг.
- В случае с HTTP -сервером значительно упрощается разработка красивого UI. Это важно, если мы используем ботнет в каком-нибудь веб-сервисе.
Минусы:
- Нагрузка на сервер. Число узлов в самых крупных ботнетах измеряется миллионами. Чтобы управлять такой толпой, одного сервера мало.
- Если с сервером что-то случится (авария в сети, DDoS, пожар в дата-центре), сети придет конец.
- Один сервер легко зафаерволить. Это может сделать как провайдер, так и продукты Лаборатории Касперского на пользовательском компьютере.
- Ботмастера сравнительно легко найти. Один раз забыл про VPN — жди гостей в погонах.
- В случае с IRC , команды получают только боты в онлайне. Если бот зайдет на канал через две минуты после отправки команды, он будет «не в теме».
- Число ботов и их IP можно определить, зайдя на IRC-канал. Защита канала паролем не поможет, потому что последний легко выковырять из кода бота.
2. Управление через IRC-сеть
Логичный шаг для борьбы с минусами предыдущего метода — сделать не один сервер, а несколько. На мой взгляд, проще всего это сделать, подняв свою IRC-сеть. В этом случае вся ответственность на передачу данных между серверами ложится на протокол IRC . Со стороны ботов не будет никакой разницы по сравнению с предыдущим решением.
Плюсы:
- Простая реализация, хотя придется повозится с настройкой серверов.
- Боты по прежнему быстро реагируют на команды.
- Все еще можно отдавать команды конкретному боту.
- Распределение нагрузки между серверами, защита от DDoS и форс-мажоров. Десяток хороших серверов может хватить для сети из миллиона ботов.
- При отказе части серверов можно успеть их заменить.
- Если используется IRC и смущает тысяча ботов, сидящих на одном канале, используйте несколько каналов. Соответственно можно давать разным частям сети разные задания.
Минусы:
- Придется раскошелится на сервера/VDS.
- Можно зафаерволить все сервера одновременно и ботмастер не успеет их заменить.
- Ботмастера все еще достаточно просто отследить.
- В случае с IRC , число ботов и их IP по прежнему у всех на виду.
- Боты, которые только что зашли на канал, не в теме.
3. Трастринг
Термин трастринг (trust ring, круг/кольцо доверия) я впервые услышал от товарища Nickolas в комментариях к предыдущей заметке . Речь идет о том, чтобы возложить функцию «серверов» на часть ботнета.
Плюсы:
- Не нужны никакие сервера.
- Трастринг может состоять из сотен узлов. Поднять и контролировать такое число irc/http-серверов непросто.
- Боты не должны постоянно держать соединение с трастрингом. Достаточно проверять раз в 5-10 минут, не появилось ли новых команд. Каждая команда должна иметь TTL, в течение которого она хранится в трастринге.
- Большое число «серверов» обеспечивают устойчивость сети к всевозможным бедствиям . Когда часть кольца отомрет, ботмастер может дать команду о создании нового трастринга. Или это могут сделать сами узлы кольца (нужны цифровые подписи и согласие определенного процента трастринга).
- Пусть трастринг состоит из 512 узлов, по крайне мере 50% постоянно находятся онлайн. Если в сети 1 000 000 ботов и каждый из них постоянно онлайн, на каждый узел трастринга придется менее 4000 ботов. При запросе ботом команд (или при отправке результата) раз в 10 минут, каждый узел кольца одновременно будет обрабатывать в среднем 7 соединений. Совсем немного для сети такого размера, правда?
- Точный список всех ботов может получить только ботмастер.
- Можно отдавать команды конкретному боту или группе ботов.
- Быстрая реакция ботов на команды.
- Ботмастера трудно найти.
Единственный минус, который я вижу — сложность реализации.
4. Пиринговые сети
Если верить интернет-источникам, в настоящее время большой популярностью пользуются P2P ботнеты. Среди этих источников наибольшего внимания заслуживает статья Лаборатории Касперского . Каждый узел такой сети знает лишь несколько «соседних» узлов. Ботмастер посылает команды нескольким узлам сети, после чего она передается от соседу к соседу.
Дополнение: В сети появилась еще одна статья ЛК, посвященная ботнетам — Ботнет Bredolab. Конец истории?
Список соседей выдается ботам один раз на специальном сервере. Им может быть, например, взломанный сайт. Больше сервер ничего не делает, он нужен только во время добавления нодов в ботнет.
Плюсы:
- Реализация несколько проще, чем в предыдущем пункте.
- Минимальная нагрузка на все узлы сети. Размер ботнета практически неограничен.
- Устойчивость к DDoS, отключению узлов и тд. Зафаерволить p2p-ботнет практически невозможно.
- Никаких постоянных соединений, как в случае с IRC.
Минусы:
- Нужен сервер, пусть и ненадолго.
- Узлы время от времени отмирают, что сказывается на связности сети.
- Чтобы получить список всех ботов, нужно, например, дать им команду обратиться к определенному сайту. В этом случае нет гарантии, что список получит только ботмастер.
- Чтобы дать команду определенному узлу, нужно либо послать ее всей сети, либо соединиться с узлом напрямую.
- Медленная реакиця ботов на команды.
- Чтобы послать «длинную» команду, например, со списком URL, нужно воспользоваться сторонним сервером, иначе реакция ботов замедлится еще больше.
- Ботмастера найти проще, чем в предыдущем примере, за счет использования какого-никакого сервера.
Я конечно могу ошибаться, но по-моему p2p-ботнеты намного хуже трастринга. Может, производители антивирусов о чем-то умалчивают?
5. Комплексное решение
Один из способов изобрести что-то новое и хорошее — скрестить что-то старое. Объединили телефон, компьютер, магнитофон, фотоаппарат и видеокамеру — получили смартфон . Компьютером и климат-контролем в автомобиле уже никого не удивишь. Приклеим к каждому йогурту магнитик на холодильник, и продажи взлетят.
Важно помнить, что при неудачном скрещивании мы можем получить ни на что не годную особь. Напоминает генетические алгоритмы , правда? Возьмем, казалось бы, хорошую идею — p2p-ботнет, где за назначение соседей отвечает трастринг. Тогда нам не нужен никакой сервер!
Но в этом случае возрастет сложность реализации, пусть и ненамного. Остальные проблемы p2p-ботнета останутся нерешенными. Выигрыш незначительный, счет 1:1.
Немного посидев с бумажкой и карандашом, я родил следующую идею. Насколько мне известно, ранее она никогда не озвучивалась, и я первый, кто такое придумал. ЧСВ плюс 100.
Что, если сеть будет иметь два состояния — «активное» и «пассивное». В пассивном состоянии ботнет работает по схеме p2p. Ботмастер посылает команду «мобилизовать войска» и сеть превращается в трастринг. В своей команде ботмастер должен указать узлы трастринга и время, на которое сеть меняет свое состояние. Чтобы кольцо было побольше, можно дать команду нескольким ботам назвать своих соседей. Далее все команды передаются через трастринг. Он же отвечает за назначение «соседей» новым узлам. Если TTL кольца впоследствии окажется недостаточно, можно дать команду «продлить активное состояние».
Такой ботнет не унаследует ни одного минуса p2p-сети и будет обладать всеми плюсами трастринга, а также следующими:
- Повышенная устойчивость к ddos-атакам и сетевым фильтрам, как у p2p-сети.
- Минимальное потребление ресурсов ботами во время простоя сети. Ботмастеру не нужно отслеживать состояние трастринга и выбирать для него новые узлы.
- При создании трастринга выбираются только те узлы, что в настоящее время находящиеся онлайн. Боты будут соединяться с кольцом с первой попытки (какое-то время).
- Список «соседей» периодически обновляется. Все равно IP узлов, входящих во временное кольцо, знает весь ботнет. Так пусть считают эти узлы соседями, если часть настоящих соседей давно не появлялась в сети.
И единственный недостаток, который я здесь вижу — сложность реализации. Но это на самом деле не является проблемой.
6. О чем важно помнить
До сих пор я умалчивал о некоторых моментах, потому что они присущи любому из названных способов управления ботнетом. Следует заострить на них внимание.
- Часть узлов не может принимать входящие соединения из-за фаервола или NAT. Как минимум, это нужно учесть при написании бота. Например, при распространении команд в p2p-сети бот должен сам периодически обращаться к соседям, а не ждать команды от них.
- Следует исходить из того, что все команды, посылаемые сети, прослушиваются. Как минимум, заинтересованное лицо может модифицировать для этих целей код бота. Тем не менее, имеет смысл шифровать весь трафик , передаваемый в сети. Как минимум, это усложнит анализ ботнета.
- Все команды ботмастера должны подписываться цифровой подписью . Пароли не годятся, потому что могут быть перехвачены.
- Раз речь зашла о реализации, отмечу, что в любом ботнете должны быть предусмотрены как минимум три команды — обновление ботов, обновление ключа ботмастера и самоуничтожение всей сети.
- В сети имеются «шпионские» ноды. Часть из них входит в трастринг. При этом мы не знаем целей, которые эти «шпионы» преследуют — это может быть определение IP ботмастера, срыв выполнения команд, выведение сети из строя, получение контроля над ботнетом и так далее. В частности, это означает, что боты должны выбирать случайный узел при соединении с кольцом, а не использовать все время один и тот же.
- На рисунке узлы трастринга соединяются каждый с каждым, но куда практичнее реализовать кольцо в виде небольшой p2p-сети, то есть по принципу «соседей».
Также отмечу, что решения 1 и 2 (сервер, много серверов) лишаются многих минусов и получают пару плюсов от решения 3 (трастринга) при использовании протокола HTTP. Пролистайте еще раз эти пункты, чтобы понять, о чем я.
7. Выводы
Для небольших сетей хорошим решением является использование IRC. Например, если вы хотите создать свою небольшую сеть для распределенных вычислений, установите бота на домашнем компьютере, ноутбуке, нетбуке, рабочем компьютере (если это позволяет политика компании) и управляйте сетью через DalNet. Если понадобится, позже сеть можно будет «прокачать» до трастринга. Вы же предусмотрите соответствующую команду, верно?
Если к ботнету нужен красивый веб-интерфейс, возможно, имеет смысл написать дополнительную программу, которая будет забирать команды с веб-сервера и отправлять их в IRC. По крайней мере, рассмотрите этот подход.
Универсальные решения — это трастринг и p2p+трастринг. Такие сети будут идеально работать независимо от того, сколько в них узлов, 1 или 1 000 000, безо всяких серверов.
Ввиду наличия у «чистого p2p» явных недостатков по сравнению с кольцом, мне остается неясным, почему он считается удачным решением. Наверняка в ботах, из которых состоит сеть, есть много полезных функций. Почему бы не добавить еще один маленький payload — мобилизацию сети в трастринг?
Вот, пожалуй, и все. Буду рад любым вашим комментариям. Особенно с критикой, указаниями на неточности/противоречия в тексте и вашими идеями по поводу поднятой темы.