NEWS.ALL
Ruizhao's News Reader

关于钓鱼邮件的学习笔记

FreeBuf /2020-03-22

前段时间公司组织了一次以钓鱼邮件攻击为主题的攻防活动,对于攻击方来说,目标是提高钓鱼邮件攻击能力,包括探索各种钓鱼方式和实战技巧。对于防守方来说,目标是检验公司钓鱼邮件防护体系,包括相关防护设备监测能力、设备运营能力、员工安全意识、应急响应能力等,不过听说还有个原因是安全部门到了年终预算没花完~

非常荣幸我能有机会参与此次活动,一开始觉得不就是发个钓鱼邮件吗,能有多大技术含量,文案构造的精美一些就够了,但是看师傅们秀各种操作才明白钓鱼攻防虽然只是网络安全中的一个小点,但是深入研究还是有很多需要学习的内容。因此我也对最近学习的内容进行一次总结。

攻击

事前准备

钓鱼邮件的攻击方式通常有两种:

1. 构造钓鱼页面引诱受害者点击,获取目标账号密码,或者利用浏览器漏洞直接获取权限

2. 发送带有恶意附件的邮件,引诱受害者运行

所以事前我们需要准备一个钓鱼网站,为了能让钓鱼网站在公网访问,还需要一个VPS,若想获得更好的伪装效果,还需要一个用于伪装的域名。VPS和域名都到手后,还可以搭建属于自己的邮服用于SMTPRelay。使用恶意附件的话,还需要准备一个恶意样本,能做免杀的话就更好了,接收shell的话,同样需要一个VPS。

准备阶段恐怕就要花费大量的时间和金钱,VPS和域名需要购买,钓鱼网站需要制作,VPS需要搭建Web环境挂上我们制作的钓鱼,服务端需要单独写接收账号密码请求的功能,有的系统是token登录,因此密码还有时效性,为了保证能第一时间证明钓鱼成功,还需要开发自动登录目标截图的功能。使用VPS接收shell还需要搭建远控服务端,可以选用MSF、CS、Empire或者其他大佬们用着顺手的工具,还有各种各样的准备工作。最后就是最重要的,还要做好信息收集,掌握目标的近况,比如最近有什么活动、HR经常用什么样的模板发邮件等,掌握足够的情报可以帮助我们构造出容易让人上钩的邮件内容。

从零开始做上述准备工作的话,我这种菜鸟一周时间都不够……

 如果不具备一些基础设施,可以选用现成的工具来辅助发送邮件,网上有个公开的网站可以方便的发送伪造邮件:https://emkei.cz/。千里目实验室的一个老哥在Github上也开源了一个邮件伪造工具,亲测也很好用:https://github.com/Macr0phag3/email_hack

邮件伪造

先介绍一下SMTP,SMTP邮件服务器在进行邮件中转的时候不需要认证,利用这个特点攻击者可以进行邮件伪造攻击,SMTP它是基于TCP协议的,因此与TCP协议相同,SMTP传输邮件主要有以下三步:

1. 建立连接

2. 传输数据

3. 断开连接

第一步就是TCP协议的三次握手,SMTP协议的命令主要都是在第二步完成,常用的通信命令如下

了解了这些命令后,直接利用telnet命令就可以实现邮件的发送,下面是我用IIS搭建的SMTP中继服务器进行的邮件发送测试,返回250则代表发送成功。

其中mail from为实际发件人,from为邮件中显示的发件人,通过上面的例子可以看出,在输入发件人的时候,我们是可以任意输入的,因此可以伪造邮件发件人,如果接收方对邮件来源没有做好校验,则很有可能显示成为我们伪造的发件人,这就是邮件伪造的原理。

防护

SPF

说完了攻击再说说防护。SPF是 SenderPolicy Framework 的缩写,邮件接收方会检查域名的SPF记录,来判断发件人的IP地址是否在SPF记录里面,如果在,就认为是一封正确的邮件,否则会认为是一封伪造的邮件,一般邮件接收服务器会直接拒绝接收。

SPF 其实就是一条DNS的TXT的记录,查询域名的方法也很简单,以163.com为例:

Linux:

dig -t txt 163.com

Windows:

