Создание и маскировка собственного IRC-ботнета

Случалось ли тебе, мой дорогой товарищ, находиться в роли администратора? Я думаю, что большинству читателей случалось. Кто-то успешно админил локальную сеть, а кто-то — отдельный сервер. Но лишь немногим удалось возвести и поддерживать настоящий ботнет — приватную IRC-сеть для боевых ботов. Сейчас я поделюсь опытом и выдам все секреты бывалого ботмастера. И хоть сама концепция управления ботами по IRC уже немного устарела, описанные навыки не пропадут зря. Вот увидишь!

[кто они, боты?]

Позволь мне немного отойти от главного вопроса и рассказать тебе о вражеских ботах. Не думай, что это те самые ламоботы, развлекающие онлайн-играми в IRC и кикающие наглых чатлан. Наши роботы не такие примитивные существа, они способны зарабатывать деньги. И очень большие деньги. Давай условимся, что под сочетанием «вражеский бот» я буду подразумевать программу, незаконно проживающую на компьютере и выполняющую нехорошие действия. Большинство ботов ориентировано на спам либо DDoS-атаки. Я думаю, теперь ты понял, почему держать ботнет прибыльно. Однако чтобы добиться желаемого результата в сетевом бизнесе, нужно иметь в запасе не менее тысячи электронных солдат. Ясен пень, что построить виртуальную казарму для такой армии на первый взгляд довольно сложно. Но если подойти к проблеме с умом, задача решается за один вечер.

[подготовка фундамента]

Если тебе предложили работать ботмастером либо ты захотел создать собственный ботнет, необходимо задуматься над вопросом: на чем он будет держаться? Здесь существуют два варианта: либо ты покупаешь выделенный сервер для IRCD, либо водружаешь плацдарм на взломанном шелле. На мой взгляд, второй вариант более реален, так как многие хостинги попросту не дают отдельный сервер для IRC. Либо дают, но если администраторы узнают, что на этом сервере живут боты, тебе точно не поздоровится. Лично я за минувшие два года создал и поддерживал целых два ботнета, состоявшие из четырех серверов. И надо сказать, все они были на взломанных шеллах. Разумеется, в некоторых случаях администраторы убивали мои бэкдоры и переустанавливали систему, но в большинстве своем боты жили и здравствовали. Поэтому я советую найти три-четыре взломанные машины (необязательно с root-правами) и установить на них подходящий софт. Либо, если ты точно знаешь, что хостер предоставляет дедики под любые дела и ему плевать, что на его сервере будет жить стадо ботов, покупай отдельную машину для будущего ботнета.

[собираем UnrealIRCD]

Теперь определимся с софтом, который будет крутиться на сервере. На мой взгляд, самая лучшая программа, которая подходит для этого, — это UnrealIRCD. Этот демон обладает массой настроек и примочек, а посему достоин обслуживать всех твоих ботов.

Начнем с того, что ты зайдешь на свой сервер и скачаешь архив с демоном (wwwunrealircd.com/?page=downloads). Если бы я писал статью об установке IRCD для общения, то не стал бы обращать внимания на все тонкости инсталляции. Но в данном случае нам придется позаботиться о таких мелочах, так как именно они будут залогом твоей безопасности. Ведь ты же не хочешь, чтобы администратор убил ботнет на второй день после его установки, правда?

После распаковки архива можешь смело запускать ./Config. Сценарий задаст тебе несколько вопросов, и здесь тебе не надо особо задумываться над ответами. Скажу лишь, что необходимо собрать ircd в режиме хаба (главный сервер, к которому будут прилинкованы остальные) либо в режиме лифа (ведомый сервер, впоследствии залинкованный к хабу). Также следует определить пути к каталогу, где будет находиться IRCD, и выбрать имя самого демона. К этому вопросу нужно отнестись творчески. Допустим, у тебя нет рут-прав, и администратор каждый день бдит в консоли. Тогда разумнее задать путь в виде /tmp/.mc-root либо указать другой каталог, сливающийся с соседними.

Следующим шагом надо бы запустить команду make. Однако не будем торопиться со сборкой демона. Прежде чем заняться компиляцией, переопределим некоторые дефолтные пути. К примеру, для маскировки определимся, что бинарник ircd будет находиться в каталоге /tmp/.mc-root и называться inetd или другим невзрачным именем. Необходимо помнить, что по умолчанию конфиг-файл для ирки назван unrealircd.conf, но нам это название не подходит, лучше переименуем конф в /tmp/php-11223344 (или другой номер, подобный тому, что находится в /tmp). Откроем файл include/config.h и найдем переменную CPATH. Затем изменим ее значение на указанное выше, а также поменяем все пути, которые могут понадобиться (путь к motd и т.п.). Теперь стоит рассказать еще об одном неприятном моменте: для маскировки ip-адресов (а мы, ясное дело, их будем скрывать) используются модули cloak.o и commands.o. Путь к ним объявляется в конфе и может быть любым. Но вся беда в том, что перед загрузкой модули помещаются в папку tmp и называются произвольным именем. Нам такого палева не надо, поэтому открываем файл src/modules.c и изменяем все встречающиеся слова «tmp/» на «/tmp/.mc-root/». Теперь будь уверен, что модули перед загрузкой скопируются в этот каталог. Только не забудь создать эту директорию перед запуском демона :).

