1. 项目概述:为什么子域名枚举是攻防的“前哨战”
在渗透测试、红队评估或者日常的资产梳理工作中,我们常常会遇到一个核心问题:目标究竟有多大?这个“大”,往往不是指一个孤零零的主域名,而是指其背后隐藏的、可能被忽视的整个数字资产面。子域名,就是这个资产面的关键组成部分。一个主域名下,可能部署着面向用户的官网、内部员工使用的OA系统、开发测试环境、API接口服务,甚至是配置不当的管理后台。找到这些子域名,就如同拿到了一张目标网络的地图,是后续所有信息收集、漏洞探测和风险评估的起点。
Amass,作为目前信息收集领域公认的“瑞士军刀”,其子域名枚举能力尤为突出。它之所以备受推崇,并非仅仅因为它能“找到很多域名”,而是因为它提供了一套完整且高度可配置的枚举策略体系。简单来说,Amass将子域名发现分为了两大流派:主动枚举和被动收集。新手往往一上来就运行最暴力的命令,结果要么被防火墙封禁IP,要么收获寥寥。而老手则会根据目标特点、自身权限和测试阶段,像调兵遣将一样,灵活搭配这两种策略。
这篇文章,我将结合自己多年在实战中的经验,深入拆解Amass的主动与被动枚举策略。我不会只告诉你命令怎么写,而是会重点分析在什么场景下该用什么策略,为什么这么选,以及如何组合使用才能达到效率与隐蔽性的最佳平衡。无论你是刚入门的安全爱好者,还是希望优化自己工作流的从业者,理解这些策略背后的逻辑,远比记住几个命令参数重要得多。
2. 核心策略解析:主动枚举与被动收集的本质区别
在深入Amass的具体参数之前,我们必须先从根本上理解这两种策略的运作机制和底层逻辑。它们的区别,决定了你的行为是“敲门”还是“倾听”,是“主动出击”还是“情报分析”。
2.1 被动收集:扮演一个“安静的观察者”
被动收集,顾名思义,你本身并不与目标域名或其DNS服务器发生直接交互。你的角色更像一个情报分析师,从各种公开或半公开的数据源中,搜集历史上或近期他人查询过的、与目标相关的子域名记录。
核心原理:Amass会向数十个(甚至上百个)在线数据源发起查询,这些数据源包括:
- 证书透明度日志:如 crt.sh。这是被动收集的“王牌数据源”。根据规定,全球主流CA在签发SSL/TLS证书时,都必须将证书信息(包含域名)公开到CT日志中。通过查询这些日志,我们可以发现目标组织为哪些子域名申请过证书,其中常包含测试环境、内部系统等不易通过常规扫描发现的资产。
- 搜索引擎:如 Google、Bing(通过API或爬取)。利用搜索引擎的
site:语法,可以发现被收录的子域名页面。 - 威胁情报平台:如 AlienVault OTX, RiskIQ, ThreatCrowd。这些平台聚合了全球的恶意软件分析、扫描数据,其中包含大量的域名解析记录。
- DNS数据集:如 SecurityTrails, Censys, Shodan。它们通过长期、大规模的网络空间测绘,积累了海量的DNS历史记录和关联数据。
- 其他来源:如DNS聚合器、子域名爆破的历史结果共享站点等。
优点:
- 极高的隐蔽性:由于不直接查询目标DNS,你的行为几乎不会被目标的安全设备(如IDS/IPS、防火墙)察觉。这对于红队行动或需要高度隐蔽的测试至关重要。
- 发现历史与关联资产:能发现已下线但曾存在过的子域名、关联的不同顶级域名(通过同一组织注册的证书或IP反查),有助于绘制更完整的资产图谱。
- 绕过DNS防护:即使目标使用了私有DNS服务器或严格的DNS查询策略,只要其子域名曾在公网上“亮过相”(比如申请过证书),就可能被被动源捕获。
缺点与局限:
- 数据非实时且可能不全:你获取的是数据源“看到过”的记录,可能遗漏那些从未对外公开、或刚创建不久的子域名。
- 依赖第三方数据源:数据源的可用性、速率限制和查询精度会影响结果。部分优质数据源需要API密钥。
- 存在“噪音”:可能会收集到大量无关的域名,例如CDN的泛域名、被其他项目误关联的域名等,需要后期仔细过滤。
实操心得:被动收集应该是你每次信息收集的“第一步”。它风险极低,能快速建立一个初步的资产列表,并为后续的主动枚举提供“种子”目标。我习惯将这一步称为“绘制草图”。
2.2 主动枚举:扮演一个“积极的侦察兵”
主动枚举,意味着你的工具会直接与目标的DNS基础设施进行通信,通过一系列技术手段来“询问”是否存在特定的子域名。
核心原理:Amass的主动枚举主要基于“字典爆破”和“递归枚举”。
- 字典爆破:使用一个包含大量常见子域名前缀(如
www,mail,dev,test,api,admin)的字典,逐个拼接目标主域名,然后向公共DNS服务器(如8.8.8.8)或目标权威DNS服务器发起A记录或CNAME记录查询。如果收到有效的DNS响应(非NXDOMAIN),则认为该子域名存在。 - 递归枚举/爬取:在发现一个有效的子域名(如
dev.example.com)后,Amass可以将其作为新的“根”,继续尝试在其基础上爆破(如api.dev.example.com),从而发现更深层级的子域名。 - AXFR区域传输:这是一种经典的DNS配置错误。如果目标DNS服务器允许匿名用户进行区域传输(AXFR请求),那么可以直接获取到该域名下的所有DNS记录。虽然现在较少见,但Amass仍会尝试。
- 反向DNS查找:对于发现的IP地址,进行PTR记录查询,可能发现其他绑定在该IP上的域名。
优点:
- 实时性强,结果准确:直接查询DNS,获得的是当前最新的解析状态。
- 可以发现“隐藏”资产:能发现那些从未在公开数据源中暴露过的、内部使用的或新上线的子域名。
- 可控性强:你可以自定义字典的大小、爆破的速率、递归的深度,从而控制枚举的强度和范围。
缺点与风险:
- 暴露风险高:大量的DNS查询流量会清晰地记录在目标的DNS服务器日志中,极易触发安全告警。你的源IP地址也会暴露。
- 可能触发速率限制或被封禁:目标DNS服务器或上游ISP可能对高频查询进行限速或直接屏蔽IP。
- 依赖字典质量:爆破的效果很大程度上取决于你使用的子域名字典是否全面、是否贴合目标行业特性。
实操心得:主动枚举是“精雕细琢”的阶段。永远不要在未授权测试中对目标进行高强度主动爆破。即使是在授权范围内,也应采用“慢速扫描”、“分时段扫描”等策略,并优先使用从被动收集中获得的“高价值种子词”来生成针对性字典,而非盲目使用巨型通用字典。
2.3 策略对比与选择矩阵
为了更直观地理解,我们可以用下表来对比两种策略:
| 特性维度 | 被动收集 | 主动枚举 |
|---|---|---|
| 交互对象 | 第三方数据源(CT日志、搜索引擎等) | 目标DNS服务器/公共DNS |
| 隐蔽性 | 极高,目标无感知 | 低,流量会被记录 |
| 数据实时性 | 滞后(历史数据) | 实时(当前状态) |
| 发现能力 | 公开/历史暴露的资产 | 当前在线资产(包括未公开的) |
| 主要技术 | 数据聚合、关联分析 | DNS字典爆破、递归枚举、AXFR尝试 |
| 速度 | 快(受限于API速率) | 可快可慢(取决于字典和线程) |
| 风险 | 极低 | 高(可能触发告警或IP封禁) |
| 核心依赖 | 数据源的覆盖面和API | 子域名字典的质量和爆破策略 |
如何选择?答案是:组合使用,分阶段进行。
- 第一阶段(侦察初期):纯被动收集。快速、隐蔽地获取目标初步画像。命令示例:
amass enum -passive -d example.com -o passive_results.txt。 - 第二阶段(深度侦察):被动为主,轻度主动为辅。基于被动结果,筛选出可能的业务关键词(如
shop,api,mobile),生成一个精简的、有针对性的字典,进行低速率的主动爆破。命令示例:amass enum -active -brute -w custom_small_wordlist.txt -d example.com -max-dns-queries 10 -o active_light.txt。 - 第三阶段(授权测试/全面梳理):主动深度枚举。在明确授权和范围的前提下,使用大型字典、高线程进行深度爆破和递归枚举,力求全覆盖。命令示例:
amass enum -active -brute -w large_wordlist.txt -d example.com -rf resolvers.txt -dir ./amass_db。
3. Amass 实战配置与高级技巧
理解了策略,我们来看看如何用Amass将其落地。Amass的强大之处在于其丰富的配置选项,允许你精细控制枚举行为。
3.1 基础命令与核心参数解析
一个最基础的被动收集命令如下:
amass enum -passive -d example.com -o amass_passive.txtenum:子域名枚举子命令。-passive:关键标志,指示仅使用被动数据源。-d:指定目标域名。-o:将结果输出到文本文件。
一个典型的主动爆破命令如下:
amass enum -active -brute -w subdomains_top1m.txt -d example.com -rf resolvers.txt -max-dns-queries 50 -o amass_active.txt-active:启用主动枚举模块。-brute:启用字典爆破模式。-w:指定用于爆破的字典文件路径。字典质量至关重要。-rf:指定一个自定义的DNS解析器列表文件。这是提升主动枚举成功率的关键技巧。使用公共DNS(如8.8.8.8, 1.1.1.1)可能被限速,而使用从网上搜集的或自建的高质量解析器列表可以分散查询压力,提高速度。Amass内置了一个列表,但自己维护一个更新的是最佳实践。-max-dns-queries:限制每秒向每个解析器发送的DNS查询数。这是控制扫描速度、降低被发现风险的核心参数。在授权测试中,可以适当调高(如100);在需要隐蔽时,应调低(如5-10)。-dir:指定一个目录用于存储Amass的运行时数据库和配置文件。这对于长期监控、增量扫描非常有用。
3.2 字典的选用与自定义策略
“工欲善其事,必先利其器”,对于主动爆破,字典就是你的“器”。通用大字典(如subdomains-top1million-5000.txt)覆盖面广,但噪音也大,效率低。我推荐分层使用字典:
- 通用高频字典:包含
www, mail, ftp, admin, test, dev, staging, api等最常见前缀,约几千条。用于第一轮快速扫描。 - 行业特定字典:根据目标行业定制。例如,针对云服务商,可以加入
aws, s3, storage, blob等;针对教育机构,加入campus, elearning, library等。 - 目标生成字典:这是最高效的方法。从被动收集的结果中,提取子域名的“单词”模式。例如,发现
mail.example.com,webmail.example.com,可以生成mail, webmail作为新词;发现dev-app1.example.com,可以生成dev-app1, app1等。可以使用工具如altdns来基于已有列表生成排列组合。
你可以使用-w参数多次指定多个字典,Amass会自动合并去重。
amass enum -active -brute -w common_small.txt -w industry_specific.txt -w generated.txt -d example.com3.3 递归枚举与深度控制
递归枚举能挖掘出深层子域名,但也会指数级增加查询量。Amass通过-max-depth参数控制递归深度。
-max-depth 1:仅对根域名(example.com)进行爆破。-max-depth 2:对根域名爆破,并对发现的一级子域名(如api.example.com)也进行爆破(尝试xxx.api.example.com)。-max-depth 3:继续向下递归。
注意事项:深度每增加1,潜在的查询量会剧增。在非授权或需要隐蔽的场景下,切勿使用大于2的深度。即使在授权测试中,也要评估时间成本和目标规模。
3.4 使用配置文件进行持久化与监控
对于需要长期关注的目标,使用命令行参数会非常繁琐。Amass支持配置文件(config.ini)和数据库模式。
首先,初始化一个工作目录和配置:
amass db -dir ./workspace -init这会在./workspace下创建数据库和配置文件模板。
然后,编辑./workspace/config.ini,你可以在这里预设数据源的API密钥、默认的解析器列表、速率限制等。更强大的是,你可以配置“定时任务”。
例如,创建一个持续监控任务,每天执行一次被动收集,每周执行一次轻度主动扫描:
# 添加一个监控任务 amass track -dir ./workspace -d example.com -last 7d # 定期执行枚举(可以放入crontab) amass enum -dir ./workspace -d example.com -passive -config ./workspace/config.ini -o daily_update.txt这种方式,Amass会利用数据库追踪已发现的子域名和IP地址,并在后续扫描中识别出新出现的资产,非常适合资产监控和变化感知。
4. 实战场景与策略组合案例
理论结合实践,下面通过几个典型场景,展示如何灵活运用策略组合。
4.1 场景一:外部未授权安全评估(黑盒)
目标:尽可能全面地发现目标互联网资产,同时保持高度隐蔽。策略:
- 全面被动收集:使用所有可用的被动数据源(确保在config.ini中配置好API密钥以提升限额)。
amass enum -passive -d target-company.com -o phase1_passive.txt - 数据关联与拓展:对发现的IP进行
whois查询和ASN归属分析,寻找同一组织名下的其他IP段和域名。使用Amass的-ip和-asn选项(这也属于被动情报范畴)。# 假设发现IP 1.2.3.4 amass intel -asn -addr 1.2.3.4 # 根据发现的AS号,查找该AS下的所有域名 amass intel -org "Some Cloud Provider" # 或用-asn指定AS号 - 针对性轻度主动:分析
phase1_passive.txt,提取出业务相关的子域名前缀,生成一个不超过500条的小字典。在非业务高峰时段(例如凌晨),使用极低的查询速率进行爆破。amass enum -active -brute -w targeted_500.txt -d target-company.com -max-dns-queries 2 -o phase2_light_active.txt - 结果汇总与去重:合并所有结果,并使用
httpx、nuclei等工具对存活的子域名进行后续的HTTP服务探测和漏洞扫描。
4.2 场景二:内部授权渗透测试(白盒/灰盒)
目标:在授权范围内,进行无遗漏的深度资产发现。策略:
- 快速被动建立基线:同场景一第一步,快速获取已知资产列表。
- 高强度主动枚举:
- 使用大型字典:合并2-3个高质量的通用大字典。
- 使用优质解析器列表:准备一个包含上百个可靠公共DNS的
resolvers.txt文件。 - 提高并发,控制总时间:适当提高
-max-dns-queries(如50-100),并利用-timeout参数控制总扫描时间。
amass enum -active -brute -w big_list1.txt -w big_list2.txt -d internal-target.com -rf resolvers.txt -max-dns-queries 80 -timeout 120 -o deep_scan.txt - 递归枚举挖掘深度:针对发现的重要一级子域名(如
dev.internal-target.com),进行深度为2的递归枚举。amass enum -active -brute -w big_list1.txt -d dev.internal-target.com -max-depth 2 -rf resolvers.txt -o deep_dev_scan.txt - 尝试AXFR和DNS缓存投毒等高级技巧:虽然成功率低,但在授权测试中值得一试。Amass内置了AXFR尝试。
4.3 场景三:企业自身资产梳理与持续监控
目标:建立企业自身的动态资产清单,及时发现影子资产或违规暴露。策略:
- 初始化全面扫描:在内部网络或拥有完全授权的情况下,执行一次类似场景二的深度扫描,建立初始资产数据库。
amass db -dir ./company_assets -init amass enum -dir ./company_assets -active -brute -d your-company.com -config ./company_assets/config.ini - 配置自动化监控:利用Amass的数据库模式和定时任务。
- 在
config.ini中设置好所有被动数据源的API。 - 使用
amass track命令添加需要监控的根域名。 - 编写一个Shell脚本或使用Crontab,定期运行:
# 每日被动监控 amass enum -dir ./company_assets -passive -d your-company.com -o daily_diff.txt # 每周轻度主动核查 amass enum -dir ./company_assets -active -brute -w small_check_list.txt -d your-company.com -max-dns-queries 5 - 在
- 集成与告警:将Amass的输出(如
daily_diff.txt中的新发现资产)接入企业的SIEM或工单系统,自动生成资产入库工单或安全告警。
5. 常见问题、排错与性能优化
在实际使用中,你肯定会遇到各种问题。下面是一些典型问题及解决方案。
5.1 被动收集结果太少
- 问题:运行被动枚举后,只得到寥寥几个结果。
- 排查与解决:
- 检查API密钥:许多优质被动源(如SecurityTrails, Censys)需要API密钥才能获得完整或高额度的查询权限。确保在
config.ini文件中正确配置了它们。运行amass enum -list可以查看当前配置的数据源及其状态。 - 网络连通性:确保你的网络可以正常访问这些数据源的API(有些可能需要特定的网络环境)。可以尝试
curl一下数据源的API端点。 - 目标特性:有些目标(特别是初创公司或内部系统极少的组织)本身在互联网上的暴露面就很小,被动收集结果自然不多。这是正常现象。
- 检查API密钥:许多优质被动源(如SecurityTrails, Censys)需要API密钥才能获得完整或高额度的查询权限。确保在
5.2 主动枚举速度慢或被封IP
- 问题:主动爆破时速度极慢,或者运行一段时间后不再有结果返回(IP可能被目标或公共DNS限速/封禁)。
- 排查与解决:
- 优化解析器列表:不要依赖单一或少数几个公共DNS。维护一个庞大的、经常更新的
resolvers.txt文件是关键。可以从公开项目获取,也可以使用dnsvalidator等工具对解析器进行验证和筛选,保留响应快、稳定的。 - 调整速率限制:务必使用
-max-dns-queries参数。从一个较低的值开始(如10),观察网络状况和目标响应。在授权测试中可逐步增加。 - 使用
-noalts参数:Amass默认会尝试查找“置换域名”(如将-换成.),这会增加大量查询。如果速度是首要考量,可以关闭此功能。 - 分布式扫描:对于超大型目标,可以考虑在多台VPS上使用不同的解析器列表和字典分段同时扫描,最后合并结果。
- 优化解析器列表:不要依赖单一或少数几个公共DNS。维护一个庞大的、经常更新的
5.3 结果中存在大量无效或“垃圾”域名
- 问题:结果文件中包含大量泛解析记录(如
*.cdn-provider.com)、不存在的域名(NXDOMAIN误报)或无关域名。 - 排查与解决:
- 启用智能过滤:Amass的
-filter参数可以基于正则表达式过滤子域名。例如,过滤掉包含aws,azure,cloudfront等常见CDN泛解析模式的域名。 - 后期处理:Amass的结果通常需要二次处理。一个标准的流水线是:
# 1. 使用httpx进行HTTP/S存活探测,过滤出真正有服务的 cat amass_results.txt | httpx -silent -o alive_subdomains.txt # 2. 使用dnsx或单独脚本,对原始结果进行A记录验证,剔除无法解析的 cat amass_results.txt | dnsx -silent -a -resp-only -o valid_dns.txt # 3. 人工审查,剔除明显无关的误报 - 优化字典:清理你的爆破字典,移除那些明显无效或低概率的前缀。
- 启用智能过滤:Amass的
5.4 Amass进程占用内存过高或崩溃
- 问题:在深度递归或使用极大字典时,Amass可能消耗大量内存。
- 排查与解决:
- 控制枚举深度和字典大小:对于大型目标,避免一次性使用
-max-depth 3和百万级字典。应分阶段、分目标进行。 - 使用数据库模式:
-dir参数指定数据库目录,Amass会将中间状态和结果存入数据库,比纯内存操作更稳定,也支持中断后继续。 - 升级硬件:在虚拟机或服务器上运行,分配足够的内存(建议至少2-4GB)。
- 控制枚举深度和字典大小:对于大型目标,避免一次性使用
掌握Amass子域名枚举的精髓,不在于记住所有命令参数,而在于深刻理解“主动”与“被动”这两种侦察哲学,并能根据战场(测试场景)形势灵活切换和组合你的战术。从隐蔽的被动情报搜集开始,逐步过渡到精准的主动探测,始终对扫描行为带来的“噪音”保持警惕,这才是专业的信息收集之道。工具是固定的,但策略是活的,这份对策略的思考和实践,才是区分普通使用者和资深从业者的关键。