«Техника сетевых атак»

Вид материалаКраткое содержание

Содержание


Что можно сделать с помощью Perl (глава для начинающих)
Ларри Уолл
Рисунок larry.gif Ларри Уолл
Врезка «информация»
Врезка «замечание»
Ларри Уолл
Аркадий Стругацкий, Борис Стругацкий "Страна багровых туч"
Подобный материал:
1   ...   10   11   12   13   14   15   16   17   ...   51

Что можно сделать с помощью Perl (глава для начинающих)




  • В этой главе:
  • История создания языка Perl
  • Назначение и возможности Perl
  • Демонстрация возможностей Perl


«…программисты слишком часто обвиняют в грехах именно себя. Программистам нужно меньше времени тратить на оправдания. Если программирование не интересно, мы не будем убеждать других стать программистами»

Ларри Уолл


Народная молва утверждает, лучше, дескать, один раз увидеть, чем сто раз услышать. Поэтому, вместо пылкой агитации за изучение языка Perl, ниже будет приведен один маленький, не самый эффектный, но достаточно оригинальный эксперимент. Как известно, большинство серверов новостей Usenet часто сильно перегружены и не отличаются завидной скоростью. А сами конференции порой содержат тысячи сообщений, просматривать которые в on-line весьма медленно и накладно.

Между тем, текстовые сообщения легко сжимаются любым архиватором в несколько раз, – будь сервер малость поумнее, – он мог бы передавать упакованный поток данных на компьютер клиента, заметно уменьшая сетевой трафик.

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