И еще один предкомпиляционный штрих. Найди переменную SHOW_INVISIBLE_LUSERS в хидере config.h и андефни ее. Это поможет скрыть пребывание твоих ботов на ircd, если кто-нибудь решит выполнить команду /lusers.

Все! Теперь можно смело собирать демон командами make и make install. После этого в каталоге /tmp/.mc-root появится ряд файлов и каталогов. Удаляй все, кроме бинарника inetd. Затем перенеси модули cloak.o и commands.o в оговоренную ранее папку, а также возьми example.conf из дистрибутива UnrealIRCD (каталог doc). Пожалуй, теперь все готово для редактирования конфига.

[параноидальная настройка конфига]

Конфиг от UnrealIRCD состоит из нескольких независимых блоков. В каждый могут быть внесены подблоки, а также переменные и их значения. Самое первое, что необходимо сделать, это прописать инклуды на модули. Раскомментируй соответствующие строки и радуйся жизни :). Затем заполняется блок me {}. В нем находится информация о IRC-сервере. Думаю, понятно, что домашний адрес и телефон ботмастера мы давать не будем. Ограничимся лишь заданием трех переменных: name со значением «irc.sweetly.net» (или любым другим дружелюбным именем, необязательно существующим в сети), info, имеющую значение «Sweetly IRC Server», а также numeric — уникальный номер сервера. Надо заметить, что у всех серверов, находящихся в одной IRC-сети, не должно быть совпадающих номеров. Иначе они попросту не залинкуются.

Далее следует блок admin. Не рекомендую вписывать сюда твой реальный ник. Лучше напиши какое-нибудь фейковое описание администратора, например «Alexander S. Pushkin» :).

Затем идут объявления классов clients и servers. Я думаю, ты понял, что это настройки серверов и клиентов. Здесь можно оставить все по дефолту, лишь изменив количество клиентов на большее число (боты, как-никак). Размеры буферов и время пингов лучше оставить как есть. Чуть ниже объявляется секция allow, позволяющая открыть доступ лишь с определенных IP. Нам эта затея ни к чему, поэтому объявляй абсолютный userhost в виде *@*. А вот последующий блок allow channel может быть очень полезен.

Теперь настало время поговорить об IRC-операторах. В нашей приватной сети иркопы должны быть наделены всеми правами, однако следует позаботиться, чтобы левый хакер не стал оператором. Для этого нужно объявить всего один блок oper NAME (где NAME — имя иркопа) со следующими вложенными переменными:

* from { userhost user@host; }. Обязательно укажи здесь свой ident и hostname, так как парольную защиту очень просто обойти. Любой заинтересованный человек может написать брутфорс либо каким-то образом войти на сервер и прочитать конфиг.

* password HASH { crypt; };. В этой конструкции HASH имеет вид DES-хэша, а crypt означает метод шифрования пароля. Здесь необходимо отметить, что шифрование пароля обязательно, а метод можно выбрать более криптостойкий — md5 или sha1, например.

* flags {netadmin; can_gkline; global; };. Достаточно этих флагов, чтобы администратор не чувствовал себя ущемленным в правах. Впрочем, можешь посмотреть мануал и добавить избыточные.

С операторами разобрались. Теперь следует обратить внимание еще на пару блоков. Во-первых, нужно объявить порт, на котором будет вертеться ircd. Это делается с помощью конструкции «listen ip:port». Настоятельно рекомендую выбрать нестандартный порт, чтобы не притягивать внимание администраторов и хакеров (разумеется, если твои боты понимают нестандартные IRC-порты). И наконец, самый важный блок под названием set должен быть настроен с особой тщательностью. Здесь можно увидеть глобальные опции. Обсудим самые важные из них.

1 network-name "SweetNET". Здесь мы объявляем имя сети. Разумеется, лучше воздержаться от названий «BotNET» и т.п. :).

2 hiddenhost-prefix "sweet". Этот префикс будет фигурировать в IP-адресе пользователя. После этой частицы можно будет увидеть рандомное число, а уже затем какую-то часть реальной сети. Данная особенность будет весьма кстати — никто не узнает твоего IP-адреса и не сможет переманить ботов на свою сторону.

3 cloak-keys {}. В этом блоке необходимо указать три рандомные фразы. Первый пример дан, аналогично сформируй еще два. Данная опция нужна только для генерации случайного префикса в IP-адресе.

