安全矩阵

 找回密码
 立即注册
搜索
查看: 321|回复: 0

域名资产收集整理实践篇

[复制链接]

179

主题

179

帖子

630

积分

高级会员

Rank: 4

积分
630
发表于 2023-3-22 20:51:15 | 显示全部楼层 |阅读模式
原文链接:域名资产收集整理实践篇
之前一位学员分享了一个关于自动化挖洞的方法论《我的渗透测试方法论》完整讲述了如何从一个域名开始到最终的漏洞扫描,但是对于初学者而言,知道思路,从思路到实践又有很长的路要走,今天来分享下第一阶段的工作如何做。

多工具组合收集子域名

主要完成以下工作:

1、使用 Oneforall、amass、ksubdomain 针对目标进行域名收集

2、将所有结果进行汇总,然后提取所有目标到对应的文件中

3、使用 dnsgen 基于收集到的域名列表,生成新的字典,然后使用 ksubdomain 进行验证

4、最后将所有存活的域名和IP对应列表整理出来,输出文件

其中涉及开源工具以及自定义脚本实现数据的整合处理。

第一步:使用 Onefoall 实现子域名收集
使用命令(只进行域名收集,不做存活验证):
  1. python3 oneforall.py --target xazlsec.com --req False run
复制代码
结果格式如下:
  1. cat results/xazlsec.com.csv
复制代码


第二步:使用 amass 实现子域名收集
使用命令(被动+枚举):
  1. amass enum -v -src -ip -brute -d xazlsec.com -o xazlsec-amass.txt
复制代码

结果格式如下:



第三步:使用 ksubdomain 实现子域名收集
提前准备字典(针对泛解析域名,效果一般,需要手动去掉与泛解析结果相同的域名),命令:


结果如图:



针对大文件做 dns 枚举存在丢包的情况
1、可以使用自定义脚本或者 split 对大文件进行分割
  1. split -l 1000 subdomain.txt subs/
复制代码
分割后的文件保存至目录 subs 中

2、简单写一个脚本,生成一个 bash 脚本

  1. import os

  2. for item in os.listdir('subs/'):
  3.     print("./ksubdomain v --dns-type a -f subs/{} -o a/{}".format(item, item))
  4. python3 gen.py > scana.sh
复制代码
最后执行:
  1. bash scana.sh
复制代码

第四步:编写脚本,实现数据整合
首先将三个工具的结果文件放置在相同目录下,方便调用,也可以不用,编写脚本时,指定路径即可,以上三种工具的结果分别是:

  1. Oneforall: /usr/src/github/OneForAll/results/xazlsec.com.csv Amass: /root/xazlsec-amass.txt ksubdomain: /root/xazlsec-ksub.txt
复制代码

