-- 使用 --
邮件介绍
- MX记录(Mail Exchange Record): 用于在邮件发送到某域名时, 将域名指向 邮件服务器地址
- A记录(Address Record): 用于将域名解析到服务器的IP地址
- SPF记录(Sender Policy Framework): 声明哪些服务器有权以该域名发送邮件
许多正规的邮件厂商接收邮件后 都会检测邮件的来源与SPF记录, 来判断是否为钓鱼邮件
如某邮件的寄件人为test@test.cn
, 来源ip为100.100.100.100 ,
厂商收到后会查询test.cn域名的SPF记录, 查看是否包含100.100.100.100, 若不包含, 判定为垃圾邮件 - DKIM记录: 用于检测邮件在发送过程中是否被篡改 (需自行配置以达成以下功能)
发件服务器生成一对公私钥, 公钥发布在发件服务器域名的DNS中, 私钥用于对邮件头部和内容进行加密签名, 收件服务器收到邮件后, 提取公钥解密签名, 对比邮件内容是否一致, 一致则通过验证 - DMARC记录: 明确告知收件服务器如何处理未通过 SPF/DKIM 验证的邮件(如拒收、隔离或放行),同时收集认证数据以优化策略
- 注: MX记录 A记录 SPF记录 DKIM记录 DMARC记录 都是关键的DNS配置,
其中SPF/DKIM/DMARC 一般在TXT记录中设置
SMTP流程
- SMTP连接建立
- 客户端连接服务器的25端口(默认的SMTP端口),
服务器返回220 (表示服务已就绪) - 客户端发送
HELO <身份>
或EHLO <身份>
,
告知服务器使用者身份, 用于标识连接来源 (通常为使用者 域名/主机名)
服务器返回250(表示命令成功), 并显示 服务器的完整域名(即配置项中的hostname)
(用EHLO还会列出SMTP服务支持的扩展功能)
- 客户端连接服务器的25端口(默认的SMTP端口),
- 邮箱发送
- 客户端发送
MAIL FROM:<指定发件人邮箱>
,
服务端返回250(表示命令成功) - 客户端发送
RCPT TO:<指定收件人邮箱>
,
服务端会根据权限配置呈现不同的回显 - 认证(可选): 客户端发送
AUTH <认证方式>
后, 可输入账户和密码进行登录
服务端支持的验证方式可通过使用EHLO
时的回显来知晓, 常见的有LOGIN(base64), PLAIN(明文) - 客户端发送
DATA
, 表示开始输入邮件内容,
服务端返回354(表示开始邮件输入) - 客户端发送 邮件内容(其中用单独一行的句点代表输入结束),
服务端返回250(表示邮件接收成功) - 服务端会判断邮件是否为本地,
若为本地, 直接发送到本地系统用户的邮箱中(/var/mail中)
若非本地, 则中继转发到目标域名中(也叫发送中继邮件)
- 客户端发送
- 连接关闭: 客户端发送
QUIT
, 服务端返回状态码221(表示连接已关闭)
基础
- 邮件头: 邮件头都是邮件自身的内容(相当于元信息), 不会影响邮件发送过程, 只影响接收后的解析
FROM: <邮件显示的发送者>
TO: <邮件显示的接收者>
Subject: <邮件的主题/标题>
Date: <邮件的发送时间>
Cc: <邮件的抄送接收者>
Bcc: <邮件的密送接收者>
Reply-To: <回复邮件时使用的地址>
Importance: <邮件的重要性级别>
MIME-Version: <邮件的MIME版本>
Content-Type: <邮件正文内容的类型及编码方式>
Content-Disposition: <邮件附件的处理方式>
Message-ID: <邮件的唯一标识符>
In-Reply-To: <针对哪封邮件进行回复的标识符>
References: <相关邮件的标识符列表>
Return-Path: <邮件的退回地址>
X-Priority: <邮件的优先级>
- 配置文件配置项 ( /etc/postfix/main.cf )
.mydomain =
定义邮件服务器的主域名
(通常是myhostname的父域名, 若未设置该配置项, 自动截取myhostname中第一个.
后的部分)
.relay_domains =
定义允许中继转发的中继域名 (若无该配置项, 则默认允许允许所有域名中继转发)
myhostname = kali.localdomain
定义邮件服务器的完整域名
myorigin = $myhostname
定义外发邮件的默认域名(发件人地址@后部分, 未填写则自动用该值)
inet_interfaces = all
设置监听的ip ( all代表监听所有 )
mydestination = $myhostname, localhost
声明哪些邮箱后缀被认定为本地邮件
smtpd_banner = $myhostname ESMTP $mail_name (Debian)
定义连接到smtp服务后的欢迎语
mynetworks = 127.0.0.0/8
定义允许直接投递邮件(无需认证)的客户端IP范围
(mynetworks配置项本身并无作用, 只有再被smtpd_relay_restrictions和smtpd_relay_restrictions配置项中用permit_mynetworks引用时才有作用) - 认证配置
.smtpd_sasl_auth_enable = yes
是否开启SASL认证功能
.smtpd_sasl_security_options = noanonymous
.broken_sasl_auth_clients = yes
- 权限配置
配置项:smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
作用: 配置 发送中继邮件 的权限规则- .
smtpd_recipient_restrictions =
作用: 配置 发送本地文件 的权限规则 (默认无该配置项, 即不对发向本地的邮件做任何限制)
值: permit_mynetworks
: 允许使用mynetworks配置项中指定的IP 的用户 无认证即可发送中继/本地邮件permit_sasl_authenticated
: 允许通过认证的用户 发送中继/本地邮件defer_unauth_destination
: 延迟处理(即暂时拒绝)发送到 未授权目标域名 的邮件reject_unauth_destination
: 拒绝发送到 未授权目标域名 的邮件defer
: 对未通过上述规则的请求进行延迟处理 (即暂时拒绝)reject
: 对未通过上述规则的请求直接拒绝- 注: 未授权目标域名 即为不在mydestination和relay_domainss和virtual_alias_domains值中的域名
- 扩展
VRFY: 支持客户端使用VRFY
命令来验证服务器是否存在 指定邮箱地址
(默认开启, 配置项中加入disable_vrfy_command = yes
以关闭)
服务搭建(Linux)
- 安装:
sudo apt install postfix
- 初始化:
sudo dpkg-reconfigure postfix
- 打开:
systemctl start postfix
- 配置文件:
/etc/postfix/main.cf
- 查看邮件队列状态:
sudo postqueue -p
-- 安全 --
未授权访问
- 未授权发送本地邮件:
原因;smtpd_relay_restrictions
配置错误, 使得可以不登陆发送本地邮件 - 未授权发送中继邮件:
原因;smtpd_relay_restrictions
配置错误使得可以不登陆发送中继邮件 - 匿名登录
原因: 当EHLO后出现AUTH ANONYMOUS
的字样时, 即可匿名登录(auth anonymous登录) - 测试是否存在: msf中auxiliary/scanner/smtp/smtp_relay模块
- 后果: 可以通过目标服务器任意发送邮件
信息泄露
- 原理: smtp在连接上后默认会显示
smtpd_banner
的欢迎信息, 默认包含了 系统邮箱邮箱 系统类型 服务种类 - 利用:
telnet <ip> <端口>
或nc <ip> <端口>
, 第一句话就是 - 利用(msf): msf中auxiliary/scanner/smtp/smtp_version模块
use auxiliary/scanner/smtp/smtp_version;set RHOSTS <服务器ip>;set RPORT <端口>;run;
枚举用户漏洞
- 前提: 三者满足其一即可
- 开启了VRFY扩展 (postfix默认开启)
- 开启了EXPN扩展 (postfix没有该扩展)
- 可未授权访问 发送本地邮件, 从而可以执行
RCPT TO
指定接收者
- 原理:
- VRFY扩展 支持客户端使用
VRFY
命令来验证服务器是否存在 指定邮箱地址 - EXPN扩展 支持客户端使用
EXPN
命令 查看邮件列表/别名地址 中包含的所有实际邮件地址 - 使用RCPT TO指向本地邮箱时(即收件人不填写@及其之后部分), 目标存在返回250, 不存在返回550
- VRFY扩展 支持客户端使用
- 利用(msf): msf中的auxiliary/scanner/smtp/smtp_enum模块
use auxiliary/scanner/smtp/smtp_enum;set RHOSTS <服务器ip>;set RPORT <端口>;run;
爆破
- smtp:
hydra -l <用户名> -P <字典路径> <目标IP> smtp -V -s <端口> -e nsr
- smtps:
hydra -l <用户名> -P <字典路径> <目标IP> smtp -V -s <端口> -S -e nsr
CRLF漏洞
- 原理: 若能够操控DATA数据(一般是可操控收件人),
可通过CRLF来改变邮件内容, 或操控RCPT TO
的内容来改变收件人