Ниже приведена одна из возможных реализаций такой программы (на диске, прилагаемом к книге, она находится в файле “/SRC/nr.pl”). В качестве упражнения зайдите telnet-ом на hobbiton.org (смотри главу «Удаленное выполнение программ») и наберите следующий текст в редакторе vi:

  • #!/usr/local/bin/perl
  • use Socket;

  • #Настойки по умолчанию
  • #$server='mailserver.corvis.ru';
  • #$server='oberon.rnd.runnet.ru';
  • $server='news.fido7.ru';
  • $group='fido7.ru.nethack';
  • $listfile='list.txt';
  • $msgfile='msg.txt';

  • print "NNTP Reader Version 2.0 (c) 2000 Kris Kaspersky\n";
  • print "Open nf.cfg file...";

  • #Попытка взятия настоек из файла
  • if (open(FH,"nr.cfg"))
  • {
  • print "OK\n";
  • $server=;
  • $server=~ s/\n//;
  • $group=;
  • $group =~ s/\n//;
  • }
  • else
  • {
  • print "fail\n";
  • }

  • print "Server [$server]:";
  • $tmp=<>; if (length($tmp)>2) {$server=$tmp; $server=~ s/\n//;}


  • print "Command (MSG|LIST|EXIT):";
  • $tmp=<>;

  • if ($tmp=~/MSG\n/)
  • {
  • print "Group [$group]:";
  • $tmp=<>;
  • if (length($tmp)>2) {$group=$tmp; $group=~ s/\n//;}
  • getmsg();
  • }

  • if ($tmp=~/LIST\n/)
  • {
  • LIST();
  • }

  • if ($tmp=~/EXIT\n/)
  • {
  • EXIT();
  • }

  • #Сохраняем настойки в файле
  • if (open(FH,">nr.cfg"))
  • {
  • print FH "$server\n";
  • print FH "$group\n";
  • }
  • close (FH);


  • sub getmsg()
  • {

  • $cmdcount=0;
  • print "Connecting to $server...";
  • socket(NNTP, PF_INET(), SOCK_STREAM(), getprotobyname("tcp") || 6);
  • connect(NNTP, sockaddr_in(119,inet_aton($server))) || die;
  • print "ok!\n";

  • recv(NNTP,$rc,200,0); # Приглашение сервеа
  • print "$rc\n";

  • send(NNTP,"GROUP $group\r\n",0); # Выбор группы
  • $group_res=;
  • if(substr($group_res,0,3)==411)
  • {
  • print "$group_res\n";
  • die;
  • }
  • print "$group_res\n";

  • open(FH,">$msgfile"); # Открыть файл сообщений
  • print FH "$group_res\n";
  • $cmdcount=0;

  • $reader=1; # цикл
  • $msgdone=0; # Сообщений прочитано

  • while($reader)
  • {
  • send(NNTP,"ARTICLE\r\n",0); # Новая статья

  • while(substr(($rc=),0,3)!~/\.\r\n/)
  • { # Чтение статьи

  • if (!$rc) {print "Close connection\n";die;}
  • print FH $rc;
  • }
  • print FH $rc;
  • $msgdone++; # Следующее сообщение
  • print "=$msgdone;\r"; # Протокол на экран

  • send(NNTP,"NEXT\r\n",0); # Следующее сообщение
  • $nx=;

  • $add=1;
  • while($add)
  • {
  • if (substr($nx,0,1)!~/\./){$add=0;}
  • if (substr($nx,0,1)=~/\./){$nx=;}

  • }
  • $nx++;

  • if ($nx==422) {$reader=0;} # Выход из цикла
  • }

  • close (FH);

  • if (open(CF,"$msgfile.gz")) # Удалить файл если он уже есть!
  • {
  • close(CF);
  • unlink("$msgfile.gz");
  • }

  • open(FG,"|gzip $msgfile"); # Сжать!
  • print "Done\n";
  • close(NNTP);
  • }

  • sub LIST()
  • {
  • print "Connect to $server...";
  • socket(NNTP, PF_INET(), SOCK_STREAM(), getprotobyname("tcp") || 6);
  • connect(NNTP, sockaddr_in(119,inet_aton($server))) || die;
  • print "ok\n";

  • recv(NNTP,$rc,200,0);
  • print $rc;

  • print ">LIST\n";
  • send(NNTP,"LIST\r\n",0);

  • open(FH,">$listfile");
  • print FH "Server: $server \nLIST:\n";

  • $cmdcount=0;

  • while(substr(($rc=),0,1)!~/\./)
  • {
  • $cmdcount++;
  • #if ($debug) { print "$rc
    \n"; }
  • print "=$cmdcount\r";

  • print FH $rc;
  • }
  • close (FH);


  • if (open(CF,"$listfile.gz"))
  • {
  • close(CF);
  • unlink("$listfile.gz");
  • }

  • print "Done\n";
  • open(FG,"|gzip $listfile");

  • close(NNTP);
  • print "
    \n";
  • }


Запустите созданный файл командой “perl nr.pl”. На экране терминала появится следующее:

  • NNTP Reader Version 2.0 (c) 2000 Kris Kaspersky
  • Open nf.cfg file...fail
  • Server [news.fido7.ru]:


Нажмите клавишу «Enter» или введите адрес news сервера, с которым хотите установить соединение. Затем появится следующий запрос:

  • Command (MSG|LIST|EXIT):MSG


Выберете команду “MSG” для получения всех сообщений заданной конференции, или “LIST” для выдачи списка всех доступных конференций. Если выбрать команду “MSG” программа попросит ввести название конференции, сообщения которой требуется получить:

  • Group [fido7.ru.nethack]:


После нажатия “Enter” начнется процесс перекачки сообщений на удаленный сервер. Если он действительно находится на быстром канале, это не займет много времени.

  • Connecting to news.fido7.ru...ok!
  • 200 ddt.demos.su InterNetNews NNRP server INN 2.3experimental 20-Nov-1998 ready (posting ok).
  • 211 418 26550 26967 fido7.ru.nethack
  • =55;


По окончании процесса в текущей директории будет создан файл “list.txt.gz” (если был запрошен список конференций) или “msg.txt.gz”, содержащий текст сообщений. Воспользуйтесь любым ftp-клиентом и выкачайте этот файл на свой локальный компьютер. Распакуйте его архиватором gzip (или совместимым с ним Winzip32) и, ради любопытства, сопоставьте размеры файла до и после упаковки, прикинув, сколько же времени удалось сэкономить.

Это довольно мирный пример, показывающий полезность Perl в повседневной жизни. Точно так можно перекачать файл с любого сервера, (например, ftp) не поддерживающего докачку, на сервер докачку поддерживающий.

Применительно к атакам подобная технология позволяет убить сразу двух зайцев. Во-первых, она обеспечивает анонимность (ведь программа исполняется от имени удаленного сервера, везде оставляя его адрес, а не IP злоумышленника), а во-вторых, многие атаки с медленного модемного канала реализовать принципиально невозможно!

Любую атаку можно свести к программной реализации, т.е. последовательность инструкций, работающих либо в полностью автономном, либо диалоговом режиме. В первом случае все необходимые установки задаются однократно до начала атаки, после чего атакующий идет пить кофе, дожидаясь окончания работы программы. А во втором требуется тесное взаимодействие с оператором – выдача промежуточных результатов, анализ ситуации и ввод очередной последовательности команд.

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

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

Впрочем, существует язык, интерпретатор которого установлен на подавляющем большинстве серверов. Речь идет о Perl. Эта аббревиатура расшифровывается как Practical Extraction and Reporting Language – или по-русски Практический Язык для Извлечения (текстов) и Генерации (отчетов).

Одна из легенд утверждает, якобы Perl был создан Ларри Уоллом для поиска и извлечения сообщений из своей огромной базы конференций Usenet.




Рисунок larry.gif Ларри Уолл



Но, на самом деле, все происходило не совсем так. Язык Perl действительно создан Ларри Уоллом, выпустившим первую версию в 1986 году и названную им “Gloria”. К этому его побудило несовершенство существующего инструментария разработки средств управления и мониторинга многоуровневых сетей. Ларри испробовал все – и sh, и awk, и sed, и tr, но их возможностей не хватало для элегантного выполнения поставленной задачи и в созданные скрипты постоянно вносить приходилось изменения.

Врезка «информация»


Аббревиатура “awk” представляет собой первые буквы имен разработчиков языка Альфред Эхо (Aho), Питер Вейнбергер (Weinberger), Брайн Керниган (Kernighan). Синтаксис языка напоминал Си и был ориентирован на обработку текстов. От классического Си, awk отличался поддержкой регулярных выражений, ассоциативных массивов и свободным определением типов переменных и описаний.


В конце концов, Ларри решился создать собственный инструментарий. Он заимствовал все лучшее из существующих языков: форматы вывода были скопированы из BASIC, динамические контексты подарил Lisp, ассоциативные массивы пришли из awk, а синтаксис стал неотличим от Си.

Гибрид оказался удачным и быстро завоевал популярность в компьютерных кругах. Успеху способствовала полная неакадемичность языка, проявляющая в огромном количестве умолчаний, часто запутывающая новичка, но сокращающих размер листинга и за это горячо любимыми всеми профессионалами.

Врезка «замечание»


«Реальные языки эволюционируют, они не «топчутся на месте». Действительно революционные компьютерные языки, похоже, не привились. Самыми интересными из последних разработок будут как раз те, которые учитывают особенности и взаимосвязь культурных традиций разных наций. Весь мир превращается в единый компьютер с тесными внутренними связями. Безусловно, XML может помочь выполнять преобразование одних форматов данных в другие, но мы работаем и над тем, чтобы упростить процесс программирования для миллиардов потенциальных программистов во всем мире»

Ларри Уолл


Вскоре Gloria была перекрещена в Pearl (в переводе на русский – жемчужина), а когда выяснилось, что такой язык уже есть, пришлось убрать одну букву, превратив жемчужину в подножную пищу кораблей пустыни (Perl обозначает колючка).

Постепенно к работе над Perl подключились десятки и сотни людей со всех концов Земного Шара и язык начал активно совершенствоваться. Со временем большая часть кода оказалась написана сторонними разработчиками, но Ларри Уолл по-прежнему остается идейным вдохновителем языка, находясь на почетном посту «генерального архитектора».

Сегодня Perl – развитый инструмент, отлично подходящий для создания Internet приложений. Одно из несомненных достоинств – его бесплатность. Получить копию интерпретатора можно, посетив сайт ссылка скрыта

Наличие Perl потребуется для большинства примеров этой книги. С его помощью можно сделать практически все что угодно, и порой намного быстрее и элегантнее, чем на классическом Си/Си++. Изначально Perl так и задумывался – как инструмент быстрого программирования. «Мы пытаемся сохранить произведения искусства, продлить их существование, но даже пища, захороненная вместе с фараонами, со временем приходит в негодность. Итак, плоды нашего программирования на Perl то же в чем-то эфемерны. Этот аспект “кухни Perl” часто порицают. Если хотите – называйте его “программированием на скорую руку”, но миллиардные обороты в кафе быстрого обслуживания позволяют надеяться, что быстрая еда может быть качественной (нам хотелось бы в это верить» писал Ларри в предисловии к книге “Perl cookbook”.

Но, каким бы простым Perl не был, он все же требует вдумчивого изучения. Сегодня на рынке по этой теме можно найти множество книг, рассчитанных, как и на профессионалов, так и на начинающих пользователей. Однако для глубокого понимания материалов и примеров, приводимых в этой книге, потребуется не только значение синтаксиса самого языка, но навыки программирования сокетов. По идее эта тема должна излагаться в любой книжке, посвященной сетевому программированию, но легко убедиться: большинство авторов предпочитают ограничиться каркасными библиотеками и не лезть вглубь, на низкий уровень TCP/IP. Зато книги, посвященные Си, часто рассчитаны на профессионального читателя и порой описывают интерфейс сокетов во всех подробностях.

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


"Будьте вы хоть семи пядей во лбу, – вам никогда не удастся запомнить все напечатанное в грудах книг и таблиц. Ведь в них есть и самое важное, и просто важное, и второстепенное, и, наконец, просто ненужное – то, что либо успело устареть, едва родившись, либо потеряло значение к настоящему времени."

Аркадий Стругацкий, Борис Стругацкий "Страна багровых туч"