在实践中,泛解析域名会在网络测绘过程中产生大量的脏数据,给信息收集带来困扰。本文提出了一种基于时序的泛解析域名判断方法,从泛解析域名列表中分离出有意义的域名。
泛解析简介
泛解析(Wildcard DNS)是一种域名解析技术,通过在域名服务器上配置通配符,可以将任意未明确指定的子域名解析到同一IP地址。
测绘中的泛解析
在实践中,泛解析域名的特点会为网络测绘产生大量的脏数据,给信息收集带来困扰。当前子域名爆破工具在遇到泛解析时大多会全量丢弃泛解析域名,但是简单地丢弃所有泛解析域名会导致丢失部分有价值的数据。
举例来说,虽然 *.taobao.com
配置了泛解析,但是该配置对应有许多有价值的子域名例如主站 www.taobao.com
、 盒马 hema.taobao.com
等,如果直接丢弃这个泛解析域名,会导致测绘遗漏非常多数据。因此,需要一种方法来区分泛解析域名中有业务的域名。为了方便表述,在后文中将有具体业务的符合泛解析规则的子域名称为业务域名,只是因为泛解析规则而有解析记录并没有实际应用的域名称为无效域名。
基于时序的泛解析业务域名分类
让我们简单回顾一下端上DNS递归请求的链路:
- 程序向本地DNS服务器请求解析
- 如果本地DNS服务器缓存没有命中,向配置的公共DNS服务器发送一个查询请求
- 如果公共DNS服务器上有缓存,直接返回;否则公共DNS服务器查询对应域名的NS服务器获得结果后再返回
- 公共服务器向NS服务器发送查询请求,将查询结果返回给本地DNS
对于直接向对应域名的NS服务器查询的情况,由于泛解析在目标的NS上配置的是通配符,所以业务域名和无效域名解析耗时相同。而选择常用的公共DNS服务器进行DNS请求时,业务域名由于正常业务使用被其它用户访问过,大多在公共DNS服务器上存在缓存,会以更短的时间返回。
即业务域名的命中链路为:程序->本地DNS->公共DNS,无效域名的命中链路为:程序->本地DNS->公共DNS->NS服务器,多出的一次查询会显著增加解析时间。因此我们可以通过解析耗时来一定程度上自动化区分出泛解析域名。
具体来说,可以串行解析泛解析域名对应的多个子域名之后,采用统计算法或聚类算法来实现自动化区分,如贪心算法或K-Means算法等。这里简单考虑使用差值排序方法,具体步骤如下:
- 串行解析要测试的域名列表
- 将解析时长数据从小到大排序
- 计算出所有相邻两个时长数据之间的差值
- 将这些差值从小到大排序
- 选择差值最大的两个数据,将时长数据分为两组
实验
以常见的配置了泛解析的域名(如taobao.com)为例进行验证。一组结果如下:
子域名 | 解析耗时 |
---|---|
www.taobao.com | 77.4855ms |
world.taobao.com | 84.9071ms |
job.taobao.com | 84.8757ms |
hema.taobao.com | 84.8757ms |
not-exists-1.taobao.com | 295.3502ms |
not-exists-0.taobao.com | 294.8052ms |
可以看到有很明显的时间差距,时间小于100ms的均是业务域名,其他的是无效域名。
需要注意的有:
- 测试时需要保证本地的网络稳定,没有明显的网络波动、丢包等情况
- 在测试前需要进行预热,即使用非测试范围内的无效子域名进行查询,确保公共DNS和目标NS之间已经建立起了链路,使得后续请求没有额外的路由等开销
- 需要确保公共服务器和目标NS之前网络稳定,例如用国内114dns来测试
github.io
的泛解析可能会导致结果有明显的网络波动
限制
基于时序的泛解析判断方法存在以下限制:
- 该方法依赖于缓存,如果域名对应业务访问量小,公共DNS服务器没有缓存,则无法保证正确率
- 需要向特定的服务器发送数据包,可能给目标服务器带来网络负担
- 基于时效的方案对网络状况有很大的依赖,不稳定的网络环境会显著影响结果
总结
本文提出了一种基于时序的泛解析域名判断方法,通过分析DNS请求链路的时长数据,实现了对泛解析域名和非泛解析域名的自动化区分。尽管该方法存在一定的局限性,但在一定程度上可以帮助解决网络测绘过程中泛解析域名带来的问题。