4 kline-address "aa@bb.net". Здесь необходимо указать почту k-line поддержки. Если этого не сделать, ircd не запустится, поэтому впиши сюда какой-нибудь фейковый, но правдивый на первый взгляд адресок.

5 modes-on-connect "+ixw". Эти режимы лучше оставить по умолчанию. Обязательно ставь пользователям (читай ботам :)) моду +i, иначе любой встречный хакер может узнать его IP-адрес.

6 maxchannelsperuser 1. Я намеренно установил лимит каналов равным единице. Это может быть полезно, чтобы случайно зашедшие пользователи не устраивали чат на твоей территории (всякое бывает, поверь мне :)).

7 oper-only-stats "okfGsMRUEelLCXzdD". Эта опция запрещает пользователям юзать команду /stats. Здесь я объявил все допустимые режимы, поэтому будь уверен, что никто не сможет запросить список операторов либо посмотреть состояние серверов в сети.

8 options { flat-map; }. Этот параметр является очень полезным. Он записывается во вложенном блоке и нужен для запрещения связей между серверами. Скажем, выполнит юзер команду /LINKS, а в ответ получит несвязную цепочку из серверов. Конечно, абсолютной защиты эта надстройка не дает, но лишней точно не будет.

В конфиге также может присутствовать блок log {}, но устанавливать его не рекомендую, поскольку на сервере не должно быть логов. В первую очередь ботоводы просят вырубить всяческие логи. Действительно, без них будет намного безопаснее.

[запуск и линковка]

Когда конфиг настроен, можно попробовать запустить ircd. Зайди в каталог /tmp/.mc-root, затем скомандуй export PATH=.:$PATH и набери слово «inetd». Махинация с патчем избавит тебя от относительного пути в списке процессов. Если в конфиге нет ошибок, то демон запустится. Теперь можешь подключаться к IRCD и проверять oper-аутентификацию, настройки конфига и т.п.

Но ты понимаешь, что сеть из одной машины — не сеть. Чтобы соединить несколько однотипных серверов, необходимо повторить весь процесс установки на других машинах. Но последующие инсталляции будут намного проще, ведь все отредактированные конфиги у тебя на руках. Когда у тебя будет как минимум один хаб и один лиф, можешь попытаться их слинковать.

Перед началом линковки убедись, что опции numeric в секциях me {} имеют разные значения. Об этом я уже писал, но это очень распространенная ошибка. Затем необходимо правильно составить блок link "имя.сервера". Здесь имя — название машины, к которой производится линк, опять же, необязательно существующее в сети, но явно прописанное в секции me {}. В этом блоке нужно указать переменные hostname (IP-адрес сервера), port (порт, который слушает IRCD) и два пароля: password-connect и password-receive (рекомендую сделать их одинаковыми во всех конфигах, чтобы лишний раз не путаться). Здесь же обязательно находится опция hub *; или leaf *, объявляющая тип сервера. Помимо этого, в секции может находиться вложенный блок class {} с параметром autoconnect. Это дело лучше прописать в конфиге хаба.

Все! Теперь можешь командовать /connect server.name на любом сервере, и ты увидишь, как оба IRCD поспешно слинкуются в единую сеть. Я рекомендую впускать ботнет в IRC, когда число серверов будет достигать четырех-пяти.

[следим за безопасностью]

Вот, собственно, и все. Тема ботнета на этой статье не заканчивается. Я бы с удовольствием рассказал тебе о том, как обслуживать стадо ботов, искать затаившихся врагов в списке пользователей (а такие будут точно), а также защищать ботнет от нежданных гостей. Однако объем материала не позволяет мне этого сделать. Если тебя интересуют вопросы по ботам, можешь присылать их на мыло, и я обязательно проконсультирую тебя в порядке очереди :).

Генерация паролей

В статье я упоминал о том, что пароли для IRC-операторов лучше задавать в хэшированном виде. Однако немногие знают, как сгенерировать такой хэш. На самом деле все просто. Так, например, хэш DES создается командой openssl password. MD5 легко получить запросом echo -n "пароль"|openssl md5. Хэш sha1 делается по аналогии: echo -n "пароль"|openssl sha1. Параметр -n передает пароль на ввод openssl без символа переноса строки.

Долой нецензурщину!

UnrealIRCD способен заменять плохие слова на <censored>. Давай посмотрим, как нам может пригодиться эта фича. Для запроса к боту обычно используется строка авторизации (когда я был ботмастером, эта строчка выглядела как «!auth ключ»). Можно сделать замену слова «!auth» на «censored» и таким образом запретить простым смертным мучить ботов. Однако не все так просто: замена производится, даже если ты иркоп и при наличии мода +G на канале или пользователе. Поэтому, если есть желание юзать цензор, нужно пропатчить исходники IRCD и вставить условие наличия флага оператора в процедуру автозамены. Я это проделал, а вам слабо? :)

INFO

Сервер UnrealIRCD поддерживает ziplinks и ssl-соединения, но эти избыточные фичи лучше вырубить.