|
原文链接:域名资产收集整理实践篇
之前一位学员分享了一个关于自动化挖洞的方法论《我的渗透测试方法论》完整讲述了如何从一个域名开始到最终的漏洞扫描,但是对于初学者而言,知道思路,从思路到实践又有很长的路要走,今天来分享下第一阶段的工作如何做。
多工具组合收集子域名
主要完成以下工作:
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 实现子域名收集
提前准备字典(针对泛解析域名,效果一般,需要手动去掉与泛解析结果相同的域名),命令:
结果如图:
针对大文件做 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
复制代码 最后执行:
第四步:编写脚本,实现数据整合
首先将三个工具的结果文件放置在相同目录下,方便调用,也可以不用,编写脚本时,指定路径即可,以上三种工具的结果分别是:
- 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,source
- def 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+'\n')
- 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 sys
- import random
- import string
- import 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+'\n')
- 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 去重
从网站信息到漏洞发现的跨越,包括漏扫工具的组合
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|