文章內(nèi)容介紹
本篇文章僅討論如何挖掘出更多的子域名口叙,其它不作分析炼绘。
先說(shuō)說(shuō)我常用的挖掘子域名的手段:
- OneForAll
- Open Data
- subDomainsBrute/Layer子域名挖掘機(jī)
- Sublist3r
- JSFinder
- 其它補(bǔ)充
Oneforall:
一款集百家之長(zhǎng),功能強(qiáng)大的全面快速子域收集終極神器妄田,收集子域名快速且全面俺亮,但要注意一定要配置API,否則收集的子域名會(huì)不夠全疟呐。
Open Data:
Rapid7的Open Data項(xiàng)目進(jìn)行了整個(gè)Internet的調(diào)查脚曾,以深入了解全球常見(jiàn)漏洞的風(fēng)險(xiǎn),它收集所有IPv4地址的DNS記錄启具。
它本身也提供了一個(gè)查詢子域名的接口:subdomain
但是它有一定的局限性本讥,不支持批量查詢和模糊查詢。
這里我們可以把Open Data中的rdns和fdns導(dǎo)入數(shù)據(jù)庫(kù)中鲁冯,推薦使用clickhouse拷沸,然后再進(jìn)行查詢,這對(duì)筆記本的性能有一定要求薯演。
具體過(guò)程請(qǐng)參考:如何搭建一個(gè)自己的DNS域名檢索系統(tǒng)
subDomainsBrute
爆破子域名也是收集子域名的重要方法之一撞芍,爆破腳本已經(jīng)有了,剩下的就是去完善自己的子域名爆破字典涣仿。
Sublist3r
項(xiàng)目地址:https://github.com/aboul3la/Sublist3r
Sublist3r使用許多搜索引擎(例如Google勤庐,Yahoo示惊,Bing,Baidu和Ask)枚舉子域愉镰。Sublist3r還使用Netcraft米罚,Virustotal,ThreatCrowd丈探,DNSdumpster和ReverseDNS枚舉子域录择。
使用該腳本主要是對(duì)oneforall的一個(gè)補(bǔ)充。
python2 sublist3r.py -d huazhu.com -p 80,443,8080 -o huazhu.txt
建議:掛代理以后再運(yùn)行腳本
JSFinder
JSFinder是一款用作快速在網(wǎng)站的js文件中提取URL碗降,子域名的工具隘竭。
使用條件:通過(guò)前面幾步收集到了大多數(shù)的子域名后,將收集到的子域名分別以http和https協(xié)議生成url字典讼渊,然后使用JsFinder挖掘更多子域名
在線站點(diǎn):
https://www.nmmapper.com/sys/tools/subdomainfinder/
https://w-e-b.site/?act=findomain
三級(jí)子域名發(fā)現(xiàn):
通過(guò)去查找主域名的證書信息动看,得到三級(jí)域名的證書信息:
curl -s "https://rapiddns.io/subdomain/tencent.com?full=1" | grep -oP '_blank">\K[^<]*' | grep \* |sort -u
然后把*號(hào)去掉,進(jìn)行三級(jí)子域名爆破爪幻。如果沒(méi)結(jié)果菱皆,可以多請(qǐng)求幾次試試
其他補(bǔ)充:
1、通過(guò)掃描C段獲取ip138中存在歷史解析的ip挨稿,然后在ip138中進(jìn)行ip反查得到更多的子域名仇轻。我自己寫了個(gè)demo來(lái)實(shí)現(xiàn),個(gè)人代碼水平賊菜奶甘,大佬輕噴篷店,主要通過(guò)以下兩個(gè)步驟來(lái)實(shí)現(xiàn)
1.通過(guò)掃描C段獲取ip138中存在歷史解析的ip
2.把獲取到的ip放到ip138進(jìn)行反查,查找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'
}
# 通過(guò)掃描C段獲取ip138中存在歷史解析的ip
def ip_find():
with open(r'ips.txt', 'r') as f1: #ips.txt的內(nèi)容為通過(guò)上述手段收集到的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), '個(gè)')
# 查找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+') #得到結(jié)果,生成ip138.txt
fr.writelines(b)
fr.close()
if __name__ == '__main__':
ip_list = []
domain_set = set()
main()
2侣监、另外我們要關(guān)注廠商是否存在微信小程序鸭轮,嘗試去進(jìn)行抓包獲取子域名,往往能發(fā)現(xiàn)一些通過(guò)上述手段沒(méi)有收集到的子域名橄霉,另外小程序的源碼可能會(huì)暴露一些子域名: