N年前,微步在线应急响应团队收到某用户请求协助,其收到内部内部账号发起的钓鱼,并且经用户反馈“该账号为黑客自己创建的账号”,相关的链接为明显的钓鱼链接。
同时经过微步在线应急响应团队排查,邮件服务器没有相关的邮件收发记录。
初步怀疑是攻击者依靠发件人发起的,于是验证了一下,果然可以伪造发件人,同时用户也收到了相关的伪造的邮件。
上面的钓鱼案例只是我们在日常安全运营场景中非常典型的一起缩影。
在真实的攻防对抗、APT攻击或是黑灰产中,社工总是一个不错的入口,鉴于其技术难度相对0day低很多、并且其影响较大,通过社工基本上可以打到内网。
所以社工是目前攻击者比较倾向的一种方式,钓鱼邮件作为其中效果最好且成本最低的方式一直受到攻击者的青睐。
钓鱼的手段较多且利用方式相对灵活,我们通过分析几起实战案例,来了解钓鱼的主流方式以及其中的对抗之道理,以便于我们进行体系化的防御。
02 伪造发件人
上面的实战案例已经验证过伪造发件人的可行性,关于伪造发件人原理大家可自行搜索相关文章,这篇就不进行详细的描述。
伪造发件人的实现手法主要有以下几种方式:
伪造发件人的实现方式较多且利用较灵活,需要攻击者根据目标的安全防护水平与防护能力进行针对性的灵活使用,其可以达到的效果就是单纯通过发件人无法看出是否是真实的发件人。
但是其也有相应的检测方法,比较主流的方法就是检查其发件人的IP与DNS里面的TXT记录是否一致或被包含。
下面就是mail.qq.com的邮件服务器IP地址,其是一个地址集,如果发件人的IP地址在这些IP中,根据SPF校验其就是合法的IP地址;不过这里面同样存在被绕过的可能,所以邮件网关类产品不仅仅会校验这块的安全,还有更深层次的校验。
03 通过数据来看邮件安全
鉴于上面几种主流钓鱼方式的影响,我们需要通过数据层面来分析钓鱼邮件的实际影响程度与范围,“数据驱动安全”一直是一种比较好的思路,看一下通过数据分析得出来的结论:
1、数据源
微步在线通过alexa下载全球前100W的数据,不过实战验证过程只是使用了前一万的数据
相关Top一万的部分数据源如下:
2、未配置DNS的txt记录
相关代码如下所示:
跑完数据,看一下结果,top一万的域名里面有593个域名没有配置dns的txt记录,占比例为593/100000=5.9%,比例还是很高的,并且这些域名都是全球排名前一万的,相关数据如下:
直接使用email_hack工具来验证一下,使用bbc.com和google.fr来验证一下:
看了一下,确实可以收到。
3、设置了软失败的域名
关于软失败,前文说过配置了软失败的。~all前缀代表软拒绝,对接收方来说,遇到有软拒绝的域名没有通过SPF校验,通常采取的策略是放行或者标记为垃圾邮件。
随便找个软失败的,相关的信息如下:
代码实现如下:
源码如下:
看一下结果,前100000一共有3813个配置了软失败,比例非常高,达38%。很多大厂,google、amazon.com、live、zoom
前面说过,当收件人收到这种配置有软失败的时候,处置策略是放行或者标记为垃圾邮件,即使标为垃圾邮件也比收不到好,拿大厂测试一下。
虽然标为垃圾邮件,但是都收到了,总比收不到好。
4、未配置SPF校验
这一步核心就是模拟SMTP协议,指定发件人来发件,若未配置SPF校验则返回250状态码,如下图所示
若开启SPF校验的话则会返回550 MI:SPF,下面可以看到163开启了SPF,伪造的发件人被SFP策略拦截了。
所以这一步的核心就是伪造一个发件人,然后找那些返回“250 2.0.0 OK”的邮箱域名(不同的邮件服务器返回的状态码可能不同,但是基本上会有250 OK这种关键词,可以使用作为关键词进行匹配)。
同时发件人选择也有一定要求,发件人必须配置了DNS的TXT记录,若未配置DNS的TXT记录,很可能是因为第一种原因导致可以伪造发件人,这里面我们选择使用QQ邮箱来伪造发件人,看一下,QQ mail配置了DNS的txt记录:
这一块测试直接使用linux shell来完成吧,代码很简单:
#!/bin/bash
saveresult=”tee -a notenablespf.txt”
for a in `cat /root/1w.txt`
do
{ a=’admin@’${a}
result=$(python email_hacker.py -faddr [email protected] -taddr $a -s “Import File” -b “Import File”| grep “success: 1”)
if [ $? -eq 0 ];then
echo $a
fi
} &
done
wait
测试了一下,使用linux shell 跑的太慢了,跑了一段时间,大概跑了4000个域名,发现可以伪造发件人的有370个,比例为9.2%。比例还是很高的,apple、zoom、dell。
伪造一个发试试,直接伪造qq.com发给apple.com,竟然发送成功了。这里面由于没有apple.com邮箱,所以没有测试。
不知道苹果会不会进行二次检测,有条件的大家可以测试一下。
04 钓鱼思路的升级
通过上面的实战与理解,可能大家会有个认知:如果有相关的钓鱼首先要怀疑是被伪造发件人了。
我这边就有这个认识烙印,在某次攻防演练中被误导了。客户收到大量的这种类型的钓鱼邮件:
05 相同收发件人钓鱼
最近在区域的一起钓鱼邮件的应急过程中,我们发现一个比较奇怪的现象:用户收到了一封自己给自己发的邮件。
通过分析,钓鱼内容意思为获取了其大量敏感信息,并使用其获取的账号密码来钓鱼,其实并不是被钓鱼了,而是利用伪造发件人来实现的:
查了一下里面的BTC 地址,果然还是有上当的,转了0.039BTC,差不多5000+RMB:
06 态势感知碰到钓鱼
态势感知一直是流量检测类的产品,其在判断内网失陷时主要是利用IOC来识别,如果存在下面这种场景,你认为态势感知会怎么判断?
1、dns.anbush.com为CS的C2地址
07 邮件安全
关于邮件的安全,主要有以下几种方式:
1、配置DNS的TXT记录
对于使用邮件服务器的用户需要在DNS中配置TXT记录,指明相关的邮箱服务器的IP地址,这样,对方若开启SPF检测,收到相关的邮件以后,会通过DNS查询的方式来查询发件人声明的IP地址。
2、开启SPF校验
这个主要是对于收件人来说的,当收件人收到一封邮件以后若想校验发件的是否是伪造的,可以通过开启SPF校验这种方式通过DNS查询发件人的IP地址,然后再去和发件人的IP地址比对,若匹配或包含则通过SPF校验。
08 DKIM
全称是“Domain Key Identified Mail”,是yahoo的domainkey技术跟cisco的identified mail合起来的产物。它的目的主要用来保证邮件的完整性,避免钓鱼。
这种技术本质上是采用了RSA算法实现数字签字,即使用私钥加密,公钥解密。DKIM会对邮件头及正文进行签名,没有私钥下,邮件被假冒或篡改后,就会与邮件头签名不一致,从而防止这样的情况。
首先使用RAS算法生成一对公私钥。
1、私钥加密
将私钥放到邮件服务器上,对发送的邮件使用私钥进行加密。私钥只有邮件服务器的管理者有。
2、公钥解密
公钥通过DNS的TXT类型将相应的公钥同步到DNS中,收件人收到以后通过DNS这种方式就可以查询到相应的加密算法和相关的公钥。
3、DKIM配置
关于DKIM如何配置,找了两个配置案例,大家可以参考一下:
4、DKIM案例
一般来说,发送方会在电子邮件的标头插入DKIM-Signature及电子签名信息。直接“下载邮件”
通过txt方式打开,可以看到DKIM签名数据
接收方通过将KDIM签名里面的d和s的值取出来,构造相关的txt域名,$s._domainkey.$d,这里面是email0517._domainkey.email.apple.com
然后通过dig或nslookup的方式来查询相应的txt记录,可以查询到下面信息,里面的K=rsa表示使用rsa加密,p的值就是里面的公钥。
09 DMARC
DMARC是基于SPF和DKIM协议的可扩展电子邮件认证协议,通常情况下,它与SPF或DKIM结合使用,并告知收件方服务器当未通过SPF或 DKIM检测时该如何处理。
以apple.com为例,获取_dmarc.aliyun.com的txt记录即可获取DMARC策略。
– END –
微步在线应急响应团队为企业客户提供应急响应服务。当企业遭遇突发重大安全事件(APT攻击、勒索加密、数据窃取、漏洞攻击、主机被控等),微步在线可提供快速事件定位取证、隔离清除、溯源分析、安全加固等专业安全服务,帮助企业信息系统在最短时间内恢复正常工作,将事件影响降到最低。
2. 内容引用,请注明出处:以上内容引自公众号“微步在线应急响应团队”
原文始发于微信公众号(微步在线应急响应团队):涨姿势!邮件安全还能这么玩?