在网络安全技术领域,DNS子域名发掘是非常关键的一项操作。众所周知,一个域名下可以存在多个子域名,每个子域名可以解析为不同的IP地址。
笔者:国际认证信息系统审计师、软考系统分析师
但是,DNS解析服务商基本上都不允许域名解析的管理者,设置从IP地址到域名的反向查询。即使是允许设置,实际BIND的工作机制也只对1条反向记录有效,而这一般会被设置为“@”或者“WWW”的反向查询解析。
因此,实际上并没有简单直接查询发掘子域名的方法。于是网络安全业界就产生了一些辅助工具去实现这项操作。
这些工具的原理基本都是相似的:通过某种方法,尝试枚举一个域,从而获得该域内子域名和IP地址的解析关系。
首先介绍第一个,名为DNSHarvester (DNS收割机)。
https://github.com/danielmiessler/DNSHarvester
DNS收割机这个名字挺有杀气的,但这个工具实际非常简单,大约40行的python代码(基于python2)而已。它使用了两种方法实现对子域名的枚举: 1、通过搜索引擎比如Google提供的搜索API接口进行搜索;
2、通过预设的字典列表进行搜索。从可用性来说,这个工具实质只是一个概念验证示例,但这也不妨碍它确实具备可用性。
代码仓库中提供了两个字典列表,一个长,一个短。使用者可以直接把任一个列表复制为脚本内预设的字典列表文件名:“prefixes.txt”让脚本使用。
脚本在执行时,脚本程序通过socket和simplejson这个python模块,通过调用socket.gethostbyaddr函数,按照字典列表检查子域名前缀的有效性。默认提供的长前缀字典列表中包含超过2500个前缀,短列表也包含了大约60个。有经验的网络安全人员可以自行管理这些前缀字典列表。
由于DNSHarvester已经比较旧,迄今已经有10年没有更新。如果需要在python3下运行,脚本就需要修改一下前面的引用部分。
另外是搜索引擎API的地址和调用参数也要按现在Google提供的版本进行修改(比如allinurl已经停用)。考虑到Google服务在国内不可用,还可以尝试把调用搜索服务改为调用BING.COM或其它搜索引擎。
脚本使用方法是在命令行通过python2去调用运行。因此首先要在操作系统比如CentOS中安装python2:
yum install python2
然后运行:
python2 harvester.py 目标域名
脚本成功运行后会输出所找到的子域名。
然后是第二个工具,名为DNSEnum(DNS枚举器)。
https://github.com/fwaeytens/dnsenum
这个脚本工具实际也存在了好一段时间,从github上的分支和星的数量可以知道被使用情况比DNSHarvester要广泛。
DNSEnum相对成熟,通过多线程的perl脚本实现对DNS服务进行枚举查找子域名。在设计上和DNSHarvester大体相似,都是通过前缀字典列表和搜索引擎相互配合实现。但相比DNSHarvester,DNSEnum提供了一些辅助功能,使得可以从目标DNS域获得更多的信息。
简单描述,DNSEnum实现的功能包括:
获取域名主机的地址(即A记录)
获取域名的名称服务器(线程化)
获取域名主机的邮件交换MX记录(线程化)
对名称服务器执行axfr查询,并获得BIND版本(线程化)
通过Google抓取获得域的额外名称和子域名(Google查询方式为:“allinurl: -www site:domain”,注意该参数已过时,需要更新)
基于字典文件暴力枚举子域名,并对具有NS记录的子域进行递归查询(全部线程化)
计算C类域网络地址范围,并对这些地址执行whois查询(线程化)
对C类或whois网格执行反向查找(线程化)
查找结果写入domain_ips.txt文件
DNSEnum 的源代码也有9年了,因此同样需要进行修改以适应当前的运行环境情况。比如对于Google查询使用的allinurl已经失效,需要修改,以及也要把Google搜索的API改成其它能用的搜索引擎的。
由于需要使用到perl以及一些perl的模块,需要对操作系统比如CentOS安装一些包,操作如下:
yum install cpan
完成安装后,下载模块:
curl -L http://cpanmin.us | perl - App::cpanminus
这个程序依赖于一些Perl模组,可以通过cpanm命令安装或更新:
cpanm threads threads::shared Thread::Queue
Getopt::Long IO::File Net::IP
Net::DNS Net::Netmask Net::Whois::IP
HTML::Parser String::Random Whois::IP
WWW::Mechanize XML::Writer
以上安装过程,也可以通过在PERL的交互式外壳中通过install命令进行安装,过程:
perl -MCPAN -e shell
然后用install命令安装:
install 模块名称
接下来通过git把DNSEnum的代码克隆到本地:
git clone https://github.com/fwaeytens/dnsenum.git
要查看使用信息,运行:
perldoc dnsenum.pl
正式运行,比如:
perl dnsenum.pl --enum 目标域名 -f 域名前缀文本文件.txt
程序运行过程中会不断输出查询分析的结果。
看到最后,可能会有人问,这很明显DNSEnum远比DNSHarvester成熟完整,为何要介绍DNSHarvester?这确实是因为DNSHarvester的代码很简洁,而基本上DNS子域名查询工具的原理都是一样的,所以,可以通过DNSHarvester这个简单的例子学习DNS子域名查询的基本原理。
本站微信订阅号:
本页网址二维码: