邮件钓鱼已经是老生常谈。不同的场景下当然有不一样的选择。在攻防演练中,我更加偏向于选择现有知名的邮件服务供应商,例如163、QQ等。因为是国内的演练,不会选择使用国外的邮件服务,更加别提臭名昭著的OutLook邮箱。在国内使用 163 可信度高,能让邮件的送达率高,但是往往在发送邮件的频率上有限制。
在邮件钓鱼演练服务,针对企业大批量的钓鱼,我们可以选择自建邮件服务器。这样可以没有发件频率的限制,你可以伪造发件人,也可以改变发件人的IP,但有很多因素导致邮件信任度不高无法抵达对方的邮件,也有可能会被当做垃圾邮件处理。此篇文章讲述了一些提高邮件可信度的设置方法。
其实邮件可信一方面是身份可信,一方面是内容可信。在身份可信上就有很多重校验,这一方面是需要我们第一步摆平的。这里涉及到IP地区、IP信任、IP网络可达;域名相似、域名信誉、域名购买时间;SPF/DKIM/DMARC/PTR身份认证;TLS/SSL证书、 S/MIME证书传输认证等。内容可信可以涉及到发件人名称、地址;邮件内容;邮件附件等。
前提条件选的好,那就成功一半了。
搭建邮件服务已经非常常见了,然而在选择邮件服务上还存在一些选项。
我接触过 sendmail 、Ewoemail、iRedMail 其他的暂未了解,其中 sendmail 只提供了邮件服务没有可视化管理的界面。但好在小巧,安装方便,自定义程度高。Ewoemail和iRedMail,都有后台和用户邮件管理系统,体积大,可以省去很多功夫。这里我使用 sendmail 达到我们的目的。
也可以选择使用 iRedMail 安装,它的配置教程:https://v2rayssr.com/iredmail.html#%E5%87%86%E5%A4%87%E5%B7%A5%E5%85%B7
为了更好的搭建邮件服务,增加可信度,我们需要有一台满足以下条件的VPS:
在国内,VPS提供商有的限制25端口,有的禁止25端口,大多都不允许自建提供于公网的邮件服务器;PTR 的设置需要VPS提供商设置,有的需要付费,有的禁止。这里我选择了国外的VPS提供商 hostinger,也是国内多少从业外贸商的选择。当然也可以从众选择搬瓦工,也可以选择小众或个人提供的VPS。尽管选择很多,但需要注意IP的信誉度。
全球有数不清的域名提供商,其中比较出名的是 Godaddy、Enom、TuCows。国内的域名注册用 Whois 查询可能可以获取到注册人的信息,但使用 Godaddy 可以不用担心这个。
域名的选择可以参考这个 https://www.maigoo.com/top/428603.html。其中 .com 、.cn、.us比较常见,这些TLDs 顶级域名可信度较高。如果你选择使用类似于 .space 的域名,会碰到这种情况。
通过身份验证的邮件:
邮件必须通过 SPF 或 DKIM 检查,才能通过身份验证。要通过 DMARC 检查,邮件必须先通过 SPF 或 DKIM 身份验证,而且身份验证网域必须与邮件的 From: 标头中的网域相同。
https://www.mail-tester.com/
一天只能免费测试三封邮件,注意把控次数。
设置域名:mydomain.com
文中的这个域名请你自行替换成自己的域名。
根据以下内容设置完后邮件可信度测试如下所示,其中扣分的地方是我购买的域名还没超过28天。
还有一种被动检查方式
https://en.internet.nl/test-mail/
关于DANE设置可以看这篇 https://blog.apnic.net/2019/11/20/better-mail-security-with-dane-for-smtp/
SPF 记录是为了防止垃圾邮件而设定的,告知收件方,从设置的允许列表中发出的邮件都是合法的,设置方式为添加一条根域名的 TXT 解析记录
内容为 v=spf1 mx ~all
检测方式:nslookup -type=txt mydomain.com
上面的 ~all
前缀代表软拒绝,对接收方来说,遇到有软拒绝的域名没有通过SPF校验,通常采取的策略是放行或者标记为垃圾邮件。
设置完成后可以使用这个地址来测试你的SPF。https://www.kitterman.com/spf/validate.html
了解更多SPF相关内容可以参考:https://github.com/internetstandards/toolbox-wiki/blob/main/SPF-how-to.md
了解如何绕过SPF:https://www.freebuf.com/articles/system/238215.html
将 mail.mydomain.com
的 A 记录指向你的 VPS 服务器(邮件服务器)IPv4地址
检测方式:nslookup mail.mydomain.com
将 mail.mydomain.com
的 AAAA 记录指向你的 VPS 服务器(邮件服务器)IPv6地址
检测方式:nslookup mail.mydomain.com
MX 记录就是邮件的解析记录,非常重要的一条记录,配置根域名的 MX 记录为自己的邮件域名地址,优先级为 10
检测方式:nslookup -type=mx mydomain.com
DMARC 记录是当收件方检测到伪造邮件等行为时,将根据您的配置进行操作的一个记录,比如拒绝邮件或放入垃圾邮件以及不做处理等,同时会反馈一份检测报告到配置的邮箱地址内。
添加方法就是增加一条 _dmarc 的 TXT 解析,内容为配置选项,v=DMARC1; p=none; pct=100; rua=mailto:[email protected]
检测方式:nslookup -type=txt _dmarc.mydomain.com
在检测中可能会遇到 DMARC 政策不够严格,我们可以设置成 p=quarantine
或者 p=reject
,分别是隔离和拒绝政策,我们可以直接设置成 v=DMARC1; p=reject; pct=100; rua=mailto:[email protected]
了解更多关于DMARC相关知识参考:https://github.com/internetstandards/toolbox-wiki/blob/main/DMARC-how-to.md
域名系统安全扩展(DNS Security Extensions,简称DNSSEC)是用于确定源域名可靠性的数字签名 ,通过在域名中添加DNSSEC记录,可以增强对DNS域名服务器的身份认证,有效防止DNS缓存污染等攻击。本文为您介绍如何在阿里云域名服务控制台上添加及同步DNSSEC记录。
阿里云域名用户可以看这篇 https://help.aliyun.com/document_detail/101717.html
这里我使用的是 CF,到域名管理控制台左侧栏找到 DNS 中的 Settings,进入 DNS 设置页面启用 DNSSEC。
开启后会给出几个值。
到你的域名注册商设置 DS 记录,我的域名注册商是Godaddy 到域名DNS设置处找到 DNSSEC。
官方教程 https://sg.godaddy.com/help/enable-dnssec-on-my-domain-6420
其中的 Key tag、Algorithm、Digest Type、Digest按照提供的数据填写后点击 Update 即可。
DKIM 可说是避免被判定为垃圾邮件的一大利器,DKIM 属于一种类似加密签名的解析记录,只有包含此加密数据,且公钥与密钥相匹配才属于合法邮件,要设置 DKIM 记录,首先要查询 DKIM 信息。
了解更多DKIM相关知识可以参考:https://github.com/internetstandards/toolbox-wiki/blob/main/DKIM-how-to.md
如果你的邮件服务器使用的是类似 EwoMail 或者 iRedMail 等大型邮件服务器就可以使用这个方法。
查询 DKIM 可以使用系统命令
amavisd showkeys
OR
amavisd -c /etc/amavisd/amavisd.conf showkeys
如果不存在 amavisd 可以使用命令安装 yum --enablerepo=rpmforge,rpmforge-extras install amavisd-new -y
文中这节如果有一些描述没有读懂可以看这篇参考文章https://meumobi.github.io/sendmail/2015/09/18/install-configure-dkim-sendmail-debian.html
sendmail 的配置文件
vim /etc/hosts
在hosts 文件添加一段
127.0.0.1 mail.mydomain.com mail
这里的 127.0.0.1 替换成你的 VPS IP。echo mail > /etc/hostname
修改你的 hostnamehostname -f
即可看到 mail.mydomain.com
,而不加选项则是短名称,如果你的不是这样可以使用 sudo hostname mail
强制修改。我使用的是 sendmail 作为我的邮件服务器,并安装 OpenDKIM 。安装命令如下。
yum install sendmail sendmail-cf mailutils sharutils opendkim opendkim-tools -y
为您的密钥创建新目录
mkdir -p /etc/opendkim/keys/mydomain.com
上面的命令将在新创建的目录下创建两个文件 default.private 和 default.txt 如果您对创建密钥时可用的其他选项感兴趣,可以执行 man opendkim-genkey
查看更多选项。在此示例中,我使用了 -D(目录)选项、-d(域)选项和 -s(选择器)选项。
请留意这里的 -s 选项,这里可以默认为 default 你可以选择自定义任意字符。
opendkim-genkey -D /etc/opendkim/keys/mydomain.com -d mydomain.com -s default
将所有权更改为 opendkim 这一步是必须的,不然opendkim没有权限访问 /etc/opendkim/keys/mydomain.com 文件夹,导致无法正常对邮件进行签名。
chown -R opendkim:opendkim /etc/opendkim/keys/mydomain.com
chmod 640 /etc/opendkim/keys/mydomain.com/default.private
chmod 644 /etc/opendkim/keys/mydomain.com/default.txt
vim /etc/opendkim.conf
配置 OpenDKIM,这是我配置的文件。请对照着修改。
PidFile /var/run/opendkim/opendkim.pid
Mode sv
Syslog yes
SyslogSuccess yes
LogWhy yes
UserID opendkim:opendkim
Socket inet:[email protected]
Umask 002
SendReports yes
SoftwareHeader yes
Canonicalization relaxed/simple
Domain mydomain.com
Selector default
MinimumKeyBits 1024
KeyFile /etc/opendkim/keys/mydomain.com/default.private
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
OversignHeaders From
AutoRestart Yes
AutoRestartRate 10/1h
SignatureAlgorithm rsa-sha256
vim /etc/opendkim/KeyTable
在该文件添加下面一行。
default._domainkey.mydomain.com mydomain.com:default:/etc/opendkim/keys/mydomain.com/default.private
vim /etc/opendkim/SigningTable
在该文件添加下面一行。
*@mydomain.com default._domainkey.mydomain.com
vim /etc/opendkim/TrustedHosts
在该文件添加下面一行。
127.0.0.1
localhost
mydomain.com
也可以直接用这个命令设置,但同样的你需要替换其中的 mydomain.com
echo 'default._domainkey.mydomain.com mydomain.com:default:/etc/opendkim/keys/mydomain.com/default.private' >> /etc/opendkim/KeyTable
echo '*@mydomain.com default._domainkey.mydomain.com' >> /etc/opendkim/SigningTable
echo 'mydomain.com' >> /etc/opendkim/TrustedHosts
设置 sendmail 每一封邮件都要经过 OpenDKIM 签名
vim /etc/mail/sendmail.mc
在该文件添加下面一行。
INPUT_MAIL_FILTER(`opendkim', `S=inet:[email protected]')
其他的 sendmail 配置可以参考这篇 https://max.book118.com/html/2021/1018/8040072020004022.shtm
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
使用 m4 生成Sendmail的配置文件。
启动需要的服务并查看他们的状态
systemctl restart sendmail saslauthd opendkim
systemctl status sendmail saslauthd opendkim
这个是必须的,上面的配置是在每封邮件发出时进行签名,而这个 DNS 记录就是用来验证邮件里的 DKIM 签名的。其中我们需要注意的是这条 TXT 记录的 Name。
它的构成是 Select._domainkey。这里的 Select 其实就是上面第2小节里生成签名密钥命令里的 -s default
所以这里我们的命名为 default._domainkey。而内容可以通过 cat /etc/opendkim/keys/mydomain.com/default.txt
命令获取。
想进一步了解 DKIM 可以参考这篇 https://www.konghaidashi.com/post/4376.html
选择使用 sendEmail 服务进行邮件发送测试,注意不要和 sendmail 服务搞混。
yum install sendEmail -y
安装服务,使用下面的命令进行测试。
sendEmail -f [email protected] -t [email protected] -u TestSendEmail -m Hi -s 127.0.0.1
使用说明:
-f 表示发送者的邮箱
-t 表示接收者的邮箱
-cc 表示抄送发给谁
-bcc 表示暗抄送给谁
-o message-content-type=html 邮件内容的格式,html表示它是html格式
-o message-charset=utf8 邮件内容编码
-s 表示SMTP服务器的域名或者ip
-u 表示邮件的主题
-xu 表示SMTP验证的用户名
-xp 表示SMTP验证的密码(注意,这个密码貌似有限制,例如我用d!5neyland就不能被正确识别)
-m 邮件的内容
-a 要发送的附件
使用样例:
$ sendEmail -f [email protected] \
-t [email protected] \
-cc [email protected] \
-bcc [email protected] \
-o message-content-type=html \
-o message-charset=utf8 \
-s mailserver.com \
-u TestSendEmail \
-xu sender \
-xp xxxxxx \
-m 邮件的内容:测试命令行发送邮件 \
-a 附件
之后在邮件的头部就会包含 DKIM 标识了。
有关邮件加密的相关描述 https://support.google.com/mail/answer/6330403?visit_id=638066867880173220-2329511212&p=tls&hl=zh-Hans&rd=1
加密邮件的方式有 S/MIME 增强型加密 和 TLS/SSL - 标准加密 两种,因为 S/MIME 比较繁琐,我们选择使用 TLS,即使用 TLS/SSL 自签证书加密。
Acme 脚本申请证书,是我们用到的最常见的一种证书的申请方式,它有很多的申请方法,大家只需要找到一种适合自己的也就好了。
安装 Acme 脚本
curl https://get.acme.sh | sh
2021 年 6 月 17 日更新:从 acme.sh v 3.0.0 开始,acme.sh 使用 Zerossl 作为默认 ca,您必须先注册帐户(一次),然后才能颁发新证书。
~/.acme.sh/acme.sh --register-account -m [email protected]
其中 [email protected],ca 可以任意变更。
国内腾讯云的VPS,类似于 80、443、8080、8443 等WEB应用常用端口的使用都是需要备案的。然而很不幸的是,我们如果使用Web 验证申请证书,我们就需要使用 80 端口。如果你是使用的腾讯云的VPS,可以直接看第二种证书申请方式。
这种方式,需要开放 80 端口,并保持不被占用的状态,这种方式不支持泛域名。
申请SSL证书时,需要先进行验证,确保你是该域名的所有者。以下有三种方式,可以按照自己的情况来继续进行验证申请。
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 Acme.sh 还能假装自己是一个 WebServer, 临时监听在 80 端口,完成验证。这里需要安装 socat 来完成伪装。
yum install socat -y
~/.acme.sh/acme.sh --issue -d mydomain.com -d mail.mydomain.com --standalone
这种方式需要你的服务器上面已经部署了 Nginx 环境,并且保证你申请的域名已经在 Nginx 进行了 conf 部署。(被申请的域名可以正常被打开)
~/.acme.sh/acme.sh --issue -d mydomain.com -d mail.mydomain.com --nginx
这种方式需要你的服务器上面已经部署了网站环境。(被申请的域名可以正常被打开)
原理:Acme 自动在你的网站根目录下放置一个文件, (这个文件可以被互联网访问)来验证你的域名所有权,完成验证. 然后就可以生成证书了。
实例代码:(后面的路径请更改为你的 网站根目录 绝对路径 )
~/.acme.sh/acme.sh --issue -d mydomain.com -d mail.mydomain.com --webroot /home/wwwroot/mydomain.com/
这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证。坏处是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
Acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商。该方式可以申请多域名、泛域名证书,达到很多域名可以共用一张证书的目的。
这里我们使用常见的 cloudflare 来申请。
首先进入到 cloudflare 控制台添加你的域名。https://dash.cloudflare.com/
填入你的域名然后点击添加。
然后到你的域名商控制台,将域名服务器更换成 cloudflare 提供的域名服务器。
差不多过半个钟或者一个钟就能解析了。需要注意,更换域名服务器未生效期间无法进行DNS验证SSL证书申请。
在等待期间我们可以先设置API Keys。先到 https://dash.cloudflare.com/profile/api-tokens
export CF_Key="你的Global API Key"
export CF_Email="你注册CF账号用的邮箱"
设置完之后就可以申请证书了。
~/.acme.sh/acme.sh --issue --dns dns_cf -d mydomain.com -d *.mydomain.com
如果中间没有故障,最终可以申请到SSL证书,如图所示,生成了很多的文件。
禁止直接使用 ACME 目录下面的证书文件,因此我们需要复制到自己的文件夹内。
mkdir /etc/mail/certs
cp /root/.acme.sh/mydomain.com/* /etc/mail/certs/
~/.acme.sh/acme.sh --installcert -d mydomain.com --key-file /etc/mail/certs/mydomain.com.key --fullchain-file /etc/mail/certs/fullchain.cer
~/.acme.sh/acme.sh --upgrade --auto-upgrade
chmod -R 700 /etc/mail/certs
cd /etc/mail/certs
for i in `ls | grep '.cer'`;do mv $i `echo $i | sed 's/\.[^.]*$//'`.pem;done;
wget http://www.cacert.org/revoke.crl
为了解决 STARTTLS: CRLFile missing 问题,这里我下载了 revoke.crl 文件。参考http://www.linuxweblog.com/blogs/sandip/20071019/starttls-crlfile-missing-resolved
我们需要从 OpenSSL 那里获取到 ca-bundle.crt
文件。
里面标注了常见目录 http://gagravarr.org/writing/openssl-certs/others.shtml#selfsigned-openssl
我们可以直接通过 openssl version -d
找到 SSL 文件存放目录
而ca-bundle.crt
文件一般放置于 certs 目录下
cp /etc/pki/tls/certs/ca-bundle.crt /etc/mail/certs/ca-bundle.crt
echo /etc/mail/certs/fullchain.pem >> /etc/mail/certs/ca-bundle.crt
ln -sf ca-bundle.crt `openssl x509 -hash -noout < ca-bundle.crt`.0
vim ca-bundle.crt
将 fullchain.pem
追加到 ca-bundle.crt
,需要注意不能直接复制保存,而是在每一个证书开头加一个换行。
vim /etc/mail/sendmail.mc
对照下面修改项进行修改
dnl define(`confLOG_LEVEL', `20')dnl
define(`CERT_DIR', `/etc/mail/certs')dnl
define(`confSERVER_CERT', `CERT_DIR/fullchain.pem')dnl
define(`confSERVER_KEY', `CERT_DIR/mydomain.com.key')dnl
define(`confCLIENT_CERT', `CERT_DIR/fullchain.pem')dnl
define(`confCLIENT_KEY', `CERT_DIR/mydomain.com.key')dnl
define(`confCACERT_PATH', `CERT_DIR')dnl
define(`confCACERT', `CERT_DIR/ca-bundle.crt')dnl
define(`confCRL', `CERT_DIR/revoke.crl')
使用 m4 生成Sendmail的配置文件并重启 sendmail 服务。
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
systemctl restart sendmail
systemctl status sendmail
通过发送邮件查看日志测试 SSL 验证。
sendmail [email protected]
From: [email protected]
To: [email protected]
HI
.
注意最后的 .
tail -20 /var/log/maillog
看到接收方邮件服务器验证 verify=OK
即可。
如果是 verify=FAIL
可以根据 verifymsg
来判断问题。
这种方式申请证书,比较简单,而且还可以申请到为期一年的 “亚洲诚信” 的证书,但是,目前此网站申请证书需要进行手机验证,这里不演示。
反向域名解析纪录(RDNS)就是和正向的DNS解析相反的一种反向解析,正向DNS解析把域名解析成IP地址,RDNS恰恰相反,就是反过来把 IP 解析成域名。反向域名格式如:X.X.X.in-addr.arpa。可逆 DNS(RDNS)的原理和 DNS 解析是完全相同的。
这里详细介绍了 PTR 拦截垃圾邮件是如何运作的。https://www.800188.com/index.php/home/reference-news/86-technology/2044-rdns-3?tmpl=component&print=1
国内的VPS我不清楚有哪些可以设置 PTR,像腾讯云如果需要设置 PTR 是需要付费的,如果你使用的是腾讯云可以看官方的说明。https://cloud.tencent.com/document/product/302/79828
为了能够免费设置 PTR 我特地从 hostinger 供应商购买了VPS。
这个 hostinger 供应商提供的最优惠价格都是购买4年的,如果你购买一个月那价格可能会是个灾难。
购买后到 https://hpanel.hostinger.com/ 开始设置你的服务器。
在 《2021中国企业邮箱安全性研究报告》中提到一段话:“在所有钓鱼邮件中,来自美国的钓鱼邮件最多,占国内企业用户收到的钓鱼邮件的41.0%;其次是中国,约占11.7%;新加坡排名第三,约占5.3%。”新加坡有垃圾邮件法,而美国监管不够严格。这里选择美国。
后面选择 Centos 7 系统镜像,在设置机器名字时,我们可以写 mail.mydomain.com,就可以跳过设置 VPS 主机名。创建完成后按照官方说明设置 PTR https://support.hostinger.com/en/articles/4805528-how-to-use-ptr-at-vps,IPv6的也设置上。
在设置解析的域名,我们需要填写 mail.mydomain.com 而不是 mydomain.com。
检测方式:nslookup VPSIP
通过机器对垃圾邮件进行区分,区分的规则需要我们了解。这有很多校验项,我们不需要费尽心思将每条校验项做好。但如果不按照规则来,很有可能没法进入对方的邮箱或者当成垃圾邮件。邮件可信除了邮件身份可信校验之外,还有针对邮件内容进行的可信校验,这个涉及的内容太多,不同场景不同话术,不仅要绕过机器还要绕过人心。