Техника сетевых атак
Шрифт:
· print "»DATA\n";
· recv(SMTP, $buffer, 200, 0);
· print "$buffer\n";
·
· send(SMTP, "From: Kris Kaspersky\n", 0);
· print "»From: Kris Kaspersky";
· print "«BR»\n\n";
·
· send(SMTP, "Subject: Test\n", 0);
· print "»Subject: Test\n";
· send(SMTP, "Hello, KPNC!\n", 0);
· print "»Hello, KPNC!\n";
·
· send(SMTP, "\r\n.\r\n",0);
· print "\r\n.\r\n";
· recv(SMTP, $buffer, 200, 0);
· print "$buffer\n";
·
· send(SMTP, "QUIT\n",0);
· print "»QUIT\n";
· recv(SMTP, $buffer, 200, 0);
· print "$buffer\n";
·
· close(SMTP);
Приведенный пример позволяет отослать только одно письмо по указанному адресу. На самом же деле, если программа может отправить одно письмо, то сумеет и десять, стоит только дополнить ее циклом [219].
Автор умышленно не привел законченного примера, оставляя читателю свободное пространство для творчества. В противном случае слишком велик был бы соблазн забросить книгу на полку и использовать содержащиеся на диске программные реализации атак, совершенно не интересуясь механизмом их работы.
Скрипт необходимо разместить на сервере, который поддерживает удаленное выполнение программ, разрешает telnet-вход, имеет в наличие интерпретатор Perl и допускает установку соединений с другими узлами сети. Перечисленным требованиям удовлетворяет, например, hobbiton.org и некоторые другие бесплатные сервера.
Для размещения файла скрипта на сервере лучше всего воспользоваться ftp-протоколом, а запустить его из telnet-сессии проще всего так: “perl имяфайла.pl”. (Для запуска скрипта по протоколу HTTP его придется несколько модифицировать, о том, как это сделать рассказано в главе «Протокол HTTP»). После завершения работы скрипта экран должен выглядеть приблизительно так:
Рисунок 31 Демонстрация работы скрипта, посылающего письмо
Для облегчения понимания этот пример не имеет никаких изменяемых настоек и все данные прописаны непосредственно в теле программы. Однако это не законченная программа, а всего лишь макет, демонстрирующий принципиальную возможность анонимной отправки корреспонденции.
Заголовок письма, доставленного на “kpnc@aport.ru” (или по любому другому адресу) должен выглядеть приблизительно так:
· From kpnc@aport.ru Mon Jun 05 11:51:53 2000
· Received: from hobbiton.org ([216.161.239.42] helo=kpnc)
· by hearst.mail.ru with smtp (Exim 3.14 #3)
· id 12yrfs-000KGD-00
· for KPNC@APORT.RU; Mon, 05 Jun 2000 11:51:53 +0400
· From: Kris Kaspersky
· Subject: Test
· Message-Id:
· Date: Mon, 05 Jun 2000 11:51:53 +0400
В заголовке содержится IP-адрес сервера, выполнившего скрипт, но нет никакой информации об отправителе (за исключением данных, которые он пожелал оставить сам). Таким образом, можно построить собственный анонимайзер, позволяющий его создателю (а, возможно, и другим пользователям) рассылать анонимные сообщения.
Подобные услуги предоставляют сотни поставщиков в сети, но не все анонимайзеры действительно надежны. Лучше всего пользоваться программным обеспечением собственного написания, в котором можно гарантировать отсутствие «закладок», а поведение чужого ресурса временами бывает непредсказуемо [220].
Однако технически возможно фиксировать IP-адреса всех пользователей, подключившихся к hobbiton.org [221] и запустивших скрипт рассылки на выполнение. Поэтому, отправителю, желающему остаться абсолютно неизвестным, необходимо найти такой сервер, который бы не вел никаких протоколов [222]. Или можно задействовать несколько десятков узлов, последовательно пересылая скрипт (или команду на его выполнение) от машины к машине. Если хотя бы один из узлов этой цепочки не регистрирует всех подключений, то установить отправителя будет невозможно. Некоторые приемы позволяют подделать содержимое IP-заголовка. Но, поскольку такая операция требует весьма высокой квалификации, к ней обычно не прибегают.
Кроме сокрытия анонимности отправителя, скрипт может использоваться для фальсификации (или уничтожения) заголовков писем. Например, можно создать видимость, что сервер, отправивший письмо, всего лишь транзитный узел пересылки, а «настоящий» отправитель находится совсем - совсем в другом месте.
Для этого достаточно вставить в заголовок одно (или несколько) полей «Received», например, так “Received: from mail.pets.ja” [223]. Модифицированный вариант smtp.pl находится на прилагаемом к книге диске под именем smtp1.pl, и от оригинального файла отличается следующими строками:
· send(SMTP, "Received: from mail.pets.ja\n", 0);
· print "»Received: from mail.pets.ja";
Заголовок письма, отправленного с его помощью, должен выглядеть приблизительно так:
· From kpnc@aport.ru Thu Apr 06 10:57:30 2000
· Received: from [209.143.154.93] (helo=kpnc)
· by camel.mail.ru with smtp (Exim 3.02 #107)
· id 12d6EL-000NmZ-00
· for KPNC@APORT.RU; Thu, 06 Apr 2000 10:57:30 +0400
· Received: from mail.pets.ja
· From: Kris Kaspersky
· Subject: Test
· Message-Id: «E12d6EL-000NmZ-00@camel.mail.ru»
· Bcc:
· Date: Thu, 06 Apr 2000 10:57:30 +0400
Получатель, скорее всего, решит, что письмо пришло с сервера mail.pets.ja, и вряд ли обратит внимание на ретрансляторы. Выявление истинного получателя можно значительно затруднить, если не класть письмо непосредственно в почтовый ящик клиента, а переслать его через несколько транзитных серверов. В этом помогут возможности управления маршрутизацией доставки сообщения, поддерживаемые SMTP-протоколом. Если задействовать несколько десятков узлов и вставить в письмо несколько десятков подложных строк “Received”, то установить истинного отправителя сообщения станет практически невозможно, вернее сказать, нецелесообразно.