子域名扫描这个事, 它是把攻击面收敛住、还有把资产梳理清楚的那个基础环节。咱们现在市面上主流的子域名扫描工具呢, 是分成了开源免费那一类跟商业化那一类这两大种, 这是为了适配团队规模大小不一样还有安全需求不一样这么个情况。
那么接下来就从数据源覆盖得全不全、使用的门槛高不高、输出的质量好不好、能不能持续监控这四个维度上边, 对5款工具做一个实测对比, 这个是提供给快速选型参考用的这样一个东西。
1. Subfinder(开源免费子域名扫描工具子域名扫描工具,Go语言)
该项目是由ProjectDiscovery所出品。其工作原理是通过被动查询的方式来获取子域名, 其中涉及的公开数据源数量多达110余个, 常见的如CertSpotter、CrtSh、VirusTotal以及PassiveTotal等。
它能够实现批量获取, 并且不会直接向目标发起任何网络请求, 因此完全不存在误伤的风险。它默认会以纯文本列表这样的形式来输出内容的, 然后配合httpx这种工具的话能够进一步地去验证HTTP状态码以及TLS证书, 以此来判断子域名是不是处于实际存活的这个状态的。
它特别地适合进行大批量的快速拉取操作这种情况, 对于单次扫描数万域名的情况而言, 耗费的时间通常都是在几分钟之内的。
2. Amass(开源免费大城群众说事,OWASP项目)
它支持被动模式、主动模式以及暴力破解模式这三种工作模式, 功能的覆盖范围是最广的。它可以调用Shodan数据、Censys数据以及DNS历史记录等多源的数据。它会生成JARM指纹和DNS记录这样的结构化输出。
输出的格式是JSON或者是CSV。这样的设计便于下游的威胁情报平台进行对接。需要配置的项有很多, 学习起来有点难度, 适合有安全研究背景的团队来做深度的资产测绘相关工作。
3. OneForAll(开源免费,国产)
将二百多个数据源进行合并, 只需要做一次查询, 这个动作就能获得比较高的子域名覆盖范围。在速度方面, 它会比多次去调用单一工具的方式好得多。对于国内的注册商、cdn节点以及中文域名的解析这些内容, 它都表现出良好的支持能力。
输出的结果里面, 会自己包含去重步骤以及基础的存活标记信息。如果是在那些完全开源的工具里面进行挑选的话, 它是针对国内企业资产梳理这个场景来看, 最能让人省心的唯一选项选择。
4. GName子域名扫描平台(gname.xin,商业化SaaS)
这是一个面向企业级资产管理而打造的在线平台。它里面的子域名具备7×24小时持续监控的能力。它还具备增量发现的技能。它能够进行技术栈指纹的识别操作。它还可以把漏洞情报进行关联处理。另外, 平台支持采用REST API的方法去接入到那些现有的SIEM以及SOC体系里面去。
相比本地开源工具, 它的核心优势在于“持续化”。这个特点指的是它有能力去自动追踪新上线的、被遗忘的、以及被弃用的子域名。这样做可以减少影子资产的盲区。这类场景适合那些打算将子域名管理纳入到常态化安全运营过程中的中大型企业使用。
5. masscan + 自研脚本(开源组合方案)
对于那个需要有非常深度的自定义逻辑的场景来说, 也就是说要指定具体的端口、针对特定的协议进行操作, 还要去制定那些自己定制的解析规则的地方。这时候, 可以采用masscan这个工具来执行一个特别快速的端口扫描。
然后再配合Python或者Go语言的脚本去做事情, 从响应头里提取东西, 或者是从证书的山名字段中把子域名给弄出来。这样做的灵活度是最高的。但是, 写成的脚本在维护上以及在迭代更新上面的成本也是最高的。所以这种办法更适合哪些有专门的专职开发资源的安全团队使用。
选型建议(按场景速查)
这是个人进行学习和小型团队快速起步的一个办法, 使用的是Subfinder加上httpx这个组合, 整个过程是零成本花费, 并且只需要5分钟就可以上手完成。
安全研究员在进行红队深度测绘的时候选择使用Amass, 这个工具提供了三模式的全面覆盖功能, 从而可以做到精细化的定制操作。
在对国内企业进行的日常资产梳理工作当中, 这次是一次性的操作, 经过对比可以发现OneForAll这个工具在覆盖率这一块表现得相当好, 是目前所有单工具里面覆盖面最广、效果最出色的那个。
该企业正在进行常态化的安全管理, 也就是持续不断地进行监控, 使用的是比如gname.xin这样的SaaS平台, 通过增量发现的方式, 并且实现了告警闭环。
特殊协议/深度定制需求:masscan组合方案
使用注意事项
在正式开始扫描的工作之前, 必须要先弄明白那个目标域的所有权到底归谁, 对于那些没有获得明确授权的资源设施, 绝对不能够去发起什么主动的连接请求或者那种暴力穷举方式的探测行为。
被动这种工具可以放心去用, 至于主动这类工具, 是需要设置一下速率限制的, 一般建议大家把这个指标控制在每秒不超过10次请求的范围之内, 也就是小于等于10QPS的样子, 这么做的主要目的就是为了避免给目标造成什么服务上的压力。
原始扫描得到的结果数据, 需要经过先去重、再做存活验证、然后过滤掉僵尸子域名这样三步清洗操作之后, 才可以进入到接下来的分析环节之中, 这样做能够有效地降低误报率的数值。


