子域名枚举的艺术

写在前面的话

当我们在查找某个域名的有效子域名时,我们通常需要使用子域名枚举这项技术。但是,除非DNS服务器暴露了完整的DNS空间(涉及到AXFR协议),否则我们真的很难拿到目标域名的子域名列表。

目前主要的技术是使用一个常用域名的字典,并通过对每一个域名尝试进行解析来查找子域名。虽然这种方法在某些情况下非常有效,但是对于那些名字非常奇怪或罕见的域名来说,这种方法就没多大用了。另一种方法就是利用网络爬虫来爬取二级域名,并尝试搜索出子域名的链接地址。当然了,还有一种更加快速的方法,即直接使用搜索引擎。

子域名枚举是网络侦查阶段的一个重要组成部分,在进行攻击之前,网络攻击者需要映射出目标网络的整体结构,并尝试找出一个薄弱点来访问服务器所在的内部网络。

举例说明

在完成了子域名枚举这一过程之后,攻击者在目标DNS空间中找到了下面这个子域名:blog.example.com。攻击者在对Web应用层进行了深度分析之后发现,这个博客使用了Wordpress来作为内容管理系统。那么接下来,攻击者就可以使用wpscan来扫描Wordpress漏洞了。幸运的是,目标网络的Wordpress实例使用了一个存在漏洞的插件,而攻击者可以利用这个插件漏洞来访问目标服务器和内部网络。虽然这个例子听起来有些夸张,但这是一个出现在巴拿马文件中的真实例子。

接下来,我们会给大家介绍几款目前最流行的开源子域名枚举工具以及相关技术。

DNS域传送技术

最简单且最基础的技术就是直接向DNS服务器发送AXFR请求:

dig @ns.example.com example=.com AXFR

DNS域传送技术可以帮我们拷贝主DNS服务器和二级DNS服务器的内容。因此,我们建议各位网络管理员禁止服务器接收来自未认证DNS服务器的AXFR请求,这样就可以防止这种攻击技术了。

注:与DNS域传送技术类似的一项技术名叫NSEC攻击,而这种技术可以枚举出DNSSEC签名空间。

Google

是时候让Google登场了!没错,我们可以使用各种各样的操作符来优化我们的搜索语句。正如之前所述,我们可以使用网络爬虫来爬取目标站点的子域名,而Google和Bing这样的搜索引擎同样可以帮助我们实现这个目标。我们可以使用“site”操作符来寻找目标站点的子域名:

site:example.com

Rapid7 DNS数据集

Rapid7在scans.io库中对外提供了一个DNS学习数据集,这个DNS数据集旨在帮助我们查找到互联网中的所有域名,但实际上这个列表并不完整。下载完最新版本的快照之后,你可以通过“jq”命令来搜索子域名【参考资料】:

zcat snapshop.json.gz | jq -r 'if (.name | test("\\.example\\.com$")) then.name else empty end'

“jq”命令会根据正则表达式“ending with .example.com”来匹配并查找数据集中所有符合条件的子域名。值得一提的是,免费在线服务DNSDumpster同样使用了这种技术。

Censys.io

Censys.io是scans.io所发布的数据子集的访问接口,它可以通过证书中的关键字来进行搜索,而这通常会帮助我们搜索出新的子域名:

https://censys.io/certificates?q=.example.com

Crt.sh

Crt.sh是COMODO提供的一个在线服务,它同样可以完成证书搜索任务。虽然它所使用的数据集与Censys不同,但两者的核心思想是一样的:即利用证书信息来查找子域名。

https://crt.sh/?q=%25.example.com

需要注意的是,也许有的查询结果为“NXDOMAIN”,而这些域名很有可能存在于目标的内部网络系统中,因为管理员有的时候会利用这些公共服务器的证书来设置内部网络服务器。

Sublist3r

对于子域名枚举来说,目前最热门的开源工具当属Sublist3r了。它可以从多个源中获取查询的输出结果。例如:

-Google-Bing-Virustotal-crt.sh-...

虽然绝大多数情况下它所返回的数据都是正确的,但你有可能会遇到一些无法解析的子域名(例如响应为“NXDOMAIN”的域名)。这是因为Sublist3r会最大程度地查询可能存在的子域名,而不会去验证这些域名是否真实存在。

