SMTP - Simple Mail Transfer Protocol

邮件传输协议

SMTP Introduce

简单邮件传输协议Simple Mail Transfer Protocol (SMTP) 是一种在 IP 网络中发送电子邮件的协议。它可在电子邮件客户端和外发邮件服务器之间或两个 SMTP 服务器之间使用。SMTP 通常与 IMAP 或 POP3 协议结合使用,后者可以获取邮件和发送邮件。尽管 SMTP 可在客户端和服务器之间或两个 SMTP 服务器之间使用,但原则上它是一种基于客户端-服务器的协议。在这种情况下,服务器实际上充当了客户机的角色。

默认情况下,SMTP 服务器通过 25 端口接受连接请求。不过,较新的 SMTP 服务器也使用其他端口,如 TCP 587 端口。该端口用于接收来自已验证用户/服务器的邮件,通常使用 STARTTLS 命令将现有的明文连接转换为加密连接。身份验证数据受到保护,在网络上不再以明文形式显示。在连接开始时,客户端通过用户名和密码确认身份,从而进行身份验证。然后就可以传输电子邮件了。为此,客户端向服务器发送发件人和收件人地址、电子邮件内容以及其他信息和参数。电子邮件传送完毕后,连接再次终止。然后,电子邮件服务器开始向另一个 SMTP 服务器发送电子邮件。

SMTP 在不采取进一步措施的情况下以非加密方式工作,并以纯文本方式传输所有命令、数据或验证信息。为防止未经授权读取数据,SMTP 与 SSL/TLS 加密结合使用。在某些情况下,服务器使用标准 TCP 端口 25 以外的端口进行加密连接,例如 TCP 端口 465

SMTP 服务器的一个基本功能是利用只允许授权用户发送电子邮件的验证机制来防止垃圾邮件。为此,大多数现代 SMTP 服务器都支持 SMTP-Auth 协议Extended ESMTP。发送电子邮件后,SMTP 客户端(也称为Mail User Agent (MUA))会将其转换为标题和正文,并上传到 SMTP 服务器。服务器上有一个所谓的Mail Transfer Agent (MTA),它是收发电子邮件的软件基础。MTA 检查电子邮件的大小和垃圾邮件,然后将其存储起来。为了减轻 MTA 的工作,偶尔会在 MTA 之前安装一个Mail Submission Agent (MSA),负责检查电子邮件的有效性,即电子邮件的来源。这种 MSA 也称为中继(Relay)服务器。这些服务器在后面的内容中非常重要,因为由于配置不正确,许多 SMTP 服务器都可能受到所谓的 "开放式中继攻击(Open Relay Attack)"。我们稍后将讨论这种攻击以及如何识别其弱点。然后,MTA 会在 DNS 中搜索收件人邮件服务器的 IP 地址。

到达目的地 SMTP 服务器后,数据包被重新组装成一封完整的电子邮件。然后,Mail delivery agent (MDA)将其传送到收件人的邮箱。

客户端 (MUA) ➞ 提交代理 (MSA) ➞ 开放中继 (MTA) ➞ 邮件发送代理 (MDA) ➞ 邮箱 (POP3/IMAP)

但 SMTP 有两个网络协议固有的缺点。

  1. 第一个是使用 SMTP 发送电子邮件不会返回可用的送达确认。尽管协议规范提供了此类通知,但默认情况下未指定其格式,因此通常仅返回英语错误消息,包括未送达消息的标头。

  2. 建立连接时不会对用户进行身份验证,因此电子邮件的发件人不可靠。因此,开放 SMTP 中继经常被滥用来批量发送垃圾邮件。发起者使用任意虚假发件人地址来达到不被追踪的目的(邮件欺骗)。如今,许多不同的安全技术被用来防止 SMTP 服务器的滥用。例如,可疑电子邮件被拒绝或移至隔离区(垃圾邮件文件夹)。例如,负责此操作的是识别协议DomainKeys (DKIM), the Sender Policy Framework (SPF).

为此,我们开发了一种 SMTP 扩展程序,称为Extended SMTP( ESMTP)。人们在谈论 SMTP 时,通常指的是 ESMTP。ESMTP 使用 TLS,在 EHLO命令之后发送 STARTTLS 即可。这将初始化受 SSL 保护的 SMTP 连接,从这一刻起,整个连接都将加密,因此或多或少都是安全的。现在,用于身份验证的AUTH PLAIN扩展也可以安全使用了。

Default Configuration

AcesMin@htb[/htb]$ cat /etc/postfix/main.cf | grep -v "#" | sed -r "/^\s*$/d"

smtpd_banner = ESMTP Server 
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 2
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
myhostname = mail1.inlanefreight.htb
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
smtp_generic_maps = hash:/etc/postfix/generic
mydestination = $myhostname, localhost 
masquerade_domains = $myhostname
mynetworks = 127.0.0.0/8 10.129.0.0/16
mailbox_size_limit = 0
recipient_delimiter = +
smtp_bind_address = 0.0.0.0
inet_protocols = ipv4
smtpd_helo_restrictions = reject_invalid_hostname
home_mailbox = /home/postfix

发送和通信也是通过特殊命令完成的,这些命令使 SMTP 服务器执行用户需要的操作。

命令

描述

AUTH PLAIN

AUTH 是用于验证客户端身份的服务扩展。

HELO

客户端使用其计算机名登录并启动会话。

MAIL FROM

客户命名电子邮件发件人。

RCPT TO

客户命名电子邮件收件人。

DATA

客户端发起电子邮件的传输。

RSET

客户端中止发起的传输,但保持客户端和服务器之间的连接。

VRFY

客户端检查邮箱是否可用于消息传输。

EXPN

客户端还会检查邮箱是否可用于使用此命令发送消息。

NOOP

客户端向服务器请求响应,以防止因超时而断开连接。

QUIT

客户端终止会话。

Telnet - HELO/EHLO

为了与 SMTP 服务器交互,我们可以使用该telnet工具初始化与 SMTP 服务器的 TCP 连接。会话的实际初始化是使用上面提到的命令完成的,HELO或者EHLO

Telnet - VRFY

VRFY 命令可用于枚举系统中的现有用户。但是,这并不总是有效。根据 SMTP 服务器的配置,SMTP 服务器可能会发出代码 252 并确认系统中不存在的用户。所有 SMTP 响应代码的列表可在此处找到。

因此,永远不应该完全依赖自动化工具的结果。毕竟,它们执行预先配置的命令,但没有一个函数明确说明管理员如何配置测试服务器。

有时,我们可能需要通过网络代理服务器来工作。我们也可以让网络代理服务器连接到 SMTP 服务器。我们发送的命令如下connect 10.129.14.128:25 http/1.0

Send an Email

我们在命令行中输入的所有发送电子邮件的命令,在 Thunderbird、Gmail、Outlook 等所有电子邮件客户端程序中都能找到。我们可以指定邮件主题、收件人、抄送、密送以及要与他人分享的信息。当然,在命令行中也可以这样做。

邮件头是电子邮件中大量有趣信息的载体。除其他外,它还提供有关发件人和收件人、发送和到达时间、电子邮件途中经过的站点、邮件内容和格式以及发件人和收件人的信息。

其中有些信息是必须提供的,如发件人信息和电子邮件的创建时间。其他信息则是可选的。不过,电子邮件标头并不包含技术传送所需的任何信息。它是作为传输协议的一部分进行传输的。发件人和收件人都可以访问电子邮件的标题,尽管一眼看不到。RFC5322 规定了电子邮件标头的结构。

Dangerous Settings

为防止发送的电子邮件被垃圾邮件过滤器过滤而无法送达收件人,发件人可以使用收件人信任的中继服务器。中继服务器是一个已知并通过所有其他服务器验证的 SMTP 服务器。通常情况下,发件人在使用中继服务器之前必须向其进行身份验证。

管理员往往不知道他们必须允许哪些 IP 范围。这会导致 SMTP 服务器配置错误,我们在外部和内部渗透测试中经常会发现这种情况。因此,他们允许所有 IP 地址,以免造成电子邮件流量错误,从而避免干扰或无意中断与潜在客户和现有客户的通信。

Open Relay Configuration

通过这种设置,该 SMTP 服务器可以发送伪造电子邮件,从而初始化多方之间的通信。另一种攻击方式是伪造电子邮件并读取它。

Footprinting the Service

默认的 Nmap 脚本包括smtp-commands,它使用该EHLO命令列出可以在目标 SMTP 服务器上执行的所有可能的命令。

但是,我们还可以使用smtp-open-relay NSE 脚本通过 16 种不同的测试将目标 SMTP 服务器识别为开放中继。如果我们还详细打印出扫描的输出,我们还可以看到脚本正在运行哪些测试。

Nmap - Open Relay

最后更新于

这有帮助吗?