文章内容介绍
本篇文章仅讨论如何挖掘出更多的子域名,其它不作分析。
先说说我常用的挖掘子域名的手段:
- OneForAll
- Open Data
- subDomainsBrute/Layer子域名挖掘机
- Sublist3r
- JSFinder
- 其它补充
Oneforall:
一款集百家之长,功能强大的全面快速子域收集终极神器,收集子域名快速且全面,但要注意一定要配置API,否则收集的子域名会不够全。
Open Data:
Rapid7的Open Data项目进行了整个Internet的调查,以深入了解全球常见漏洞的风险,它收集所有IPv4地址的DNS记录。
它本身也提供了一个查询子域名的接口:subdomain
但是它有一定的局限性,不支持批量查询和模糊查询。
这里我们可以把Open Data中的rdns和fdns导入数据库中,推荐使用clickhouse,然后再进行查询,这对笔记本的性能有一定要求。
具体过程请参考:如何搭建一个自己的DNS域名检索系统
subDomainsBrute
爆破子域名也是收集子域名的重要方法之一,爆破脚本已经有了,剩下的就是去完善自己的子域名爆破字典。
Sublist3r
项目地址:https://github.com/aboul3la/Sublist3r
Sublist3r使用许多搜索引擎(例如Google,Yahoo,Bing,Baidu和Ask)枚举子域。Sublist3r还使用Netcraft,Virustotal,ThreatCrowd,DNSdumpster和ReverseDNS枚举子域。
使用该脚本主要是对oneforall的一个补充。
python2 sublist3r.py -d huazhu.com -p 80,443,8080 -o huazhu.txt
建议:挂代理以后再运行脚本
JSFinder
JSFinder是一款用作快速在网站的js文件中提取URL,子域名的工具。
使用条件:通过前面几步收集到了大多数的子域名后,将收集到的子域名分别以http和https协议生成url字典,然后使用JsFinder挖掘更多子域名
在线站点:
https://www.nmmapper.com/sys/tools/subdomainfinder/
https://w-e-b.site/?act=findomain
三级子域名发现:
通过去查找主域名的证书信息,得到三级域名的证书信息:
curl -s "https://rapiddns.io/subdomain/tencent.com?full=1" | grep -oP '_blank">\K[^<]*' | grep \* |sort -u

然后把*号去掉,进行三级子域名爆破。如果没结果,可以多请求几次试试
其他补充:
1、通过扫描C段获取ip138中存在历史解析的ip,然后在ip138中进行ip反查得到更多的子域名。我自己写了个demo来实现,个人代码水平贼菜,大佬轻喷,主要通过以下两个步骤来实现
1.通过扫描C段获取ip138中存在历史解析的ip
2.把获取到的ip放到ip138进行反查,查找ip的历史解析记录
import requests
import re
import time
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
requests.packages.urllib3.disable_warnings()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 OPR/52.0.2871.40'
}
# 通过扫描C段获取ip138中存在历史解析的ip
def ip_find():
with open(r'ips.txt', 'r') as f1: #ips.txt的内容为通过上述手段收集到的ip的C段,如110.110.110.0/24
ips = [line.strip() for line in f1.readlines()]
for ip in ips:
url0 = 'https://chapangzhan.com/' + ip
r0 = requests.get(
url0,
headers=headers,
allow_redirects=True,
verify=False,
timeout=30)
html0 = r0.text
status0 = r0.status_code
response0 = HtmlResponse(html0, body=html0, encoding='utf-8')
selector0 = Selector(response=response0)
xpath = '/html/body/div/div[2]/div/div[1]/div[1]/div/div[2]/table/tfoot/tr/th[1]/b'
count_result = selector0.xpath(xpath)
ok = re.findall(r'(?<=<b>).*(?=</b>)', str(count_result))
count = " ".join(ok)
for i in range(int(count)):
j = i + 1
xpath2 = '/html/body/div/div[2]/div/div[1]/div[1]/div/div[2]/table/tbody/tr[' + str(
j) + ']/td[1]/a'
ip_result = selector0.xpath(xpath2).extract()
ok2 = re.findall(r'(?<=>).*(?=</a>)', str(ip_result))
get_ip = " ".join(ok2)
ip_list.append(get_ip)
print('ip采集完成,共', len(ip_list), '个')
# 查找IP的历史解析记录————域名
def domain_find():
for line in ip_list:
begin = 3
url = 'https://site.ip138.com/' + line + '/'
r = requests.get(
url,
headers=headers,
allow_redirects=True,
verify=False,
timeout=30)
html = r.text
status = r.status_code
count = re.findall(r'-----', html)
response = HtmlResponse(html, body=html, encoding='utf-8')
selector = Selector(response=response)
print(url + ':' + str(status))
time.sleep(0.5)
for i in range(len(count)):
content = '//*[@id="list"]/li[' + str(begin) + ']/a'
begin = begin + 1
result = selector.xpath(content)
result = str(result.extract()).split('/')
result = result[1]
domain = result.split('.')[-1]
domain = '.' + domain
Domain = result.split(domain)[0].split('.')
Domain = Domain[-1] + domain
if Domain == 'com.cn':
domain = result.split('.')[1]
Domain = domain + '.com'
print(line + '\t' + Domain + '\t' + result + '\t' + str(status))
domain_set.add(line + '\t' + Domain + '\t' + result + '\n')
def main():
ip_find()
domain_find()
b = list(domain_set)
b.sort()
fr = open(r'ip138.txt', 'w+') #得到结果,生成ip138.txt
fr.writelines(b)
fr.close()
if __name__ == '__main__':
ip_list = []
domain_set = set()
main()
2、另外我们要关注厂商是否存在微信小程序,尝试去进行抓包获取子域名,往往能发现一些通过上述手段没有收集到的子域名,另外小程序的源码可能会暴露一些子域名:

网友评论