Проверяем работу SMTP AUTH LOGIN через telnet |

Using authenticated smtp over tls/ssl

Most SMTP providers don’t allow plain text SMTP sessions. Only SMTP connections encrypted with TLS are allowed. You can authenticate to the SMTP server using the LOGIN and PLAIN methods only after initializing the TLS connection. Telnet doesn’t support SSL or TLS, so you need to use the OpenSSL tool to connect to the SMTP server via TLS.

Let’s look at how to use OpenSSL to connect to the SMTP server via TLS and authenticate using AUTH LOGIN.

Download and install OpenSSL:

In order to connect to the SMTP host from the command line with the SSL/TLS encryption, use the following command:

Отправка письма через telnet без авторизации:

Запускаем консоль (командную строку) и вводим последовательность команд для отправки письма:

Ниже копирую из консоли то, как я вводил команды и что получал в ответ (жирный шрифт – мои команды, курсив – ответы сервера):

Проверяем работу smtp auth login через telnet |

Проверяем работу SMTP AUTH LOGIN через telnet |Подавляющее большинство почтовых серверов не позволяют неаутентифицированным пользователям отправлять через себя письма. Open-relay сервер, т.е. сервер, позволяющий свободную пересылку почты, в интернет-сообществе считается дурным тоном, и вообще такие сервера по прошествии какого-то времени становятся источниками спама, и IP-адреса таких серверов быстро попадают в блек-листы всевозможных средств защиты от спама. В этот раз мы поговорим о том, как провести аутентификацию типа AUTH LOGIN из консоли telnet. На основании описанного способа можно запросто написать программу, которая выполняет все эти действия автоматически.

AUTH LOGIN – способ SMTP-аутентификации, в котором логин и пароль передаются в виде текста, закодированного по алгоритму Base64. Обратите внимание, что передавать свои логин и пароль таким образом далеко не безопасно! Итак, нам нужно для начала закодировать по алгоритму Base64 свой логин на почтовом сервере и пароль от него. Для этого воспользуемся языком Perl, а конкретнее – его модулем MIME::Base64.

$ perl -MMIME::Base64 -e 'print encode_base64("[email protected]");'
dXNlckBzZXJ2ZXIucnU=
$ perl -MMIME::Base64 -e 'print encode_base64("PASSWORD");'
UEFTU1dPUkQ=

Получившиеся две строки копируем куда-нибудь в буфер обмена. Теперь мы готовы к аутентификации, поэтому запускаем SMTP-сессию через telnet (жирным шрифтом помечены наши команды):

$ telnet server.ru 25
Trying 95.169.186.213...
Connected to server.ru.
Escape character is '^]'.
220 server.ru ESMTP 2022
EHLO oioki.ru
250-server.ru
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

Сервер показывает список своих возможностей, мы же выберем метод AUTH LOGIN и введем закодированные логин и пароль. Обратите внимание, что логин и пароль он спрашивает также в Base64-закодированном виде:

AUTH LOGIN
334 VXNlcm5hbWU6
dXNlckBzZXJ2ZXIucnU=
334 UGFzc3dvcmQ6
UEFTU1dPUkQ=

Ответ сервера зависит от правильности введенных логина и пароля. В случае ошибки, вы увидите что-то вроде:
535 5.7.8 Error: authentication failed: UGFzc3dvcmQ6
Если же все нормально:
235 2.7.0 Authentication successful

Собственно, теперь можно отправить письмо нужному получателю, от своего имени:

MAIL FROM: [email protected]
250 2.1.0 Ok
RCPT TO: [email protected]
250 2.1.5 Ok
DATA
354 End data with .Subject: Hello world!
This is the test message...
.
250 2.0.0 Ok: queued on  as a8b0c5d3-aCbac1dx
QUIT
221 2.0.0 Closing connection.
Connection closed by foreign host.

Семенов ю.а. (итэф-мфти)yu. semenov (itep-mipt)

Главной целью протокола simple mail transfer protocol (SMTP, RFC-821, -822) служит надежная и эффективная доставка электронных почтовых сообщений. SMTP является довольно независимой субсистемой и требует только надежного канала связи. Средой для SMTP может служить отдельная локальная сеть, система сетей или весь Интернет.

SMTP базируется на следующей модели коммуникаций: в ответ на запрос пользователя почтовая программа-отправитель устанавливает двухстороннюю связь с программой-приемником (TCP, порт 25; для безопасной версии испольузется порт 465). Получателем может быть оконечный или промежуточный адресат. SMTP-команды генерируются отправителем и посылаются получателю. На каждую команду должен быть отправлен и получен отклик.

Когда канал организован, отправитель посылает команду MAIL, идентифицирую себя. Если получатель готов к приему сообщения, он посылает положительное подтверждение. Далее отправитель посылает команду RCPT, идентифицируя получателя почтового сообщения. Если получатель может принять сообщение для оконечного адресата, он выдает снова положительное подтверждение
(схема формирования откликов помещена в приложении 10.14).

Статьи – сеть – отправка по smtp с авторизацией

1. Введение.

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

В этой статье я попытаюсь раскрыть эту проблему, простыми словами написать то, что написано в более “расплывчатом” виде в rfc, который почему-то всем лень читать. И, конечно, данная статья будет ориентирована на “низкоуровневых” программистов. Я буду писать под фасм, но думаю, что для Вас не составит особого труда переделать примеры под более удобный для Вас компилятор.

2. SMTP. Теория

Итак, теперь кратко, что такое SMTP – Simple Mail Transfer Protocol. Задача протокола – это удобная передача электронной почты. Но если не делать отступлений и не вдаваться в подробности, то это просто некоторое количество команд и “спецсимволов”, позволяющих отправлять письма. Для того, чтоб собственноручно пообщаться с сервером, можно взять обычный телнет (Пуск-Выполнить-telnet) и зайти на 25 порт сервера.

Делается это командой open smtp.servak.net 25. И ,если всё пройдёт удачно, Вы получите ответ от сервера.

Далее следует начать работу с сервером, а для этого его надо поприветствовать. так как сервер нормальных слов не понимает, сделать это надо командой
EHLO someword[CRLF].

[CRLF]=Enter=13,10 (каждая команда завершается этой последовательностью байт). После утвердительного ответа можно приступать непосредственно к отправке писем.

Задать отправителя письма можно командой MAIL FROM:<[email protected]>[CRLF],
а получателя RCPT TO:<[email protected]>[CRLF].

После того как эти параметры заданы, можно приступать к написанию письма. Для этого надо послать команду
DATA[CRLF].
Теперь то можно набрать тело письма. Чтоб завершить письмо, следует отправить последовательность вида
[CRLF].[CRLF]
на сервер. Если все пройдёт удачно, то письмо будет отправлено адресату.
Завершить работу с сервером следует командой QUIT[CRLF].

Так просто было общаться с сервером не слишком долгое время. Теперь, прежде чем отправить письмо, следует авторизироваться. Есть несколько способов авторизации, но я опишу самый простой, который поддерживается большинством SMTP-серверов. Чтоб начать авторизацию, следует послать на сервер команду
AUTH LOGIN[CRLF], но прежде убедитесь, что данный сервер поддерживает эту команду.

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

Но лучше раз увидеть, чем 100 раз услышать, поэтому я приведу пример диалога с сервером (s – server, u – user):

s:220 mail.ru ESMTP Sat, 15 Apr 2006 16:46:49  0400
u:EHLO server
s:250-mx6.mail.ru Hello server [111.11.11.111]
s:250-SIZE 10485760
s:250-8BITMIME
s:250-AUTH PLAIN LOGIN
s:250 PIPELINING
u:AUTH LOGIN
s:334 VXNlcm5hbWu6
u:dGVzdF9fXzAwMDAz
s:334 UGFzc3dvcmQ6
u:dGVzdF9fXzAwMDAz
s:235 Authentication succeeded
u:MAIL FROM:<[email protected]>
s:250 OK
u:RCPT TO:<[email protected]>
s:250 Accepted
u:DATA
s:354 Enter message, ending with "." on a line by itself
u:asdf
u:.
s:250 OK id=1FUkCk-000OR2-00
u:QUIT
s:221 mx6.mail.ru closing connection

3. SMTP. Практика.

Приступим непосредственно к практике. Напишем небольшую программку, которая будет посылать небольшое сообщение на заданный почтовый ящик с авторизацией. Я предполагаю, что Вы уже знакомы с WinSocks, и не буду на этом останавливаться.
Вы можете скачать полную версию программы, а я разъясню только ключевые моменты. А именно работу процедуры Send_Mail

proc Send_Mail pszmess,pszfrom,pszto,pszlog,pszpass,pszserv,pszsubj

pszMess – само сообщение.
pszfrom – адрес отправителя
pszto – адрес получателя
pszlog, szpass – логин и пароль для авторизации
pszserv – сервер
pszsubj – тема письма

lea ebx,[base64log]
invoke lstrlen,[pszlog]
stdcall Base64Encode, dword [pszlog],ebx,eax
add ebx,200
invoke lstrlen,[pszpass]
stdcall Base64Encode, dword [pszpass],ebx,eax

Тут шифруется логин и пароль в Base64, используется алгоритм by RT Fishel без использования алфавита.
Далее идёт работа с WinSocks

        invoke     socket,2,1,0

Создается сокет

        invoke     gethostbyname,[pszserv]
        test eax,eax
        jz cantfinds
        mov        eax,[eax 0ch]
        mov        eax,[eax]
        mov        eax,[eax]

Тут в качестве параметра gethostbyname передаётся указатель на строку с именем сервера, а потом из структуры hostent извлекается sin_addr.

mov ax,25
xchg ah,al
mov      word [saddr.sin_port], ax

Коннект на 25 порт, только нужно учитывать порядок байт.

call       get_data
test       eax,eax
jz         errrecv

После коннекта прочитаем ответ сервера.

Следует отметить, что все ответы сервера начинаются с определенного кода. Несложно увидеть, что в случае успеха код начинается либо с цифры 2, либо с 3. На этом основана проверка ошибок в процедуре get_data.

Теперь немного о вспомогательных процедурах:

sendNrecv – передаёт строку, указатель на которую следует поместить в еах, на сервер, получает ответ сервера.
Send_String – просто передает строку, адрес которой передан как параметр, на сервер.

Я не считаю, что следует рассматривать работу каждой из них, если Вы знакомы с WinSocks, то без проблем сделаете это сами.

        lea eax,[base64log]
        stdcall Send_String,eax
        mov eax,szEnd 3
        call       sendNrecv

        lea eax,[base64pass]
        stdcall Send_String,eax
        mov eax,szEnd 3
        call       sendNrecv

Отсылка логина и пароля на сервер. szEnd 3 – указатель на [CRLF]. Получается, что мы передаем строку, а после этого [CRLF] и читаем ответ. Далее все по порядку, описанному в начале статьи.

Программа отсылает строки примерно таким образом:

MAIL FROM:<
[email protected]
>[CRLF]
[читаем ответ]

RCPT TO:<
[email protected]
>[CRLF]
[читаем ответ]

DATA[CRLF]
Subject: 
SMTP work's
[CRLF]

test
[CRLF].[CRLF]
[читаем ответ]

QUIT
[ответ]

s

Чтоб передать файл, нужно в теле сообщения создать заголовок вида

Content-Type: application/octet-stream; name="file.bin"
Content-Disposition: attachment; filename="file.bin"
Content-Transfer-Encoding: base64

После чего просто передать файл, зашифрованный в Base64.

4. Заключение

Думаю, что эта статья хоть кому-нибудь пригодится. Или хотя бы облегчит жизнь, так как готовой информации для “низкоуровнего” программиста достаточно мало, а искать в интернете крохи информации и исходники, а потом в них разбираться порой нет времени, а иногда и желания.

Благодарность:

  1. Ct757 за помощь и утилиту pfcode, которая придала моему ужасному коду ровный и красивый вид.
  2. Bill Prisoner за идею написания статьи.
  3. revers я б вообще не трогал этот СМТП.

Использованная литература:

  1. Использование сокетов/взаимодействие с SMTP-сеpвеpами [Billy Belcebu/IKX, пер. Aquila]
  2. Руководство Beej по сетевому программированию, используя интернет-сокеты [Брайан “Beej” Холл, пер. varnie]
  3. INFECTED VOICE #15 – Введение … в Интернет. Диалог с SMTP сервером на Assembler
  4. Исходный код Xinch.
  5. RFC #821 #2554

Программа smtp.rar

Похожее:  Как войти в свой личный кабинет со смартфона и компьютера

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *