DNS子域名发掘工具两项

作者:Sender Su  来源:原创内容  发布日期:2022-07-24  最后修改日期:2022-07-24

  在网络安全技术领域,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子域名查询的基本原理。

本栏目相关
  •  2024-11-13 挖深网络安全的兔子洞:CPU 微码补丁管理
  •  2024-11-10 安全加固基准搅合国产操作系统上下游关系
  •  2022-05-11 CIS-CAT 配置评估工具介绍及操作实践
  •  2022-03-16 Windows 系统安全基线及软件工具介绍
  •  2022-08-28 网络攻防中的色彩象征
  •  2022-03-11 安装RHEL/CentOS时如何选择配置安全策略?
  •  2023-02-27 注意:TightVNC 2.8.75 释出,修补 zlib 漏洞 CVE-2022-37434
  •  2022-03-25 从甲方角度介绍“CIS互联网安全中心”
  •  2022-03-17 详细了解微软安全合规工具包(SCT)
  • 本站微信订阅号:

    微信订阅号二维码

    本页网址二维码: