域名資產收集整理實踐篇
多工具組合收集子域名
主要完成以下工作:
1、使用 Oneforall、amass、ksubdomain 針對目標進行域名收集
2、將所有結果進行匯總,然后提取所有目標到對應的文件中
3、使用 dnsgen 基于收集到的域名列表,生成新的字典,然后使用 ksubdomain 進行驗證
4、最后將所有存活的域名和IP對應列表整理出來,輸出文件
其中涉及開源工具以及自定義腳本實現數據的整合處理。
第一步:使用 Onefoall 實現子域名收集
使用命令(只進行域名收集,不做存活驗證):
python3 oneforall.py --target xazlsec.com --req False run
結果格式如下:
cat results/xazlsec.com.csv

第二步:使用 amass 實現子域名收集
使用命令(被動+枚舉):
amass enum -v -src -ip -brute -d xazlsec.com -o xazlsec-amass.txt
結果格式如下:

第三步:使用 ksubdomain 實現子域名收集
提前準備字典(針對泛解析域名,效果一般,需要手動去掉與泛解析結果相同的域名),命令:
ksubdomain enum -d xazlsec.com -f dns.txt -o xazlsec-ksub.txt
結果如圖:

針對大文件做 dns 枚舉存在丟包的情況
1、可以使用自定義腳本或者 split 對大文件進行分割
split -l 1000 subdomain.txt subs/
分割后的文件保存至目錄 subs 中
2、簡單寫一個腳本,生成一個 bash 腳本
import os
for item in os.listdir('subs/'): print("./ksubdomain v --dns-type a -f subs/{} -o a/{}".format(item, item))
python3 gen.py > scana.sh
最后執行:
bash scana.sh
第四步:編寫腳本,實現數據整合
首先將三個工具的結果文件放置在相同目錄下,方便調用,也可以不用,編寫腳本時,指定路徑即可,以上三種工具的結果分別是:
Oneforall: /usr/src/github/OneForAll/results/xazlsec.com.csv Amass: /root/xazlsec-amass.txt ksubdomain: /root/xazlsec-ksub.txt
下面是一個簡單腳本,將三個文件中的域名提取出來進行去重匯總;
#!/usr/bin/env python3#-*- coding: utf-8 -*-
Oneforall="/usr/src/github/OneForAll/results/xazlsec.com.csv"Amass="/root/xazlsec-amass.txt"ksubdomain="/root/xazlsec-ksub.txt"
#讀取 Oneforall 的結果#id,alive,request,resolve,url,subdomain,level,cname,ip,public,cdn,port,status,reason,title,banner,cidr,asn,org,addr,isp,sourcedef readOneforall(filename): domain2ip = {} for item in open(filename): sub = item.strip().split(',')[5] ip = item.strip().split(',')[8] if sub != "subdomain": domain2ip[sub] = ip return domain2ip
#讀取 amass 的結果def readAmass(filename): domain2ip = {} for item in open(filename): sub = item.strip().split(' ')[-2] ip = item.strip().split(' ')[-1] domain2ip[sub] = ip return domain2ip
#讀取 ksubdomain 的結果def readKsubdomain(filename): domain2ip = {} for item in open(filename): sub = item.strip().split('=>')[0] ip = item.strip().split('=>')[-1] domain2ip[sub] = ip return domain2ip
#保存結果def saveResults(domain2ip): obj = open("results.txt", 'a+', encoding='utf-8') for sub in domain2ip: ip = domain2ip[sub] obj.writelines(sub+'') obj.close()
if __name__=="__main__": o = readOneforall(Oneforall) a = readAmass(Amass) k = readKsubdomain(ksubdomain) domain2ip = o for sub in a: ip = a[sub] domain2ip[sub] = ip for sub in k: ip = k[sub] domain2ip[sub] = ip saveResults(domain2ip)
使用方法也很簡單,將你本地的文件路徑進行替換,然后執行該腳本,最后結果保存至文件 results.txt 中:

第五步:使用 dnsgen 基于已知域名生成新的字典
需要將所有子域名保存至文件中,不包含 IP 地址的純子域列表,然后使用命令:
dnsgen results.txt -w word.txt > newdns.txt
為了方便,可以將之前收集的域名一起放在這個新域名列表中,最終解析的結果就是一個比較全面的結果,只需提取其中的域名和IP即可:
cat results.txt >> newdns.txt
最后使用 ksubdomain 進行最后的解析操作:
ksubdomain verify -f newdns.txt -o newsub.txt
最后的 newsub.txt 就是之前所有步驟中收集的所有子域名列表,為后續的操作提供數據支持。
第六步:排除泛解析域名
排除思路,首先判斷域名是否存在泛解析,如果存在則啟動排除泛解析的程序,排除方法的話,可以保留與泛解析 IP 一致的結果中的三個,其余的都進行刪除。這個操作最好只針對暴力枚舉階段的結果進行排除,也就是針對 ksubdomain 產生的結果。
實現上面功能的腳本,如下:
#!/usr/bin/env python3#-*- coding: utf-8 -*-
import sysimport randomimport stringimport dns.resolver
#讀取 ksubdomain 的結果def readKsubdomain(filename): domain2ip = {} for item in open(filename): sub = item.strip().split('=>')[0] ip = item.strip().split('=>')[-1] domain2ip[sub] = ip return domain2ip
#判斷域名是否存在泛解析def judgeWildcard(domain): randstr = ''.join(random.choices(string.ascii_letters + string.digits, k=32)) try: answer = dns.resolver.Resolver().resolve(randstr + "." +domain) for a in answer: return str(a) except: return False
#保存結果def saveResults(domain2ip): obj = open("ksubresults.txt", 'a+', encoding='utf-8') for sub in domain2ip: ip = domain2ip[sub] obj.writelines(sub+"\t"+ip+'') obj.close()
if __name__=="__main__": domain = sys.argv[1] wildcard = judgeWildcard(domain) if not wildcard: print("[-]不存在泛解析,程序退出") filename = sys.argv[2] d2i = readKsubdomain(filename) newd2i = {} i = 0 for sub in d2i: ip = d2i[sub] if ip == wildcard: i = i + 1 if i > 3: continue newd2i[sub] = ip
saveResults(newd2i) print('[+]存在泛解析,結果保存至:ksubresults.txt')

其他部分內容
今天分享是是整個過程中的第一階段,如何從主域名到子域名列表的跨越,其余四階段分別為:
- 從 IP 到端口到網站鏈接的跨越
- 從網站鏈接到網站信息的跨越,包括存活驗證、去重、指紋識別、waf 識別、網站截圖等技術
- 從存活網站到 URL 列表的跨越,包括帶參數 url 去重
- 從網站信息到漏洞發現的跨越,包括漏掃工具的組合
以上部分內容均已更新至信安之路 wiki,均以實驗操作步驟的方式提供,大大減少操作難度,讓你完整體驗整個過程,歡迎注冊體驗。