1. 概述
前期发表在个人freebuf专栏:https://www.freebuf.com/articles/database/257117.html
在前一篇文章《一起钓鱼邮件的应急响应》中,我们介绍了伪造发件人的攻击,链接为https://www.freebuf.com/articles/system/256049.html。里面介绍了主流的攻击方式,在写文章和内部培训的时候我常在想国内或国际那些顶级域名有哪些存在相关的安全问题。由于前期有过数据分析的实践,于是直接上手来看看哪些域名受相关漏洞的影响。于是,便有了这篇文章。
2. 数据源
本来想找国内的域名测试一下,看了一下,alexa中国的排名数据,里面只能找到前2000名的,http://www.alexa.cn/siterank/,数据量还是有些少了。
网上找了一个,alexa全球排名前一百万,数据量够大,分析才具有参考价值,相关下载链接如下所示:http://s3.amazonaws.com/alexa-static/top-1m.csv.zip
3. 说明
在测试的时候个人发现存在多处问题,相同的代码返回的结果可能不一致,原因有网络问题、安全策略(伪造发件人,相同信息,有的时候可以成功,有的时候被拦截),因此本文的数据可能和真实结果会有些差距。
在调用dnspython库时使用多线程时会导致结果偏差太多,可能是网络原因,所以大家可以自行在自己的网络环境中测试,这里面就使用单线程调用。
4. 代码实现
这里面直接使用Python的dnspython库,直接输入pip install dnspython可直接安装相关库。
使用dnspython库,可直接查询域名的txt记录,
#coding="utf-8"
import dns.resolver
domain='jd.com'
answers = dns.resolver.query(domain, 'TXT')
for rdata in answers:
print(str(rdata))
可以看到相关结果和使用nslookup返回的结果数据是一致的。<br /><br /> 使用nslookup查询的txt记录<br />
5. 数据分析
5.1 未配置DNS的txt记录
由于测试的时候使用python多线程时,会导致程序极度不稳定,结果和真实结果偏差较大,因此本次测试使用的是top 1万的数据进行测试。相关Top 一万的数据源如下:
相关代码如下所示:
#coding="utf-8"
import dns.resolver
for domain in open('1w.txt'):
domain = domain.split('\n')[0]
try:
answers = dns.resolver.query(domain, 'TXT')
for rdata in answers:
if 'v=spf' in str(rdata):
f = open('./DNS的TXT响应结果.txt','a')
print(domain,file=f)
else:
pass
except Exception as e:
f = open('./未配置DNS TXT记录的域名.txt','a')
print(domain,file=f)
跑完数据,看一下结果,top一万的域名里面有593个域名没有配置dns的txt记录,占比例为593/100000=5.9%,比例还是很高的,并且这些域名都是全球排名前一万的,相关数据如下:<br /><br />直接使用email_hack工具来验证一下,使用bbc.com和google.fr来验证一下:<br /><br />看了一下,确实可以收到。<br />
5.2 设置了软失败的域名
关于软失败,前文说过配置了软失败的。~all前缀代表软拒绝,对接收方来说,遇到有软拒绝的域名没有通过SPF校验,通常采取的策略是放行或者标记为垃圾邮件。随便找个软失败的,相关的信息如下:
代码实现如下:
源码如下:
#coding="utf-8"
import dns.resolver
for domain in open('1w.txt'):
domain = domain.split('\n')[0]
try:
answers = dns.resolver.query(domain, 'TXT')
for rdata in answers:
if 'v=spf' in str(rdata):
if '~all' in str(rdata):
print(domain)
f = open('./软失败域名.txt','a')
print(domain,file=f)
else:
pass
except Exception as e:
pass
看一下结果,前100000一共有3813个配置了软失败,比例非常高,达38%。很多大厂,google、amazon.com、live、zoom
前面说过,当收件人收到这种配置有软失败的时候,处置策略是放行或者标记为垃圾邮件,即使标为垃圾邮件也比收不到好,拿大厂测试一下。
虽然标为垃圾邮件,但是都收到了,总比收不到好。
5.3 未配置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 123456@qq.com -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邮箱,所以没有测试。不知道苹果会不会进行二次检测,有条件的大家可以测试一下。
6. 结论
在测试的时候以为邮箱这一块很传统的,安全应该做的很到位,并且前alexa前一万都是大厂,理论上应该不会存在这一块的问题。没想到测试结果令我吃惊,像bbc、github、tiktiok都有这种安全问题。本次测试大部分采集前一万域名数据,有兴趣的同学可以测试一下国内top 10000的域名,应该会发现不少大站在邮箱这块存在的安全问题。
7. Referers
7.1 临时邮箱
https://10minutemail.net/
https://www.linshiyouxiang.net/
https://temp-mail.org/zh/