编者按
根据这篇关于子域枚举工具测评的文章内容,我们可以得出以下结论和总结:
主要研究内容:本次测评主要针对子域枚举工具进行了测试,以发现各工具在查找目标域名的子域时的效率和覆盖度。
测试对象:测试对象包括了多个开源子域枚举工具,例如BBOT、theHarvester、Subfinder、Amass、OneForAll、Spiderfoot、Findomain、Sublist3r,以对比它们在发现大型和小型目标域名的子域时的表现。
测试方法:通过对大型目标(delta.com)和小型目标(spirit.com)运行各个工具,并记录找到的子域总数以及运行耗时进行对比。
结论:
在子域数量方面,BBOT 表现较优,特别是使用子域枚举工具中添加了subdomain.center API 接口;
在速度方面,Subfinder 和 Findomain 表现出色,耗时最短;
theHarvester 获得了荣誉奖,也得到了一定的认可。
待改进之处:
文章并未对工具的原理进行深入探讨,也未对数据进行详细的对比和分析,建议在后续评测中加入这方面的内容;
对工具的唯一性和独特性进行更深入的研究和对比,以进一步提升测试的深度和广度。
综上所述,本次测评通过对子域枚举工具的测试和比较,为网络安全领域的从业者提供了有益的信息,同时也为这些工具的开发者提供了改进和优化的方向。
1
导言
在当今的网络安全领域,对于网络资产的发现和管理变得愈发重要。随着互联网规模的不断扩大,许多组织面临着对其网络边界和资产的有效监视的挑战。其中,子域枚举作为一种重要的安全措施,被广泛应用于发现组织的外部资产,帮助识别潜在的安全威胁和漏洞。而子域枚举工具则是在这一过程中的关键支持者,它们能够帮助安全团队快速、自动化地收集目标域名的子域信息。
随着网络攻击技术的不断发展,子域枚举工具也在不断涌现和完善。但是哪个工具更好用更全面呢?我们通过一些评测方法来测试以下工具:
● BBOT
● theHarvester
● Subfinder
● Amass
● OneForAll
● Spiderfoot
● Findomain
● Sublist3r
2
测评方法
今年的主题是航空公司。我们将针对一个大靶标(达美航空:delta.com)和一个小靶标(精神航空:spirit.com)运行上述工具。通过对一个大靶标和一个小靶标进行测试,我们可以看到每个工具随着攻击面的大小而扩展的程度。
与上次类似,我们只用开箱即用方式运行每个工具,没有API密钥,只有启用暴力破解和提高线程数等所需的最小配置修改。
通配符和未解析的子域将使用下面脚本删除。
#!/usr/bin/env python3
import sys
import asyncio
from bbot.scanner import Scanner
try:
file = sys.argv[-1]
except KeyError:
print("Usage: ./clean_dns_records.py input.txt")
sys.exit(1)
num_threads = 10
async def handle_dns_name(dns_name, bbot_scan):
try:
dns_event = bbot_scan.make_event(dns_name, "DNS_NAME", source=bbot_scan.root_event)
except Exception as e:
return
if not dns_event.type == "DNS_NAME":
return
(
dns_tags,
event_whitelisted_dns,
event_blacklisted_dns,
dns_children,
) = await bbot_scan.helpers.dns.resolve_event(dns_event)
for tag in dns_tags:
dns_event.add_tag(tag)
resolved_hosts = set()
for rdtype, ips in dns_children.items():
if rdtype in ("A", "AAAA", "CNAME"):
for ip in ips:
resolved_hosts.add(ip)
if not "unresolved" in dns_event.tags:
if not bbot_scan.helpers.is_ip_type(dns_event.host):
await bbot_scan.helpers.dns.handle_wildcard_event(dns_event, dns_children)
print(f"{dns_event.data}t{','.join(sorted(dns_event.tags))}")
async def main():
with open(file) as f:
lines = f.read().splitlines()
lines = [l for l in set([l.strip().lower() for l in lines]) if l]
config = {
"dns_abort_threshold": 999999
}
bbot_scan = Scanner()
semaphore = asyncio.Semaphore(num_threads) # Limit to 5 concurrent tasks
tasks = []
for dns_name in lines: # If you want to run 10 tasks
tasks.append(controlled_execution(semaphore, dns_name, bbot_scan))
await asyncio.gather(*tasks)
async def controlled_execution(semaphore, dns_name, bbot_scan):
async with semaphore:
await handle_dns_name(dns_name, bbot_scan)
asyncio.run(main())
3
结论
找到的子域:
运行耗时(越低越好):
4
分析
你可能会注意到的第一件事是,虽然小靶标(spirit.com)的结果非常接近,不过大靶标(delta.com)结果差距较大。具体来说,BBOT、theHarvester、Amass和其他的工具存在巨大差距。对此有一个有趣的解释,这意味着子域名扫描工具大部分已经主要以API接口查询为主,而很少调用本地爆破能力。
事实证明,单一数据源是造成这种差异的原因。两个月前才添加到Amass的subdomain.center是Automated Reconnaissance & Pwning Syndicate创建的一个牛逼的API接口。它可以免费使用,每分钟限制3个请求,同时它也是BBOT模块之一。
我称之为“牛逼”,因为它非常好。Subdomain.center返回的子域比任何其他免费API接口都多。它返回了1594个有效delta.com子域,而RapidDNS(亚军)只返回了774个。
这个API最牛逼的地方是数据本身。它的数据库充满了奇怪而复杂(但完全有效)的子域,这些子域似乎不会出现在其他任何地方。没有其他免费的API包含这些数据,我们所知道的工具也没有一个能够通过暴力破解发现它们。即使BBOT的massdns 模块有NLP-powered的子域突变,也无法重复出与之相当数量的子域。
我联系了ARPSyndicate,希望找到一些关于他们数据来源的答案,但他们保密,只是说他们正在“持续聚合和分析DNS数据集”。的确,他们从哪里得到这些数据集是个谜。但谁在乎呢?反正可以免费查!
(更新8/6/2023:Subdomain.center的网站现在说,“子域中心利用Apache的Nutch、Calidog的Certstream、OpenAI的嵌入模型和我们的一些专有工具来发现比其他任何人都多的子域。”)
5
运行耗时
Subfinder和Findomain大致并列最快的工具,都在不到15秒的时间内完成。这些工具没有执行任何暴力破解,只查询API。
注释:Subfinder是用Go写的,Findomain是用Rust编写的。总之很高兴看到Go和Rust之间的友好竞争。:)
Amass和Spiderfoot是这里的最垃圾,我实际上选择缩小他们在图中的长度,因为他们使其他工具的结果根本都看不到了。在delta.com的情况下,Amass和Spiderfoot超过了6小时。
6
子域名
关于运行也就都差不多。核心还是要尽可能多的子域名,不关心是否误报,重点是不能漏报。
在这方面,我包含了BBOT。作为BBOT的创建者,我可能有点偏见,但不管你如何想,它显然是子域名发现评测中获胜了。BBOT发现spirit.com和delta.com的子域最多,Spirit.com平均多收集44%的子域,Delta.com比其他工具多118%。
7
结论
俱全能力:BBOT
耗时最少:Subfinder和Findomain这俩并列
荣誉奖:theHarvester
8
详情
返回结果和耗时表:
9
来源
本文翻译自
https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off-4e5
原文始发于微信公众号(幻泉之洲):【评测】子域枚举工具测评
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论