子域名挖掘再研究

导言

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

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

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

  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