Анализ почтового трафика при помощи tshark. Расшифровка SSL/TLS
При необходимости более сложной диагностики в том случае, когда журналы не дают достаточно информации о проблемах в работе сервера или клиента, можно использовать tcpdump/wireshark для анализа непосредственно самой сессии между клиентом и сервером. Как в реальном времени, так и сохранив дамп сессии для последующего анализа. Для быстрого анализа удобно использовать консольный вариант wireshark — tshark. Для его работы потребуются права root.
Tshark предоставляет информацию в понятном виде и в использовании довольно прост.
Почтовые порты
Основные порты, использующиеся в работе почтовых серверов по RFC (документы, регламентирующие работу сети интернет и ее основных компонентов):
Введение
В сети достаточно материалов по отдельным пунктам, но все разбросано по разным местам и, когда возникает необходимость выполнить ту или иную операцию, приходится по разным ресурсам вспоминать нюансы авторизации, способы быстрой кодировки в base64, ключи к openssl и tshark. Здесь все собрано вместе, а также добавлена информация о дешифровке SSL/TLS трафика.
«ошибка smtp: не удалось аутентифицировать» в phpmailer
Я использую PHPMailer в простой скрипт для отправки электронной почты через Gmail, и я получаю «Неизвестную ошибку» (по крайней мере, для меня!):
Ошибка SMTP: не удалось выполнить проверку подлинности. Ошибка: Ошибка SMTP: не удалось выполнить проверку подлинности.
Примеры сессий
Здесь приведены примеры сессий по SMTP/IMAP/POP3 протоколам. Для соединения используется клиент телнет, который либо в системе установлен по-умолчанию, либо устанавливается из репозиториев:
Проверка авторизации на сервере
Существующие способы авторизации: LOGIN, PLAIN, CRAM-MD5, DIGEST-MD5, GSSAPI, NTLM/MSN, EXTERNAL. Перечень их еще шире, мы же рассмотрим только наиболее распространенные, а именно LOGIN, PLAIN и CRAM-MD5.
В первую очередь необходимо узнать список методов, поддерживаемых сервером. Для каждого из почтовых протоколов есть команды, позволяющие получить эти данные наряду с другой информацией о доступных расширениях протокола. Обратите внимание, что в зависимости от настроек почтового сервера, LOGIN и PLAIN, передающие данные в открытом виде, могут быть недоступны без предварительной инициализации шифрования через SSL/TLS
Итак, вывод доступных способов авторизации:
Проверка шифрования SSL/TLS.
Для шифрования трафика в почтовых протоколах между клиентом и сервером используется SSL/TLS в двух вариантах. Использование специальных портов, при соединении с которым сначала осуществляется установка SSL/TLS, после чего уже поверх него идет обычный почтовый трафик.
Для проверки работы почтового сервера поверх SSL/TLS можно использовать утилиту openssl, дальше действуя, как при обычной сессии через telnet.
Ссылки на материалы
Удачи в решении почтовых проблем!
Cram-md5
В отличии от предыдущих способов авторизации CRAM-MD5 пароль не передается в открытом виде, вместо этого используется сравнение хэшей. Ручная проверка этого способа авторизации может быть проблемой, так как нужно будет выполнить несколько преобразований, а время на введение команд ограничено.
Для скрипта понадобится дополнительный модуль perl «Digest-HMAC». В Debian/Ubuntu его можно найти и установить следующим образом:
# apt-cache search perl | grep -i digest
# apt-get install libdigest-hmac-perlДля RHEL/CentOS/Fedora:
# yum search perl | grep -i digest
# yum install perl-Digest-HMAC
В тех дистрибутивах, в чьих репозиториях нет этого пакета (что маловероятно), можно использовать установку модуля из CPAN.
Скрипт и пример сессии с его использованием:
Cпособы конвертации текста в и из base64
Авторизация предполагает обмен строками, закодированными в base64. Для Linux cуществует много утилит для конвертации в base64 и обратно. Мы укажем несколько, включая способ их запуска. Для Windows можно использовать кроссплатформенные perl, python, php, по ним также будут привидены примеры.
Debian/ubuntu
# apt-cache search telnet
# apt-get install telnetJoomla smtp connect failed
Ошибка вида «joomla smtp connect failed» зачастую вызвана неправильным заполнением поля «SMTP Security». В этом случае необходимо уточнить, как их рекомендует заполнять ваш почтовый сервер.
Perl (perl)
Модуль MMIME::Base64 стандартно идет в комплекте.
$ perl -MMIME::Base64 -e 'print encode_base64("testtesttestpass")'
dGVzdAB0ZXN0AHRlc3RwYXNz
$ perl -MMIME::Base64 -e 'print decode_base64("dGVzdAB0ZXN0AHRlc3RwYXNz")'
testtesttestpassRe: проблема сбора почты с yandex
Сообщение alegator2222 » 05 окт 2022, 10:15
Rhel/centos/fedora
# yum search telnet
# yum install telnetВводимые команды в тексте выделены жирным шрифтом.
Uueencode/uudecode (sharutils)
$ printf 'testtesttestpass' | uuencode -m -
begin-base64 644 -
dGVzdAB0ZXN0AHRlc3RwYXNz
====Чтобы раскодировать, потребуется добавить первую и последнюю строку. Это можно сделать, например, следующими способами;
printf 'begin-base64 644 -ndGVzdAB0ZXN0AHRlc3RwYXNzn====' | uudecodeили
$ uudecode<<EOF
begin-base64 644 -
dGVzdAB0ZXN0AHRlc3RwYXNz
====
EOFАутентификация на smtp сервере из командной строки telnet
Для аутентификации на SMTP сервере через telnet в его настройках должна быть разрешена Basic Authentication. Basic Authentication обычно включена по-умолчанию на серверах Exchange в корпоративной сети. Такой тип аутентификации предполагает отправку имени и пароля пользователя по сети в закодированном виде по алгоритму base64.
В Exchange Server вы можете включить/отключить базовую аутентификацию в настройках принимающего коннектора.
Можно включить базовую аутентификацию из консоли PowerShell (нужно установить EMS на компьютер или подключиться к Exchange Server удаленно):
Get-ReceiveConnector «ConnectorName» | Set-ReceiveConnector -AuthMechanism Tls, Integrated, BasicAuth, ExchangeServer
Для аутентификации на SMTP сервере через AUTH LOGIN, нужно преобразовать в формат Base64 имя и пароль пользователя, из-под которого будет отправляться письмо. Для преобразования данных в Base64 можно воспользоваться функцией PowerShell:
Выполняем smtp аутентификацию через tls/ssl
Большинство SMTP провайдеров не разрешают подключение к серверу в открытом виде. Разрешаются только SMTP подключения, зашифрованные с помощью TLS. Только после этого можно выполнить аутентификацию с помощью методов LOGIN и PLAIN. Telnet не поддерживает SSL или TLS, поэтому для подключению к SMTP серверу по TLS нужно использовать утилиту OpenSSL.
Рассмотрим, как подключиться к SMTP серверу через TLS и выполнить аутентификацию с помощью OpenSSL.
Используемые и рекомендуемые утилиты
В статье используются telnet, openssl, tshark. Для наглядности взаимодействия сервера и клиента, использования команд протокола. На регулярной основе и для автоматизации каких-то процессов можно использовать утилиты, которые скрывают от нас все эти детали, но которые проще включаются в скрипты. Из таких утилит могу порекомендовать скрипт на perl
smtp-cli
Команда 001 capability
Какие-то почтовые сервера могут выводить эту информацию в «приветствии сервера», например dovecot.
$ telnet 127.0.0.1 143
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN AUTH=DIGEST-MD5 AUTH=CRAM-MD5] Dovecot ready.001 CAPABILITY* CAPABILITY IMAP4rev1 LITERAL SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS XEXEC QUOTA STARTTLS AUTH=PLAIN AUTH=LOGIN AUTH=DIGEST-MD5 AUTH=CRAM-MD5 001 OK Capability completed.002 LOGOUT* BYE Logging out
002 OK Logout completed.
Connection closed by foreign host.Команда ehlo domainname
$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 mailserver ESMTP ready.EHLO localhost.localdomain250-mal.server.net
250-PIPELINING
250-SIZE 104857600
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-ENHANCEDSTATUSCODES
250 8BITMIME
^]
telnet> quit
Connection closed.Обозначения
$ — приглашение в обычном шелле, указанная после него команда выполняется от обычного пользователя
# — приглашение в рутовом шелле, указанная после него команда выполняется с правами администратора
## — строка с комментарием
Запрос клиента в почтовых сессиях выделен жирным шрифтом.
Ошибка smtp не удалось пройти авторизацию
Если отправка сообщений через SMTP не удается, SMTP сервер сообщает код ошибки, по нему можно определить, в чем проблема и как ее исправить. Наиболее распространенные ошибки указаны в списке ниже.
Протокол imap
$ telnet 127.0.0.1 143
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN AUTH=DIGEST-MD5 AUTH=CRAM-MD5] Dovecot ready.01 AUTHENTICATE CRAM-MD5 PDgxOTAyMjA2NTYwNzcyMzEuMTQxNDc5NzA3MkBtYWlsLnNlcnZlci5uZXQ dGVzdCA1YTZlNjYwMDlmZGJlZWNjYWRlNDY5M2FlMjU5YTA2ZQ==01 OK [CAPABILITY IMAP4rev1 LITERAL SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS XEXEC QUOTA] Logged in02 LOGOUT* BYE Logging out
02 OK Logout completed.
Connection closed by foreign host.
# ./md5cram.pl test testpass PDgxOTAyMjA2NTYwNzcyMzEuMTQxNDc5NzA3MkBtYWlsLnNlcnZlci5uZXQ
dGVzdCA1YTZlNjYwMDlmZGJlZWNjYWRlNDY5M2FlMjU5YTA2ZQ==Протокол smtp
$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 mail.server.net ESMTP ServerEHLO client.server.net250-mail.server.net Hello client.server.net
250-AUTH LOGIN PLAIN CRAM-MD5 DIGEST-MD5 GSSAPI
250-ENHANCEDSTATUSCODES
250 STARTTLSAUTH LOGIN334 VXNlcm5hbWU6dGVzdA==334 UGFzc3dvcmQ6dGVzdHBhc3M=235 2.7.0 Authentication successfulQUIT221 2.0.0 ByeСтатьи — сеть — отправка по 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:<e-mail@server.ext>[CRLF],
а получателя RCPT TO:<e-mail@server.ext>[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:<test___00003@mail.ru> s:250 OK u:RCPT TO:<test___00003@mail.ru> 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:< adres@mail.ru >[CRLF] [читаем ответ] RCPT TO:< adres@mail.ru >[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. Заключение
Думаю, что эта статья хоть кому-нибудь пригодится. Или хотя бы облегчит жизнь, так как готовой информации для «низкоуровнего» программиста достаточно мало, а искать в интернете крохи информации и исходники, а потом в них разбираться порой нет времени, а иногда и желания.
Благодарность:
- Ct757 за помощь и утилиту pfcode, которая придала моему ужасному коду ровный и красивый вид.
- Bill Prisoner за идею написания статьи.
- revers я б вообще не трогал этот СМТП.
Использованная литература:
- Использование сокетов/взаимодействие с SMTP-сеpвеpами [Billy Belcebu/IKX, пер. Aquila]
- Руководство Beej по сетевому программированию, используя интернет-сокеты [Брайан «Beej» Холл, пер. varnie]
- INFECTED VOICE #15 — Введение … в Интернет. Диалог с SMTP сервером на Assembler
- Исходный код Xinch.
- RFC #821 #2554
Программа smtp.rar
Тестирование отправки писем через smtp в office 365
В конце октября 2020 Microsoft запретила использовать basic authentication для подключения к почтовым ящикам. SMTP Auth к серверам в Office 365 (Microsoft 365/ Exchange Online) все еще поддерживается, но считается небезопасной. Microsoft отключила SMTP AUTH для новых тенантов. Это означает, что вы не сможете подключиться к SMTP хостам в Office 365 из командной строки telnet или openssl.
Для отправки письма через SMTP сервера в Office 365 нужно использовать PowerShell командлет Send-MailMessage.
https://www.youtube.com/watch?v=subscribe_widget
$MailMessage = @{To = $emailtoFrom = $emailfromSubject = «Test email O365″Body = «Some text»Smtpserver = $smtpserver#ErrorAction = «SilentlyContinue»Port=»587»}Send-MailMessage @MailMessage -UseSsl -Credential $cred
Вход в личный кабинет