搜索
查看: 1269|回复: 1

子域名挖掘再研究

[复制链接]

26

主题

29

帖子

147

积分

我是新手

Rank: 1

积分
147
发表于 2016-7-17 21:25:06 | 显示全部楼层 |阅读模式
导言

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

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

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

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

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

https://www.baidu.com

[/url]

[url=https://vpn.sohu-inc.com/]https://vpn.sohu-inc.com

[/url]

(以上图片来自乌云Zone)

[url=https://crt.sh/]Certificate Search L.N.师傅贡献

网络深度爬虫

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

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. # author=dave.fang@outlook.com
  4. # create=20160701
  5. import re
  6. import requests
  7. from pprint import pprint
  8. def crawl_page(url, domain):
  9. print('[*] Crawl URL: {0}'.format(url))
  10. found_url = set()
  11. req = requests.get(url, timeout=15)
  12. content = req.text
  13. link_list = re.findall(r"(?<=href=").+?(?=")|(?<=href=\').+?(?=\')", content)
  14. for url in link_list:
  15. result = re.findall('http[s]?://(.*?)\.sina\.com\.cn', url)
  16. if len(result) > 0:
  17. found_url.add('{0}.{1}'.format(result[0], domain))
  18. pprint(found_url)
  19. if __name__ == '__main__':
  20. page_url = 'http://www.sina.com.cn/'
  21. main_domain = 'sina.com.cn'
  22. crawl_page(page_url, main_domain)
复制代码

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

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

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

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

实例g-queen.com:

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

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

搜索引擎辅助采集

例如在Google中搜索:

  1. site:qq.com
复制代码

[/url]

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

crossdomain.xml辅助采集

以[url=http://www.sina.com.cn/crossdomain.xml]http://www.sina.com.cn/crossdomain.xml为例:

  1. <cross-domain-policy>
  2. <allow-access-from domain="http://all.vic.sina.com.cn"/>
  3. </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请求部分的:

[/url]

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

[url=http://www.davex.pw/images/how_to_fuzz_domain/dns_respond.png]

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

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

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

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

  1. alitrip.com
  2. taobao.com
  3. tmall.com
  4. 52pk.com
  5. focus.cn
复制代码
Reference

企业域名收集 - WooYun Wiki

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

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

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

DNS报文结构实例解析 - bluemonster


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?Join BUC

x

0

主题

5

帖子

29

积分

我是新手

Rank: 1

积分
29
发表于 2016-7-18 18:08:10 | 显示全部楼层
文章赞一个~
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表