Sublist3r还使用了一个名叫subbrute的独立项目,而Subbrute使用了一个常用子域名字典,并通过这个字典来找出可以正常解析的子域名集合。

使用方法如下:

python sublist3r.py -d example.com

运行之后,系统将会显示出example.com的所有子域名。

theHarvester

这里要介绍的另一款开源情报收集工具就是theHarvester,它可以寻找出与目标域名有关的电子邮箱地址、子域名和虚拟主机。但是与Sublist3r相比,它所能提供的子域名查询结果十分有限。

使用命令如下

python theHarvester.py -d example.com -b all

Smart DNS Brute-Forcer (SDBF)

子域名枚举工具中通常都包含有一个需要进行尝试解析的常见子域名列表,而我们可以利用马尔可夫链的知识来扩展这种技术。例如当你查找到了www1之后,也许www2也会存在,以此类推。这篇研究论文对这项技术进行了非常详细的介绍,而SDBF的查询结果要比简单的关键字枚举技术丰富得多。

总结

下面这张图片显示的是我们使用各种工具对whitehoust.gov所进行的子域名枚举结果,数据收集与2017年4月24日。

本文所介绍的这些工具和技术不仅是攻击者需要学习的,而且网站管理员同样应该好好看一看。因为对于网站管理员来说,只有通过定期检查才能确定哪些子域名已经暴露在了攻击者的视线范围之内。换句话说,对自己的网络环境进行定期的网络侦查将会给你提供更大的安全可见度。

除此之外,那些被遗忘的子域名很可能会成为攻击者的切入点,而这些子域名也会让你的网站面临子域名接管等威胁,有时甚至还会让企业的整个网络被非法入侵。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-05-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构沉思录

Web系统权限控制如何设计

这篇文章的定位,不是宣传某个框架,仅仅之是梳理一下有关权限方面的一些想法和最近项目中的一些探索过程。 我们主要想解决一下问题。

2642
来自专栏QQ音乐前端团队专栏

自己动手打造前端性能监控系统

我们从三个各方面,前端上报,数据收集和入库,数据展示来介绍了如何打造一个测速系统。

91110
来自专栏lonelydawn的前端猿区

大白话谈 Git

一、Git是什么? 定义 Git 的定义 是 一款免费、开源的版本控制系统。 免费不必多说;开源则是指将源代码公布,并允许公众查看、修改代码。 如果我们将项目每...

3056
来自专栏Golang语言社区

Golang适合高并发场景的原因分析

典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力。 360消息推送的数据: 16台机器,标配:24个硬件线程,64GB内存 Linux K...

4857
来自专栏芋道源码1024

小谈 Java 单元测试

总之有无数种理由不想写UT,作为工作不到三年的菜鸟深有体会。之前在点评工作的时候,团队的“UT”都集中于RPC的服务端。为啥带双引号? 因为RPC的服务端没有页...

1163
来自专栏腾讯Bugly的专栏

《手Q Android线程死锁监控与自动化分析实践》

一、问题背景 手Q每个版本上线以后研发同学都会收到各种问题反馈。在跟进手Q内部用户反馈的问题时,发现多例问题,其表象和原因如下: 1、问题表象:“未读不消失”、...

4319
来自专栏玉树芝兰

如何用 pipenv 克隆 Python 教程代码运行环境?(含视频讲解)

咱们的 Python 教程代码已经可以免安装在线运行了。但如果你希望在本地克隆运行环境,请参考本文的步骤说明。

1083
来自专栏嵌入式程序猿

让你的代码向MISRA靠近

MISRA全称是Motor Industry Software Reliability Association, 最早发布于1998年,现在最新的版本是MISR...

732
来自专栏张旭舟的专栏

【腾讯云的1001种玩法】利用腾讯云搭建个人博客

利用腾讯云搭建个人博客背景闲扯作为一个程序员,都会想搭建一个自己的技术博客的,我也不例外。刚工作的时候,不会网站相关技术,只能利用wordpress部署一套现成...

4.5K0
来自专栏Linyb极客之路

API设计:先思考再编码

1083

扫码关注云+社区