Дополнение. Анонимная рассылка корреспонденции
Ø В этой главе:
Ø Создание скрипта, отправляющего сообщения
Ø Обеспечение анонимности отправителя письма
Ø Фальсификация заголовков сообщения
Большинство SMTP-серверов определяют IP‑адрес отправителя сообщения и вставляют его в заголовок. Конечно, IP‑адрес это еще не сам отправитель (которого пойди найди), но иногда возникает необходимость остаться полностью анонимным.
В Сети существует множество служб, предоставляющих услуги подобного рода (например, proxy-серверы, анонимайзеры), но анонимайзеры явно указывают на желание отправителя остаться неизвестным, а по поводу анонимности некоторых proxy-серверов многих терзают смутные сомнения.
Одно из возможных решений проблемы заключается использование программы пересылкой писем, размещенной на удаленном сервере. Выбор сервера, подключенного к быстрому Internet-каналу, упросит массовую рассылку корреспонденции.
Врезка «для начинающих»
Часто начинающие вредители не могут придумать ничего оригинальнее, чем заставлять сервер с помощью скрипта получать самый свежий дистрибьютив бета-версии Windows 2000[218] и посылать его на ящик жертвы в немерянных количествах.
Куда привлекательнее выглядит попытка принудительного приобщения атакуемого к миру прекрасного, например, ознакомление его с космическими исследованиями NASA (для чего используются фотографии, доступные на сайте www.nasa.gov )
Ниже приведена одна из возможных реализаций такой программе, написанной на языке Perl (на диске, прилагаемом к книге, она находится в файле “/SRC/smtp.pl”). Подробное объяснение ее работы выходит за рамки данной книги, однако, структура программы достаточна проста, чтобы в ней мог разобраться даже неподготовленный читатель.
· use Socket;
· my($mailFrom) = '[email protected]';
· my($MailTo) = '[email protected]';
·
· socket(SMTP, PF_INET(), SOCK_STREAM(), 6);
· connect(SMTP,sockaddr_in(25,inet_aton("mail.aport.ru")));
·
· recv(SMTP, $buffer, 200, 0);
· print "$buffer\n";
·
· send(SMTP, "HELO kpnc\n",0);
· print ">HELO\n";
·
· my($buffer) = @_;
· recv(SMTP, $buffer, 200, 0);
· print "$buffer\n";
·
· send(SMTP, "MAIL FROM: <$mailFrom>\n",0);
· print ">MAIL FROM:<$mailFrom>\n";
· recv(SMTP, $buffer, 200, 0);
· print "$buffer\n";
·
· send(SMTP, "RCPT TO: <$MailTo>\n",0);
· print ">RCPT TO: <$MailTo>\n";
· recv(SMTP, $buffer, 200, 0);
· print "$buffer\n";
·
· send(SMTP, "DATA\n",0);
· 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 Демонстрация работы скрипта, посылающего письмо
Для облегчения понимания этот пример не имеет никаких изменяемых настоек и все данные прописаны непосредственно в теле программы. Однако это не законченная программа, а всего лишь макет, демонстрирующий принципиальную возможность анонимной отправки корреспонденции.
Заголовок письма, доставленного на “[email protected]” (или по любому другому адресу) должен выглядеть приблизительно так:
· From [email protected] 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 [email protected]; Mon, 05 Jun 2000 11:51:53 +0400
· From: Kris Kaspersky
· Subject: Test
· Message-Id: <[email protected]>
· 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 [email protected] 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 [email protected]; Thu, 06 Apr 2000 10:57:30 +0400
· Received: from mail.pets.ja
· From: Kris Kaspersky
· Subject: Test
· Message-Id: <[email protected]>
· Bcc:
· Date: Thu, 06 Apr 2000 10:57:30 +0400
Получатель, скорее всего, решит, что письмо пришло с сервера mail.pets.ja, и вряд ли обратит внимание на ретрансляторы. Выявление истинного получателя можно значительно затруднить, если не класть письмо непосредственно в почтовый ящик клиента, а переслать его через несколько транзитных серверов. В этом помогут возможности управления маршрутизацией доставки сообщения, поддерживаемые SMTP‑протоколом. Если задействовать несколько десятков узлов и вставить в письмо несколько десятков подложных строк “Received”, то установить истинного отправителя сообщения станет практически невозможно, вернее сказать, нецелесообразно.
Однако грубая подделка заголовка облегчает выявление фальсифицированных полей. Основные ошибки, по которым легко узнается подлог, следующие: указанных адресов серверов вообще не существует в природе; стиль заполнения сервером поля “Received” отличается от используемого злоумышленником; реальное время пересылки писем сервером на порядок ниже (или выше), чем это следует из заголовка письма.
Поэтому, мало иметь образцы заполнения “Received” каждым из узлов – необходимо выяснить средние задержки в доставке сообщений. Еще более сложно разобраться с алгоритмом генерации идентификаторов, добавляемых большинством транзитных серверов к заголовку письма для избежания его зацикливания. Такой идентификатор уникален для каждого сервера и не может представлять абсолютно случайное значение, поскольку, в тогда бы существовала возможность повторной выдачи одного и того же идентификатора, что недопустимо.
Обеспечить уникальность помогает привязка ко времени пересылки письма. Некоторые алгоритмы генерации идентификатора позволяют его обратить и узнать время, когда он был выдан. Это позволяет выявить поддельные идентификаторы, а вместе с ними и поддельные поля в заголовке письма.
Причем по «внешнему виду» идентификатора трудно (невозможно) сказать каким образом он был получен. Для этого необходимо изучить исходные тексты сервера (если они доступны) или дизассемблировать машинный код (если исходные тексты вне досягаемости). В следующем заголовке приведены примеры двух идентификаторов. Разумеется, визуально ничего нельзя сказать о том, как они были получены:
· From [email protected] Wed Sep 06 03:00:03 2000
· Received: from lists.securityfocus.com ([207.126.127.68])
· by hearst.mail.ru with esmtp (Exim 3.14 #4)
· id 13WRh6-000LBx-00; Wed, 06 Sep 2000 02:59:57 +0400
· Received: from lists.securityfocus.com (lists.securityfocus.com [207.126.127.68])
· by lists.securityfocus.com (Postfix) with ESMTP
· id E62DC1EF74; Tue, 5 Sep 2000 15:58:34 -0700 (PDT)
· Received: from LISTS.SECURITYFOCUS.COM by LISTS.SECURITYFOCUS.COM
· (LISTSERV-TCP/IP release 1.8d) with spool id 13121453 for
· [email protected]; Tue, 5 Sep 2000 15:58:31 -0700
· Approved-By: [email protected]
Впрочем, маловероятно, чтобы получатель обладал квалификацией, достаточной для проведения анализа подобного уровня. И большинство пользователей можно ввести в заблуждение даже грубой подделкой заголовка.