| Welcome to The Passion Of Code Laboratory!!! | Статьи |
Поиски свободного «почтальона Печкина» Часть 1.
Автор: _follower / TPOC СодержаниеВведение 1. Основные команды SMTP 1.1. EHLO (Расширенное HELO) 1.2. HELO (Приветствие) 1.3. MAIL (Отправитель) 1.4. RCPT (Получатель) 1.5. DATA (Текст сообщения) 1.6. QUIT (Выход) 1.7. VRFY (Проверить)
2. Ответы, предусмотренные для команд SMTP. 3. Пример диалога SMTP 4. Пример программы отсылающей письмо через заданный SMTP-сервер. 5. Команда
VRFY 6.1 Поиск доступных локальных SMTP – серверов. 6.2 Поиск доступных удаленных SMTP – серверов. 7. Использование поисковиков для нахождения серверов пересылки писем. Конечно Вы, уважаемый
читатель, скажете – да что за ерунда, все они закрыты уже года 2 назад как
мера борьбы со спамом. Но! Никто не мешает нам это нам проверить! Более
того, эта проверка не преследуется законом. ВведениеПростой протокол передачи почты – Simple Mail Transfer Protocol (SMTP) обычно используется для отправки письма от отправителя к получателю. Протокол разрабатывался в начале восьмидесятых годов прошлого века. Окончательная версия была закреплена в RFC 821 1 августа 1982 года. Все годы, прошедшие с того времени, протокол SMTP оставался одним из наиболее часто используемых протоколов семейства TCP/IP . За это время принципиально изменились многие требования, касающиеся достоверности и защищенности передаваемых сообщений, значительно увеличились средний размер сообщений, и их количество, разнообразнее стала передаваемая информация: это уже не только текстовые сообщения на английском языке – сейчас электронные письма пишутся на многих языках и могут содержать вложения самых разных типов. Однако протокол SMTP получил за время своего существования такое широкое распространение, что просто заменить его другим протоколом уже не представляется возможным. Вместо этого для него разрабатываются различные расширения ( extensions ), дополняющие возможности базового протокола. Дополненный расширениями протокол SMTP часто называют ESMTP ( Extended SMTP ). Сам протокол изменился незначительно. На смену команде HELO , использовавшейся для начала диалога, пришла команда EHLO , позволяющая работать с расширениями ESMTP . Команды, применяемые для настройки почтовых систем и для получения справочной информации о пользователях, теперь используются значительно осторожнее, чем в восьмидесятые годы. Эти команды, к сожалению, создают удобства не только для сетевых администраторов, но и для злоумышленников. Поэтому такие команды обычно используют только на этапе настройки почтовой системы. В работающей системе их, как правило, отключают. В апреле 2001 г . RFC 821 , который на сегодняшний день является основным стандартом, описывающим протокол SMTP . Новый стандарт учитывает изменения, произошедшие в Internet 'е за восемнадцать с половиной лет. SMTP может работать с различными протоколами транспортного уровня (см. RFC 821 и RFC 1090), но обычно используется TCP . За SMTP закреплен порт TCP 25. Для передачи письма не достаточно одного лишь TCP-соединения, поэтому устанавливается еще одно SMTP-соединение. Это достигается возвращением ответного приветствия сервера с указанным именем (или IP) узла клиента. Итак, клиент отсылает команду «HELO», сервер установив SMTP–соединение возвращает код успешного выполнения операции (250) и, в большинстве случае, передает IP–клиента или его доменное имя. Почта по протоколу SMTP посылается от клиента к серверу. Клиент запрашивает соединение с сервером. После успешного установления соединения сервер сообщает клиенту свое доменное имя. Он также может сообщить тип и версию установленного программного обеспечения. Однако, из соображений безопасности, чтобы не дать потенциальному взломщику воспользоваться известными ошибками данной версии сервера SMTP, передача этой информации часто блокируется системными администраторами. Ответ сервера, свидетельствующий о готовности к приему команд клиента, служит сигналом к началу диалога, в котором клиент последовательно посылает серверу команды и ожидает ответы, либо подтверждающие исполнение команд, либо сообщающих о невозможности исполнения, либо содержащих информацию, запрошенную клиентом. Серьезным недочетом протокола SMTP - есть то, что протокол не требует аутентификации пользователя перед отправкой сообщения и это позволяет использовать чужие сервера для незаконной пересылки писем. 1. Основные команды SMTPКаждая команда SMTP начинается с ключевого слова – названия команды. За ним могут следовать параметры, отделенные пробелом. Регистр символов, используемых во всех названиях команд и, за редким исключением, в параметрах базового протокола SMTP , не имеет значения. Однако в некоторых элементах расширений строчные и прописные символы могут различаться. Необходимо также учитывать, что левая часть почтового адреса, до символа @, может быть регистрозависимой. В командах допускается использование только кодировки us - ascii , то есть символов, кодируемых семью битами. Это цифры, латинские буквы, и знаки препинания. Если информация передается восьмибитными блоками (октетами), старший бит должен быть равен нулю. Корректная интерпретация символов, старший, восьмой бит которых равен единице, например, русских букв, не гарантируется, использовать такие символы не следует. Конец строк в протоколе SMTP обозначается последовательностью символов "возврат каретки" (шестнадцатеричный код 0D) и "перевод строки" (шестнадцатеричный код 0А). Эта последовательность обозначается CRLF . Сервер начинает выполнение команды только получив от клиента строку, завершающуюся последовательностью CRLF . Сервера SMTP должны принимать командные строки длинной до 512 символов. Это значение может быть увеличено по желанию разработчиков. Для серверов, поддерживающих расширения ESMTP , требующие дополнительных параметров, максимально допустимая длина командной строки увеличивается. Соответствующие требования приведены в RFC, описывающих эти расширения. Если не используется расширение, позволяющее серверу принимать несколько команд подряд, клиент передает серверу следующую команду только после получения ответа на предыдущую. Рассмотрим команды SMTP , необходимые для отправки сообщения. 1. EHLO (Расширенное HELO)Формат команды: EHLO полное_доменное_имя_клиента CRLF или EHLO адрес_отправителя CRLF Диалог клиента и сервера, как правило, начинается с приветствия. В RFC 821 в качестве приветствия предлагалась команда HELO . Однако с введением расширений ESMTP , эта команда была заменена на EHLO . Использование расширений ESMTP возможно только после выполнения команды EHLO. Передача почты возможна только после выполнения одной из двух названых команд. Другие команды, не связанные с передачей почты (NOOP, HELP, EXPN, VRFY, RSET и QUIT), в принципе могут быть исполнены и без приветствия. В качестве аргумента клиент передает серверу свое полное доменное имя, если таковое имеется. Если клиент не имеет доменного имени, например, если в качестве клиента выступает MUA , установленный на компьютере, получающем адрес динамически, то в качестве аргумента передается адрес электронной почты отправителя. Желательно, чтоб полученная от клиента информация была исчерпывающей для его идентификации. Сервер проверяет соответствие указанного клиентом в приветствии доменного имени его адресу IP . Результат проверки добавляется к заголовку письма, но диалог продолжается независимо от достоверности полученного сервером идентификатора. В ответ на команду EHLO сервер присылает список, каждая строка которого содержит ключевое слово, соответствующее расширению, поддерживаемому вызываемым сервером, и, при необходимости, уточняющие параметры. Это единственный предусмотренный базовым протоколом SMTP ответ сервера, в котором клиентская программа должна проанализировать не только числовой код ответа, но и его текст. Из ответа на команду EHLO клиент узнает, какие дополнительные функции он может использовать при отправке сообщения. Если устаревшее программное обеспечение сервера не поддерживает команду EHLO, то выдается сообщение об ошибке. В этом случае клиент должен попытаться повторить приветствие, используя команду HELO . Естественно, расширениями ESMTP уже не удастся воспользоваться. 2. HELO (Приветствие)Формат команды: HЕLO полное_доменное_имя_клиента CRLF или HЕLO адрес_отправителя CRLF RFC 2821 рекомендует использовать команду HELO , только если программное обеспечение не поддерживает команду EHLO. Отличие этой команды только в том, что она делает невозможным использование расширений ESMTP . В ответ на эту команду сервер сообщает, готов ли он к продолжению диалога. 3. MAIL (Отправитель)Формат команды: MAIL FROM : адрес_отправителя дополнительные_параметры CRLF Отправка электронного сообщения невозможна без успешного выполнения этой команды, для каждого письма команда MAIL должна быть выполнена только один раз. Команда MAIL может быть выполнена только после успешного выполнения команды EHLO или HELO. С помощью этой команды серверу сообщается адрес отправителя письма. На этот адрес письмо должно вернуться в случае невозможности доставки. Если возврат не желателен, адрес может быть оставлен пустым: <>: MAIL FROM : <> CRLF Обычно это бывает, если отправляемое сообщение уже и есть возвращаемое письмо. Это делается для того, чтобы избежать петли: письмо не может быть доставлено адресату и возвращается отправителю, но, если оно не может быть доставлено отправителю, то посылается обратно и так далее. Если же адрес отправителя не известен, то попытки вернуть его предприниматься не будут: в случае невозможности доставки получателю, письмо будет удалено. Поскольку базовый протокол SMTP не предусматривает никакой авторизации отправителя, адрес отправителя может быть указан произвольно и не может считаться достоверным. В последние годы большинство MTA проверяют существование почтового домена отправителя и отвергают сообщения с адресами отправителей в несуществующих доменах. К сожалению, более детальная проверка возможна только при использовании дополнительных средств авторизации и обычно не применяется. Базовый протокол SMTP не предусматривает дополнительных параметров для команды MAIL, но такие параметры использует ряд расширений ESMTP . 4. RCPT (Получатель)Формат команды: RCPT TO: адрес_получателя дополнительные_параметры CRLF Доставка сообщения возможна, только если указан хотя бы один доступный адрес получателя. Команда RCPT принимает в качестве аргумента только один адрес. Если нужно послать письмо большему числу адресатов, то команду RCPT следует повторять для каждого. Согласно RFC 2821, сервера SMTP должны быть готовы принять до ста команд RCPT на одно сообщение. Если письмо адресовано большему числу получателей, то для оставшихся клиент должен передать сообщение повторно. Максимальное число получателей может быть изменено администратором. Команда RCPT может быть выполнена только после успешного выполнения команды MAIL. Сервер анализирует каждый адрес и после каждой команды RCPT выдает сообщение, свидетельствующее о возможности или невозможности доставки письма по указанному адресу. При возникновении потребности в отправке одного и того же сообщения нескольким получателям достаточно вызвать «RCPT TO» еще один (или более) раз (максимальное количество получателей, как правило, не ограничено). Если кому либо из них сервер не возьмется доставлять сообщение, он вернет ошибку, что никак не скажется на остальных получателях. Базовый протокол SMTP не предусматривает дополнительных параметров для команды RCPT, но такие параметры использует ряд расширений ESMTP . 5. DATA (Текст сообщения)Формат команды: DATA CRLF C помощью этой команды серверу передается текст сообщения, состоящий из заголовка и отделенного от него пустой строкой тела сообщения. Команда DATA может быть выполнена только после успешного выполнения хотя бы одной команды RCPT. Команда DATA не требует никаких параметров и завершается последовательностью CRLF. В ответ на правильно введенную команду DATA сервер сообщает о готовности к приему или об ошибке, если прием сообщения невозможен. В случае положительного ответа сервера, клиент передает сообщение. Передача заканчивается строкой, состоящей из одной точки. Эта строка не является частью сообщения и удаляется на приемной стороне. Чтобы исключить ложное срабатывание в случае, если сообщение содержит строку, состоящую из одной точки, на передающей стороне к началу каждой строки, начинающейся с точки, добавляется еще одна точка. На приемной стороне добавленные точки удаляются. Распознав окончание сообщения, сервер должен принять решение о возможности или невозможности доставки и послать соответствующий ответ клиенту. Сделать это следует как можно быстрее, если нет явных свидетельств невозможности доставки сообщения, его рекомендуется принять, сообщив клиенту об успешном завершении операции. Если доставка в последствии окажется, невозможна, следует просто отправить письмо обратно, сообщив в квитанции причину отказа. Это делается для того, чтобы избежать проблемы, описанной в RFC1047 : не дождавшись ответа сервера, клиент разрывает соединение, считая передачу закончившейся неудачей, хотя сервер, возможно, позже осуществил доставку. Через некоторое время клиент снова пытается послать то же самое сообщение, что может привести к многократной передаче одного и того же письма. На ожидание ответа после завершения отправки сообщения рекомендуется выделять не меньше десяти минут. На ожидание других ответов отводятся от двух до пяти минут. Необходимо принимать строки сообщения длиной до 1000 символов, включая последовательность CRLF, но не включая точку, добавляемую в начало строки во избежание ложного обнаружения конца сообщения. Минимальный размер письма, которое должен принимать сервер SMTP – 64 килобайта, включая как тело сообщения, так и его заголовок. 6. QUIT (Выход)Формат команды: QUIT CRLF Командой QUIT клиент заканчивает диалог с сервером. Сервер посылает подтверждение и закрывает соединение. Получив это подтверждение, клиент тоже прекращает связь. Перечисленных команд вполне достаточно для того, чтобы передать сообщение. Однако RFC 2821 предусматривает еще ряд команд, которые могут быть использованы в основном в процессе отладки сервера. 7. VRFY (Проверить)Формат команд: VRFY адрес CRLF Команда VRFY используется для проверки наличия указанного в качестве аргумента почтового ящика. В ответ сервер посылает информацию о владельце ящика или сообщение об ошибке, свидетельствующее о том, что указанный ящик не существует. Если указанный адрес указывает на несколько почтовых ящиков, команда VRFY возвращает список пользователей, внесенных в соответствующую рассылку, либо сообщение об ошибке, свидетельствующее о неоднозначности ответа на полученный запрос. Для получения адресов, внесенных в список рассылки, используется команда EXPN . Используя эти команду, злоумышленники могут получить список адресов пользователей сервера. Обе команды могут быть полезны в процессе отладки сервера, потому они, как правило, поддерживаются. Но на серверах, используемых в реальном окружении, их обычно отключают. Возможен также вариант, при котором вызов команд возможен, но они проверяют только синтаксическую верность адреса. Согласно RFC 821 , команды VRFY и EXPN не являются обязательными. Поэтому, если сервер их поддерживает, они должны быть перечислены в ответе сервера на команду EHLO, как расширения ESMTP. 2. Ответы, предусмотренные для команд SMTP
Таблица 1 * В случае переадресации почты допускается также использование ответа 250. В этом случае клиент о переадресации не информируется. Сервер может также отказать в приеме почты для уже не существующего пользователя и послать ответ 551 с указанием нового адреса или ответ 550. 3. Пример диалога SMTPРассмотрим пример диалога по протоколу SMTP. В этом и в последующих примерах команды клиента помечены буквой C , а ответы сервера – буквой S.
Таблица 2 4. Программы отсылающей письмо через заданный SMTP-сервер.
Рассмотрим пример программы, которая отсылает письмо от определенного
е-mail-ом отправителя к определенному e-mail – ом получателю через
определенный IP–адресом SMTP – сервер. Для наглядности в
работе с программой необходимо подключение к линии Интернет. Так же мы
локально установим MDaemon v.6.7. в тестовом режиме. Этот SMTP-шник,
на мой взгляд, удобно отражает диалог с клиентом.
Обратите внимание на эту
последовательность строк. После каждой строки стоит последовательность 0dh,0ah.
Дело в том что SMTP- сервер реагирует именно на эту последовательность от
клиента для своего отклика. Проще говоря, именно после этой последовательности
сервер что–то шлет в ответ клиенту. Поэтому, если поступать строго, эти три
строки нужно было слать по очереди и по очереди отображать ответ сервера.
После выполнения функции connect() мы в
данном случае считываем ответ сервера без отображения. Это просто для того чтобы
вычистить (… вычитать, выбрать, вытереть … как кто хочет :) )буфер приема от
сервера. После отработки функции send() мы отражаем ответ от сервера. Поэтому
используем функцию revlp(). К чему это все? К тому, что лучше вычитывать все,
что шлет нам сервер.
Рассматривая этот кусок кода Вы наверняка вспомните Таблицу 2 так как в ней как раз отображена последовательность команд выдержанная в этом куске кода.
После себя нужно чистить все. Вот и
почистим все после себя. Чистка буферов очень важна, это помогает избежать
множества ошибок. Нужно чистить все что только можно, пусть все промежуточные
хранилища всегда будут чистыми. Проанализируем результаты. Запустим программку с адресом IP локального SMTP-сервера компании.
Первая строка кажется разорванной, то есть сервер вернул на самом деле:
Если заменить нашу функцию функцией, которая вместо ‘0Ah0Dh’ подставить ‘..’,
то получим…
Посмотрите на ответы других SMTP -серверов. Кстати а письмо – то переслано !!! Вот Вам и ненастроенный PostFix… www.e-mail.ru [195.161.118.50]
… чей то буржуйский SMTP шник [66.70.133.170]
luke.region3.ang.af.mil [132.50.241.246]
Теперь установим себе MDaemon v.6.7. Доменным именем своим указав mail.ru.
Создадим некоего пользователя с именем www@mail.ru и будем с ним работать.
Этот MDaemon не пропустил неизвестного
пользователя, сказал:
:)) А не настроенный PostFix, если помните, на пересылку согласился. Вот так, а Вы говорите что программы под Windows – плохие, вот Вам пример – поставил и не думаешь. «Вот, вот, не думаешь …» - возмутятся юниксоиды. Только хочется спросить - кто сейчас за эти знания в России платит ? Есть SMTP–шник ? есть , работает ? - работает ! все , гуд ! И никому не важно на чем он. Ну это мы влезли в другую степь, извините за отступление. Итак, что мы имеем. Письмо переслал только не отстроенный PostFix ( юниксовый почтовик под FreeBSD). Но мы еще не закончили , и поможем «своему горю» в следующих статьях. При следующей встрече мы посмотрим, как поработать с командой VRFY. По крайней мере, мне было интересно, надеюсь Вам, уважаемый читатель, будет то же. До свиданья. Исходник
| Наши новостиНовые события из жизни нашей лаборатории СтатьиСтатьи и переводы лаборатории TPOC ПрограммыПрограммы лаборатории TPOC РелизыЗдесь мы сообщаем Вам, какие творения скоро появятся СсылкиСсылки на сайты, где можно найти больше информации Наша лабораторияИстория нашей лаборатории и ее члены |
| У вас есть предложения по нашему сайту? Напишите сюда | Любимые сайты вирмейкеров: (WASM) (RSDN) |