子域名挖掘再研究

导言

工欲善其事必先利其器,研究一家厂商就要从不同的角度和姿势去研究,多手抓多手也要硬。

今天再度研究一下子域名挖掘的方法,重点谈子域名爆破的方法,以及解决某些问题的方法。

采集的姿势大致如下,每一个姿势都会配一个案例。

  1. SSL 域名证书
  2. 网站深度爬虫
  3. 利用域传送漏洞
  4. 搜索引擎辅助采集
  5. crossdomain.xml 辅助采集
  6. 子域名枚举爆破

SSL 域名证书

大厂商的 SSL 证书一般都是一证多用,根据这个特性,可以得知一些子域名。

https://www.baidu.com

Baidu SSL Cert

https://vpn.sohu-inc.com

Sohu Inc. SSL Cert

(以上图片来自乌云 Zone)

Certificate Search L.N.师傅贡献

网络深度爬虫

www.sina.com.cn为例,我们使用正则表达式抓取页面以sina.com.cn结尾的所有的 URL(一级深度)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
# coding=utf-8
# author=dave.fang@outlook.com
# create=20160701
import re
import requests

from pprint import pprint


def crawl_page(url, domain):
    print('[*] Crawl URL: {0}'.format(url))
    found_url = set()
    req = requests.get(url, timeout=15)
    content = req.text
    link_list = re.findall(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')", content)
    for url in link_list:
        result = re.findall('http[s]?://(.*?)\.sina\.com\.cn', url)
        if len(result) > 0:
            found_url.add('{0}.{1}'.format(result[0], domain))
    pprint(found_url)


if __name__ == '__main__':
    page_url = 'http://www.sina.com.cn/'
    main_domain = 'sina.com.cn'
    crawl_page(page_url, main_domain)

一级深度爬出来的结果,就有 146 个子域名,这个小脚本权当抛砖引玉,可以再深度定制。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[*] Crawl URL: http://www.sina.com.cn/
{'2016.sina.com.cn',
 'ah.sina.com.cn',
 'ai.lottery.sina.com.cn',
 'aipai.sina.com.cn',
 'app.sina.com.cn',
 'astro.sina.com.cn',
 'auto.sina.com.cn',
 'career.sina.com.cn',
 ...
 'golf.sina.com.cn',
 'zx.jiaju.sina.com.cn'}
 [*] Found Links Num: 146

利用域传送漏洞

因为对 DNS 服务器配置不当,导致任意 IP 都可以直接向 DNS 服务器请求数据,从而导致该域名的所有子域名暴露。

清华大学某分站DNS域传送漏洞

实例g-queen.com

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
root@DaveX ~/D/FuzSub> python3 fuzz.py g-queen.com
[*] FuzSub is hot.
[*] Target: g-queen.com
[+] Name Server:  ['ns1.i-netex.com', 'ns2.i-netex.com']
[*] Checking: g-queen.com NS: ns1.i-netex.com
[*] Checking: g-queen.com NS: ns2.i-netex.com
[+] g-queen.com HAS THE ZONE TRANSFER VULNERABILITY
	@ 86400 IN SOA ns1.i-netex.com. techadmin.oc11.com. 1371851839 10800 3600 604800 86400
	@ 86400 IN NS ns1.i-netex.com.
86400 IN NS ns2.i-netex.com.
	@ 86400 IN A b'67.43.170.100'
	@ 86400 IN MX 10 mail
	@ 86400 IN TXT "v=spf1 +ip4:67.43.170.xn--0/24  all" "-j1f"
	admin 86400 IN A b'67.43.170.12'
	ml 86400 IN A b'67.43.170.25'
	ml 86400 IN MX 50 ml
	www3 86400 IN A b'67.43.170.100'
	webmail 86400 IN A b'67.43.170.2'
	ftp 86400 IN CNAME @
	munin 86400 IN A b'67.43.170.104'
	m 86400 IN A b'67.43.170.100'
	cache1 86400 IN A b'67.43.170.67'
	ana 86400 IN A b'67.43.170.52'
	ns 86400 IN A b'67.43.170.2'
	mail 86400 IN A b'67.43.170.2'
	lists 86400 IN CNAME @
	www4 86400 IN A b'67.43.170.100'
	www 86400 IN CNAME @
	www2 86400 IN A b'67.43.170.100'
[*] Done!
[*] Total Time Consumption: 8s

这就有可能会获得一些敏感信息,帮助后续的测试。

搜索引擎辅助采集

例如在 Google 中搜索:

1
site:qq.com

Google Hack qq.com

但是搜索引擎查询都会做一些反制爬虫的手段,目前使用 google 去采集的方法是调用 google 的官方 API,或者调用 bing 的 API 去辅助采集。

crossdomain.xml 辅助采集

http://www.sina.com.cn/crossdomain.xml为例:

1
2
3
<cross-domain-policy>
	<allow-access-from domain="http://all.vic.sina.com.cn"/>
</cross-domain-policy>

我们可以从中获取all.vic.sina.com.cn这个子域名。

子域名枚举爆破

原理很简单,向 DNS 服务器(如 8.8.8.8 和 8.8.4.4)请求字典里面的子域名,看返回的数据里面是否有记录,如果有则说明这是一个存在的子域名。

比如说,向 114.114.114.114 定向请求www.qq.com的记录,返回了一条 A 记录指向182.254.34.74,就说明存在这个域名;相应的请求wooyun.qq.com并没有相应的记录返回,这就说明没有这个域名存在。

注:一般只使用同一套主、副 DNS,即 8.8.8.8 和 8.8.4.4,DNS 服务器不宜混搭,否则容易出现大量误报

发包可以用第三方库,比如说 lijiejie 的 subDomainBrute 使用了dnspython这个包。使用第三方包的确好,但是免不了一层封装和不能很好地理解 DNS 报文协议,也可能会降低一定的效率,和没有解决泛解析的好办法

泛解析这个问题的解决方法很简单,向 DNS 请求*记录,然后把枚举子域名回来的记录和*的记录比对,如果相同则直接排除。

但是实际上,如果使用第三方包,不自己造轮子的话,是无法实现这个的。因为有些域名的*记录是 CNAME,而第三方包只能解析出 IP 却不会返回出 CNAME 给你。

举个例子,以www.baidu.com,大家 ping 一下都知道会跳转到www.a.shifen.com,这就是一个 CNAME 记录,但是我们用第三方包只能获得最后解析出来的 ip。

也就是说,如果一个域名他的泛解析是一个 CNAME 记录而且这又是一个 CDN 域名(恰巧这个又不少),那么不是自己定制的 dns 查询函数,一般都会出现大量泛解析误报。

这就有点像是灯下黑,知道了怎么做就可以了,却一直没有解决的办法。

如果要自己定制的话需要研究一下 DNS 报文协议,这里引用两张图片做简要分析,来源于DNS报文结构实例解析 - bluemonster

这是向 DNS 请求部分的:

DNS Query

这是 DNS 服务器回传的报文:

DNS Respond

只需要按照这个协议的格式做正则提取即可获得我们想要的信息,A 记录的是固定的正则,CNAME 记录需要嵌套一层正则才能获取。

这里不详细说怎么去提取的方法,只给大家抛个砖。

最后附上根据这一原理做出来的一个子域名挖掘工具,FuzSub - GitHub,理论上没有泛解析的误报问题,若有疑问可以 PM 我~

这里提供几个测试域名,都有 CNAME 记录作为泛解析的。

1
2
3
4
5
alitrip.com
taobao.com
tmall.com
52pk.com
focus.cn

Reference

企业域名收集 - WooYun Wiki

子域名挖掘测试总结 - WooYun Zone

分享一个找子域名的小技巧 - WooYun Zone

分享一个找到目标相关联域名的办法 - WooYun Zone

DNS报文结构实例解析 - bluemonster

使用 Hugo 构建
主题 StackJimmy 设计