nslookup -type=txt 163.com

可以看到163.com的SPF记录为163.com text = “v=spf1 include:spf.163.com-all”,其中:

再看看spf.163.com的SPF记录,也是引用了其他域名的SPF策略,再次查询a.spf.163.com的SPF记录,最后看到很多IP段,我们在使用163.com邮箱发邮件时,收件方会查询到这些IP,如果发件人的源IP不在这些IP列表里,则说明是一封伪造的邮件。

测试一下伪装为admin@163.com邮箱给qq.com发邮件,最后提示550DNS检查失败。

DKIM

DKIM是一种在邮件中嵌入数字签名的技术,DKIM签名会对邮件中的部分内容进行HASH计算,最后在邮件头中增加一个DKIM-Signature头用于记录签名后的HASH值,接收方接收到邮件后,通过DNS查询得到公开密钥后进行验证, 验证不通过,则认为是垃圾邮件。

那么我们如何获取到发件方的DKIM的密钥呢?在DKIM中有一个选择器(selector)的概念,通过此功能可以为不同的用户提供不同的签名,想要找到发件方的DKIM服务器,首先需要找到selector,在邮件的DKIM头中,s字段的值即为DKIM的selector,获取到selector后,我们就可以在如下域名中找到密钥。

selector._domainkey.xxxxxxxx.com

以阿里云的邮件为例,查看邮件源文件,通过s字段可以得到selector的值为s1024。

因此阿里云的DKIM服务器域名为s1024._domainkey.aliyun.com,同样通过dig或者nslookup即可获取解密密钥。

DMARC

DMARC是基于SPF和DKIM协议的可扩展电子邮件认证协议,通常情况下,它与SPF或DKIM结合使用,并告知收件方服务器当未通过SPF或 DKIM检测时该如何处理。

以阿里云为例,获取_dmarc.aliyun.com的txt记录即可获取DMARC策略。

v=DMARC1:版本

p=:接收者根据域名所有者的要求制定的策略,取值和含义如下:

none 不采取特定措施
quarantine 邮件接收者将DMARC验证失败的邮件标记为可疑的。
reject 域名所有者希望邮件接收者将DMARC验证失败的邮件拒绝

pct=:域名所有者邮件流中应用DMARC策略的消息百分比。

rua=:用于接收消息反馈的邮箱。 

邮件网关检测原理

以上是协议层面的安全防护,但是协议防护也不是万能的,在真实的企业安全防护中,安全邮件网关是保护邮件安全的有效方案。邮件安全防护产品在此次钓鱼邮件对抗中起到了重要作用,下面简单介绍一下邮件网关的防护原理。

规则库

和杀毒软件一样,为了降低误报,一些邮件网关会使用规则库的技术,一些我们认定为垃圾邮件的邮件,则会被当做邮件样本加入规则库,下次如果再次遇到相同的邮件即可进行检测。

邮件头检测

检测mail from和from字段是否一致,检测SPF、DKIM、DMARC是否符合。

防病毒

邮件中嵌入恶意附件也是常用的攻击方式,邮件内容都是BASE64编码的,因此附件是可以直接进行还原,很多邮件网关都会内置防病毒引擎,甚至有的还有沙箱技术,让附件样本模拟运行后,通过行为来动态判断附件的黑白。一些攻击者在发送木马附件的邮件后可能会遇到有目标上线但很快下线的情况,遇到这种情况也不要高兴的太早,拿到的可能并不是一个真正的主机权限,而是一个沙箱。

黑白名单

黑白名单是简单有效的防护方式,可以针对发件箱、源IP、发件域名等设置黑白名单,特别是在应急响应阶段,黑白名单可以实现快速控制威胁扩散。

频率检测

对于同一源IP或者邮箱,如果一段时间内发送了大量邮件,则认定发件人为攻击者,采取黑名单方式禁止其访问目标。

超链接检测

在钓鱼邮件检测中常用,提取邮件中所有超链接,然后依次判断链接是否已经在恶意链接的规则库中。对于文本显示的链接和超链接的实际链接不同的情况,也会提示为钓鱼邮件。

机器学习