下面是一个简单脚本,将三个文件中的域名提取出来进行去重汇总;

  1. #!/usr/bin/env python3
  2. #-*- coding: utf-8 -*-

  3. Oneforall="/usr/src/github/OneForAll/results/xazlsec.com.csv"
  4. Amass="/root/xazlsec-amass.txt"
  5. ksubdomain="/root/xazlsec-ksub.txt"

  6. #读取 Oneforall 的结果
  7. #id,alive,request,resolve,url,subdomain,level,cname,ip,public,cdn,port,status,reason,title,banner,cidr,asn,org,addr,isp,source
  8. def readOneforall(filename):
  9.     domain2ip = {}
  10.     for item in open(filename):
  11.         sub = item.strip().split(',')[5]
  12.         ip = item.strip().split(',')[8]
  13.         if sub != "subdomain":
  14.             domain2ip[sub] = ip
  15.     return domain2ip


  16. #读取 amass 的结果
  17. def readAmass(filename):
  18.     domain2ip = {}
  19.     for item in open(filename):
  20.         sub = item.strip().split(' ')[-2]
  21.         ip = item.strip().split(' ')[-1]
  22.         domain2ip[sub] = ip
  23.     return domain2ip



  24. #读取 ksubdomain 的结果
  25. def readKsubdomain(filename):
  26.     domain2ip = {}
  27.     for item in open(filename):
  28.         sub = item.strip().split('=>')[0]
  29.         ip = item.strip().split('=>')[-1]
  30.         domain2ip[sub] = ip
  31.     return domain2ip


  32. #保存结果
  33. def saveResults(domain2ip):
  34.     obj = open("results.txt", 'a+', encoding='utf-8')
  35.     for sub in domain2ip:
  36.         ip = domain2ip[sub]
  37.         obj.writelines(sub+'\n')
  38.     obj.close()

  39. if __name__=="__main__":
  40.     o = readOneforall(Oneforall)
  41.     a = readAmass(Amass)
  42.     k = readKsubdomain(ksubdomain)
  43.     domain2ip = o
  44.     for sub in a:
  45.         ip = a[sub]
  46.         domain2ip[sub] = ip
  47.     for sub in k:
  48.         ip = k[sub]
  49.         domain2ip[sub] = ip
  50.     saveResults(domain2ip)
  51. 使用方法也很简单,将你本地的文件路径进行替换,然后执行该脚本,最后结果保存至文件 results.txt 中:

  52. 图片

  53. 第五步:使用 dnsgen 基于已知域名生成新的字典
  54. 需要将所有子域名保存至文件中,不包含 IP 地址的纯子域列表,然后使用命令:

  55. dnsgen results.txt -w word.txt > newdns.txt

  56. 为了方便,可以将之前收集的域名一起放在这个新域名列表中,最终解析的结果就是一个比较全面的结果,只需提取其中的域名和IP即可:

  57. cat results.txt >> newdns.txt

  58. 最后使用 ksubdomain 进行最后的解析操作:

  59. ksubdomain verify -f newdns.txt -o newsub.txt

  60. 最后的 newsub.txt 就是之前所有步骤中收集的所有子域名列表,为后续的操作提供数据支持。

  61. 第六步:排除泛解析域名
  62. 排除思路,首先判断域名是否存在泛解析,如果存在则启动排除泛解析的程序,排除方法的话,可以保留与泛解析 IP 一致的结果中的三个,其余的都进行删除。这个操作最好只针对暴力枚举阶段的结果进行排除,也就是针对 ksubdomain 产生的结果。

  63. 实现上面功能的脚本,如下:

  64. #!/usr/bin/env python3
  65. #-*- coding: utf-8 -*-

  66. import sys
  67. import random
  68. import string
  69. import dns.resolver

  70. #读取 ksubdomain 的结果
  71. def readKsubdomain(filename):
  72.     domain2ip = {}
  73.     for item in open(filename):
  74.         sub = item.strip().split('=>')[0]
  75.         ip = item.strip().split('=>')[-1]
  76.         domain2ip[sub] = ip
  77.     return domain2ip


  78. #判断域名是否存在泛解析
  79. def judgeWildcard(domain):
  80.     randstr = ''.join(random.choices(string.ascii_letters + string.digits, k=32))
  81.     try:
  82.         answer = dns.resolver.Resolver().resolve(randstr + "." +domain)
  83.         for a in answer:
  84.             return str(a)
  85.     except:
  86.         return False

  87. #保存结果
  88. def saveResults(domain2ip):
  89.     obj = open("ksubresults.txt", 'a+', encoding='utf-8')
  90.     for sub in domain2ip:
  91.         ip = domain2ip[sub]
  92.         obj.writelines(sub+"\t"+ip+'\n')
  93.     obj.close()


  94. if __name__=="__main__":
  95.     domain = sys.argv[1]
  96.     wildcard = judgeWildcard(domain)
  97.     if not wildcard:
  98.         print("[-]不存在泛解析,程序退出")
  99.     filename = sys.argv[2]
  100.     d2i = readKsubdomain(filename)
  101.     newd2i = {}
  102.     i = 0
  103.     for sub in d2i:
  104.         ip = d2i[sub]
  105.         if ip == wildcard:
  106.             i = i + 1
  107.             if i > 3:
  108.                 continue
  109.         newd2i[sub] = ip

  110.     saveResults(newd2i)
  111.     print('[+]存在泛解析,结果保存至:ksubresults.txt')
复制代码


其他部分内容
今天分享是是整个过程中的第一阶段,如何从主域名到子域名列表的跨越,其余四阶段分别为:

从 IP 到端口到网站链接的跨越
从网站链接到网站信息的跨越,包括存活验证、去重、指纹识别、waf 识别、网站截图等技术
从存活网站到 URL 列表的跨越,包括带参数 url 去重
从网站信息到漏洞发现的跨越,包括漏扫工具的组合



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-3-29 13:46 , Processed in 0.015045 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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