对发件人的邮箱域名进行学习,识别出与真实域名相近的域名,比如tools.com、t00ls.com、tooIs.com等,如果发现类似域名的发件人,则标记为危险邮件。 

各种绕过姿势

绕过SPF和DKIM

以阿里云的邮件为例,打开163邮箱看到了阿里云的邮件。

将邮件导出为eml文件,打开看到有DKIM验证。

上面已经演示过aliyun.com既有SPF又有DKIM还有DMARC,邮件伪造防护策略齐活了,如果仍然以阿里云为域名伪造发件人几乎是不可能的,而且163邮箱也有自己的校验机制,因此想要欺骗163邮箱,我们伪造的发件人的域名非常重要,要求这个域名不能有相关的邮件伪造防护策略,因此我随便找了一个小众的域名qiita.com,先看看SPF记录。

虽然有SPF记录,但是看到结尾的策略为~all,~前缀代表软拒绝,对接收方来说,遇到有软拒绝的域名没有通过SPF校验,通常采取的策略是放行或者标记为垃圾邮件,此处我伪装发件人为admin@qiita.com。将邮件保存为eml格式,DKIM的话直接删掉DKIM头即可,只保留从From开始的部分,同时把From处的发件人修改为要伪装的发件人admin@qiita.com。

使用swaks发送邮件,命令如下:

第一次发送的时候会失败,提示,请15分钟后再尝试。

查看163的错误说明,说明中却写着2分钟后再尝试。

那就隔2分钟后再发送邮件,返回250发送成功。

查看邮箱发现收件人已经成功伪造,也没进垃圾箱也没有显示为代发,比较完美的伪造。

绕过邮件网关超链接检测

此处开始介绍的方法都是此次公司实际对抗过程中大佬们采用过的方法,部分内容敏感因此只阐述原理,就不过多展示细节了……

接着说绕过超链接检测,上面介绍过一些邮件网关检测钓鱼邮件时会检测邮件正文中的URL和超链接指向的链接是否一样,比如邮件正文中写入https://www.baidu.com,但点击超链接会跳到https://www.taobao.com,邮件网关会对存在这种特征的邮件特别照顾,了解了检测原理绕过这种检测方式也很简单,那就是文本显示的内容和超链接内容一致,或者干脆不加超链接,测试了部分邮件客户端,对于不加超链接的URL,在本地邮件客户端中打开时会被客户端自动加上超链接,这其实是个方便用户的功能,但是也为钓鱼提供了一定的方便。不过采用这种方法也有弊端,需要把真正的钓鱼链接贴在邮件中,不容易做到伪装,而且也容易将服务器暴露。

绕过邮件网关域名检测

这里主要讲的是绕过防护设备的黑白名单,既然是黑白名单那么一定是人为设置的,人为设置难免会有设置疏忽的地方,这时候需要我们对目标多做一些域名收集,寻找一些没有SPF记录的域名,比如xxxx.com、xxxx.cn或者一些三级域名,甚至可以尝试任意伪造一个不存在的三级域名,比如1111.xxxx.com。

同时需要多收集一些正常的发件邮箱,比如公司IT的邮箱it@xxxx.com,通常此类业务邮箱是在白名单中的,因此在伪造发件人时,可选择一些白名单关键字来尝试匹配防护设备的白名单正则策略,比如itit@xxxx.com、aa@it.xxxx.com等,具体能不能成功还需要在实战中多实践。

另类方法绕SPF

由于邮件网关会对SPF记录中的IP开启白名单,对SPF记录中的IP进行漏洞探测,如果能获取这些IP的控制权,以白名单身份发邮件,即可完美绕过所有限制。在这次实战中,对目标域名进行了SPF查询,发现了3个IP。

本着试一试的态度,发现其中一个IP开了25端口,telnet连上去直接可以转发邮件不需要任何认证,十分舒服,不过防守方很快发现了这个漏洞,也快速修复了。

当然实战中最尴尬的是你只发了一个测试邮件,就被防守方发现了……被发现也就算了,还有更骚气的操作是向云服务商举报,封了我们的云主机……看来攻防永远在矛盾对抗着,任重而道远。

*本文原创作者:sec360zz,本文属于FreeBuf原创奖励计划,未经许可禁止转载