1. 项目概述:为什么我们需要“绕过检测”的攻击面映射?
在渗透测试或红队评估的初期,信息收集与攻击面映射的质量直接决定了后续行动的深度与广度。OWASP Amass 无疑是这个领域的标杆工具,它通过整合数十个开源情报(OSINT)源、被动DNS数据、证书透明日志等,能够自动化地发现与目标关联的子域名、IP地址、ASN等信息,绘制出一张庞大的数字资产地图。
然而,一个现实且尖锐的问题是:当你使用 Amass 对一家安全防护成熟的目标进行扫描时,你的探测行为很可能在几分钟内就被对方的SOC(安全运营中心)或WAF(Web应用防火墙)捕获并拉黑。你的IP地址、你的工具指纹(如特定的User-Agent、请求频率)一旦暴露,整个评估活动就可能提前夭折。这就是“绕过检测”技巧存在的核心价值——它不是为了“攻击”工具本身,而是为了让合法的安全评估(在授权范围内)能够更持久、更隐蔽地进行,从而发现那些在常规、高调扫描下会被隐藏起来的脆弱资产。
这10个技巧,是我在多年实战和内部红队演练中,结合Amass的官方文档、社区讨论以及大量踩坑经验总结出来的。它们不仅仅是命令行参数的堆砌,更是一套关于“如何像攻击者一样思考,同时像防御者一样规避”的策略组合。我们将从最基本的配置调整,深入到流量伪装、源分散、节奏控制等高级层面,目标是让你手中的Amass从一个“大声喧哗的普查员”,变成一个“悄无声息的侦察兵”。
2. 核心思路拆解:从“扫描”到“侦察”的思维转变
在深入技巧之前,我们必须先统一思想:攻击面映射的核心是“信息收集”,而非“漏洞扫描”。后者的目的是触发应用的异常响应以发现漏洞,行为主动且具有侵入性;前者的目的是尽可能多地“看见”资产,行为应尽可能被动和低调。Amass 本身设计上偏向被动收集(通过API查询),但其某些模块(如主动抓取、DNS暴力破解)仍会产生大量主动流量。我们的所有技巧,都围绕一个中心: 最大化被动情报收益,最小化主动探测痕迹,并对必要的主动探测进行充分的伪装和稀释 。
2.1 技巧分层:从基础到高阶的防御规避体系
我将这10个技巧分为三个层次,构成一个递进的防御规避体系:
- 基础隐身层(技巧1-3) :核心是“别让自己太显眼”。通过修改工具最明显的指纹(如User-Agent)、控制最基础的请求行为(频率、并发),来避免被最简单的基于特征和阈值的规则匹配。这是所有操作的底线。
- 来源伪装与分散层(技巧4-7) :核心是“别把所有鸡蛋放在一个篮子里”和“假装成别人”。利用代理池、分散的DNS解析源、云函数等基础设施,将扫描流量源头打散、伪装成正常用户或第三方服务流量,极大增加防御方追踪和封禁的成本。
- 高级策略与对抗层(技巧8-10) :核心是“利用规则盲区”和“节奏控制”。通过深度定制化配置,针对特定目标环境调整策略,以及在时间维度上“慢工出细活”,绕过那些针对“短期高爆”扫描的防御策略。
这个分层思路意味着,在实际操作中,你应该根据目标的安全水位和自身的风险评估,组合使用不同层次的技巧。对一个普通企业网站,可能只需要用到基础层;而对一个拥有顶尖安全团队的大型互联网公司,你可能需要动用全部三个层次的策略。
3. 技巧详解与实操配置
3.1 技巧一:彻底自定义User-Agent与HTTP头
这是最基础但最有效的步骤。Amass默认的User-Agent是类似
OWASP Amass/3.23.3
的格式,这等于在每次请求时都举着一个“我是扫描器”的牌子。安全设备可以轻而易举地据此过滤或记录所有请求。
实操要点:
你需要创建一个配置文件(如
amass-config.ini
)来覆盖默认行为。不仅仅是User-Agent,一些安全设备还会检查
Accept
、
Accept-Language
、
Referer
(是的,HTTP规范里是
Referer
这个错误拼写)等头信息。一个看起来像普通浏览器或搜索引擎爬虫的请求头组合能大幅降低嫌疑。
[default]
# 模仿一个现代Chrome浏览器的User-Agent
user_agent = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
# 自定义HTTP头,增加真实感
[headers]
Accept = text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language = zh-CN,zh;q=0.9,en;q=0.8
Accept-Encoding = gzip, deflate, br
DNT = 1 # Do Not Track,增加真实性
Upgrade-Insecure-Requests = 1
使用方式:
在运行Amass时,通过
-config
参数指定该配置文件:
amass enum -config amass-config.ini -d target.com
注意 :不要使用过于老旧或生僻的User-Agent字符串,这反而会引起怀疑。最好从你日常使用的浏览器中复制一个,或使用常见的爬虫UA(如Googlebot)。同时,确保你的自定义头字段之间逻辑自洽(例如,不要同时声明
Accept-Encoding: gzip却又使用HTTP/1.0)。
3.2 技巧二:精细化调节速率限制与并发控制
无节制的并发请求是触发WAF速率限制(Rate Limiting)或直接IP封禁的最快途径。Amass的
-max-dns-queries
和
-rate
等参数就是为此而生,但关键在于如何设置合理的值。
参数解析与设置逻辑:
-
-max-dns-queries:控制同时进行的DNS查询数量。对于公共DNS解析(如通过8.8.8.8),设置过高会导致大量超时。建议初始值设为50-100,根据网络状况调整。 -
-rate:这是 每秒 允许的DNS查询数。这是最关键的速率阀门。一个保守且安全的起点是 1-2次/秒 。是的,这很慢,但对于绕过检测至关重要。你可以先以此速率运行一段时间,如果没有触发警报,再谨慎地逐步提高(例如,增加到3-5次/秒)。 -
-timeout:每个查询的超时时间。对于反应慢或受保护的DNS服务器,设置太短(如默认值)会导致大量失败,而频繁的重试或超时本身也是异常行为。建议设置为10-30秒。
示例命令:
amass enum -d target.com -max-dns-queries 80 -rate 2 -timeout 20
这个配置意味着,Amass会使用最多80个并行线程,但整体速率被限制在每秒最多2次DNS查询,每个查询等待20秒。这模拟了一个网络状况不佳或距离较远的用户的查询行为。
实操心得: 不要迷信“高性能”设置。在一次针对金融目标的评估中,我最初使用默认设置(高并发),不到5分钟扫描IP就被目标CDN提供商拉黑。将速率降至每秒1次查询后,扫描持续了数小时未被中断,最终收集到的子域名数量反而比之前短时高压扫描更多,因为避免了因IP被封导致的后半程数据缺失。
3.3 技巧三:禁用高噪声模块与主动爆破
Amass功能强大,集成了主动爬取(
-active
)和子域名暴力破解(
-brute
)模块。然而,这两个模块是产生大量主动流量和噪声的“元凶”。
- 主动爬取(-active) :会尝试抓取发现的网页,解析其中的链接、JavaScript文件等以发现新域名。这会向目标的Web服务器发送大量HTTP/HTTPS请求,指纹暴露无遗。
-
子域名暴力破解(-brute)
:会使用内置或自定义的字典,对目标域名进行大量的DNS A/AAAA记录查询,格式如
word1.target.com,word2.target.com。这种模式化、高频的DNS查询非常容易被识别为字典攻击。
绕过策略: 在初步侦察或需要高度隐蔽的阶段, 明确禁用它们 。
amass enum -d target.com -noalts -nobrute
-
-noalts:禁用额外的Alterations生成(一种基于已知子域名的变体生成技术,也会产生额外查询)。 -
-nobrute:禁用暴力破解。
什么时候使用它们? 当你通过被动方式(技巧四、五)获取了基础资产列表后,可以针对特定的、看起来管理松懈的IP段或域名,在可控的代理环境下(技巧六),小范围、低速地启用这些主动模块进行深度挖掘。这叫做“精确打击”,而非“地毯式轰炸”。
3.4 技巧四:优选与轮换被动数据源
Amass的强大在于其数据源(
-src
)的多样性。并非所有数据源都“生而平等”。从绕过检测的角度看,你需要优先选择那些:
- 查询成本低 :对目标直接产生的流量少或没有。
- 数据质量高 :返回结果准确,噪声少。
- 自身隐蔽性好 :查询行为不像扫描。
推荐的低调数据源:
-
certificates(证书透明日志):这是 最佳 的被动源。你只是在查询公开的证书日志(如 crt.sh, Google Transparency Report),没有向目标发送任何请求。几乎所有使用HTTPS的域名都会在这里留下记录。 -
whois:查询域名的Whois信息,有时能发现注册时填写的关联域名。 -
dnsdumpster:一个提供DNS相关信息的网站,查询它等同于访问一个普通网页。 -
hackertarget:类似的聚合信息查询源。 -
alienvault:来自OTX(Open Threat Exchange)的被动DNS数据。
操作命令: 你可以指定只使用这些被动源。
amass enum -d target.com -src certificates,whois,dnsdumpster,hackertarget,alienvault
注意事项: 部分数据源(如SecurityTrails, Censys)需要API密钥,并且其查询行为可能会被这些服务商记录。虽然不直接针对目标,但也要注意这些服务自身的速率限制和使用条款。优先使用不需要API密钥的源。
3.5 技巧五:利用第三方DNS解析服务与DNS缓存
直接向目标的权威DNS服务器发起查询是暴露最快的方式。相反,我们应该利用公共DNS解析器(如Google DNS 8.8.8.8, Cloudflare 1.1.1.1)或更小众的解析服务。这样做有两大好处:
- 流量分散 :你的查询指向的是公共DNS,而非目标服务器。目标的防御系统可能看不到这些递归查询。
- 利用缓存 :公共DNS存在缓存。你查询的域名可能已被其他用户查询过,解析器直接从缓存返回结果,速度更快且不会每次都追溯到权威服务器。
Amass通过
-r
或
resolvers
配置文件来指定DNS解析器。
步骤:
-
准备一个
resolvers.txt文件,里面每行一个DNS服务器地址。可以从公开项目中获取一批可靠的公共DNS列表。8.8.8.8 1.1.1.1 9.9.9.9 208.67.222.222 # ... 更多地址 -
在Amass配置文件中指定,或在命令行中使用
-r参数(但更推荐配置文件,便于管理多个解析器)。[resolvers] resolver = 8.8.8.8 resolver = 1.1.1.1 # ... 更多 - Amass会自动从列表中选取解析器进行查询,实现了初步的源分散。
高级技巧:深度解析器验证与筛选
。不是所有公共DNS都稳定或允许大量查询。你可以先用
amass intel
子命令的
-addr
参数来验证一批解析器的速度和可用性,然后将最快最稳定的那些用于正式枚举。这能减少超时和失败,从而减少重试带来的异常流量。
3.6 技巧六:集成代理池与IP轮询
这是中阶技巧的核心。当你的被动信息收集完成后,或者不得不进行一些主动探测时,固定IP是致命的。你需要一个代理池(Proxy Pool)来动态切换出口IP。代理池可以是由住宅IP(Residential IP)或数据中心IP组成的列表。
配置方法:
-
准备代理列表
:将代理地址(格式如
http://user:pass@ip:port或socks5://ip:port)存入文件,例如proxies.txt。 -
在Amass配置文件中设置
:
Amass会(在支持代理的数据源和模块中)使用这些代理来发送请求。[proxy] http_proxy = http://proxy1.example.com:8080 # 或者使用外部文件(更灵活) # http_proxy = file:/path/to/proxies.txt
实操难点与解决方案:
- 代理质量 :免费代理大多不稳定、速度慢且可能被滥用标记。用于隐蔽侦察,建议使用付费的、信誉较好的代理服务,特别是提供住宅IP轮换的服务。这些IP来自真实的ISP用户,行为更像真人,极难被封禁。
-
Amass的代理支持局限
:并非Amass的所有组件都完美支持代理。例如,一些内置的数据源API调用可能走代理,但底层的DNS解析可能仍然使用系统默认路由。一个更彻底的方案是
在系统层面或容器层面设置全局代理
,然后在这个代理环境下运行Amass。这样确保所有出站流量(包括DNS)都经过代理池。可以使用
proxychains等工具实现:proxychains4 amass enum -d target.com ...。 -
节奏与代理的配合
:即使使用代理池,也要在Amass层面保持较低的
-rate。否则,你只是从一个IP的高频攻击变成了多个IP的高频攻击,模式依然可疑。理想状态是“低频请求 + 随机IP切换”。
3.7 技巧七:分布式扫描与云函数利用
这是高阶技巧,旨在将扫描源从“一个点”彻底打散成“一片云”。核心思想是将扫描任务分解,分发到多个地理位置、不同网络环境的节点上执行,每个节点只承担一小部分工作。
实现思路:
- 任务分割 :你可以将目标子域名的字典列表分割成多个小文件,或者将目标IP段划分为多个C段。
- 节点部署 :在多个云服务器(VPS)、甚至利用无服务器云函数(如AWS Lambda, Google Cloud Functions)上部署轻量级的Amass或定制脚本。
- 协调与汇总 :每个节点独立运行,扫描分配给它的那一小部分任务,然后将结果上传到一个中央存储(如加密的S3存储桶、私密Git仓库等)。
- 聚合分析 :最后,在一个安全的环境中汇总所有节点的结果。
云函数(Serverless)的优势 :
- IP地址分散 :每次函数调用可能分配不同的出口IP,且这些IP属于云提供商庞大的IP池。
- 无持久化 :执行完毕后环境销毁,不留痕迹。
- 成本极低 :对于小规模扫描,通常都在免费额度内。
挑战 :
- 环境配置 :需要在云函数环境中安装Amass及其依赖,可能涉及自定义容器镜像。
- 时间限制 :云函数有执行超时限制(通常几分钟),不适合长时间任务,需要将任务切分得非常小。
- 复杂度高 :需要编写额外的任务调度、分发和结果收集代码。
这个技巧适用于针对高价值、高防护目标的长期持续性侦察(PTES中的Persistence),需要较强的工程化能力。
3.8 技巧八:深度定制化Wordlist与智能变异
当你不得不进行子域名爆破(
-brute
)时,通用的超大字典(如
subdomains-top1million-5000.txt
)效率低下且噪声巨大。深度定制化字典能大幅提高命中率并减少无用查询。
定制化策略:
-
行业特定词汇
:如果目标是汽车公司,字典里应包含
api,dev,test,但也应包含engine,vehicle,customerportal,dealership等行业词。 -
目标特定词汇
:从目标已发现的子域名中提取关键词。例如,发现
mail.corp.com和vpn.corp.com,那么corp就可能是一个有用的词根,可以生成dev-corp,corp-api,internal-corp等变体。 -
使用Amass的Alterations功能
:Amass的
-aw参数可以指定一个 alterations 单词列表。它会基于已知子域名进行智能拼接、前后缀添加等。你可以提供一个包含常见前后缀(如-api,-dev,test-,staging-,admin-)的小文件,让Amass自动生成高质量的候选列表,这比纯暴力字典更精准。
操作示例:
# 先进行一次基础的被动枚举,收集一批种子子域名
amass enum -d target.com -passive -o seeds.txt
# 分析 seeds.txt,提取出独特的单词作为基础词根,手动或编写脚本生成 custom_words.txt
# 准备一个前后缀文件 alterations.txt,内容如:
# -api
# -dev
# -test
# staging-
# admin-
# 使用自定义字典和智能变异进行深度枚举
amass enum -d target.com -brute -w custom_words.txt -aw alterations.txt -rf resolvers.txt -rate 1
3.9 技巧九:时间维度上的“慢速扫描”与随机化
安全设备的自动封禁策略往往针对“短时间内的高频请求”。对抗这种策略的最有效方法之一,就是拉长时间线,并引入随机性。
实现方法:
-
极低的速率限制
:如前所述,将
-rate设置为1甚至0.5(即每2秒一次查询)。 - 长间隔运行 :不要一次性完成所有扫描。可以将扫描任务分成多个阶段,每天只运行一小段时间(例如,在目标所在地的工作时间随机选取2小时运行)。
- 在Amass命令中引入随机延迟 :Amass本身没有内置随机延迟,但你可以通过封装脚本实现。例如,编写一个脚本,在调用Amass进行一批查询后,随机睡眠一段时间(如30秒到5分钟),然后再继续。这打破了固定的请求节奏。
- 结合计划任务(Cron) :在Linux服务器上,使用Cron Job来随机调度扫描任务。可以设置多个Cron任务,在一天的不同随机时刻启动不同的扫描模块或针对不同的目标子集。
这种“低慢小”的策略 ,旨在将扫描流量稀释到目标的日常背景噪声中,使其难以与正常用户流量区分开来。这需要极大的耐心,但对于防护严密的目标,往往是唯一可行的方式。
3.10 技巧十:结果去重、验证与持续监控
绕过检测的最终目的是为了获得准确、可持续的数据。一次成功的隐蔽扫描后,处理结果同样重要。
-
实时去重与过滤
:在扫描过程中,使用Amass的
-o输出结果,并定期用amass track子命令来对比新旧发现,专注于新资产。避免对已知资产进行重复探测。 -
存活验证
:Amass发现的域名不一定都存活。直接对大量不存活的域名进行端口扫描或访问尝试是浪费资源且增加暴露风险。使用
httpx、httprobe等轻量级工具,快速验证Web服务的存活(HTTP/HTTPS),只对存活的资产进行下一步深入评估。 -
建立持续监控
:攻击面是动态变化的。使用
amass track -d target.com可以定期(如每天一次)对比上一次的发现,自动识别出新增加的子域名或IP地址。将这个监控任务以“低慢小”的方式(技巧九)自动化,你就拥有了一个针对目标的、隐蔽的资产变化警报系统。
完整流程示例:
# 第一阶段:极致被动,收集种子
amass enum -d target.com -passive -config stealth-config.ini -o amass_initial.txt
# 第二阶段:基于种子,低速、代理化、定制化深度枚举
proxychains4 amass enum -d target.com -brute -w custom_wordlist.txt -rf trusted_resolvers.txt -rate 0.8 -timeout 30 -o amass_deep.txt
# 第三阶段:结果合并、去重、验证
cat amass_initial.txt amass_deep.txt | sort -u > all_subdomains.txt
cat all_subdomains.txt | httpx -silent -title -status-code -o live_subdomains.txt
# 第四阶段:持续监控(通过Cron每天运行一次)
amass track -d target.com -last 1 -dir ~/amass_db_target
4. 常见问题与排查技巧实录
在实际操作中,即使遵循了所有技巧,你仍可能遇到问题。以下是一些典型场景及排查思路。
4.1 问题:扫描很快停止,大量“Timeout”或“No Response”错误。
-
可能原因1:IP已被封禁。
这是最可能的原因。
-
排查
:尝试用同一IP从另一台机器或使用
curl访问一个已知存在的目标子域名(如www.target.com)。如果同样超时或被重置连接,而切换网络后正常,则IP被封。 - 解决 :立即停止当前IP的所有扫描。启用代理池(技巧六),并更换所有配置文件中可能硬编码的源IP(如某些数据源的API调用)。未来务必从更低的速率(技巧二)开始。
-
排查
:尝试用同一IP从另一台机器或使用
-
可能原因2:DNS解析器不稳定或已过载。
-
排查
:检查
resolvers.txt中的DNS服务器。使用dig @8.8.8.8 google.com等命令手动测试几个,看响应是否迅速。 -
解决
:定期更新和测试你的DNS解析器列表。使用
amass intel来筛选优质解析器。增加-timeout值(技巧二)。
-
排查
:检查
-
可能原因3:本地网络或代理连接问题。
- 排查 :检查代理是否可用,网络连接是否稳定。
- 解决 :测试代理连通性。考虑在更稳定的网络环境(如云端VPS)中运行扫描。
4.2 问题:收集到的子域名数量远少于预期。
-
可能原因1:关键被动数据源未启用或失效。
-
排查
:检查
-src参数是否包含了certificates。运行amass enum -list查看当前可用的数据源状态。 -
解决
:确保证书透明日志源被启用。尝试添加多个被动源(技巧四)。对于重要目标,可以手动查询
crt.sh网站进行交叉验证。
-
排查
:检查
-
可能原因2:速率限制过低,导致扫描未完成或超时。
- 排查 :查看Amass输出的日志,是否在扫描结束前就因为超时过多而提前退出。
-
解决
:适当提高
-timeout,并确保在低速扫描(技巧九)的框架下,给予足够的总运行时间。考虑分批次扫描。
-
可能原因3:目标本身资产较少或使用了非常规命名。
-
排查
:通过其他非Amass手段(如搜索引擎
site:语法、GitHub代码搜索)进行交叉验证。 - 解决 :加强字典定制(技巧八),从目标的公开文档、招聘信息、新闻稿中挖掘潜在关键词。
-
排查
:通过其他非Amass手段(如搜索引擎
4.3 问题:使用代理后速度极慢,几乎无法工作。
-
可能原因:代理质量太差或类型不匹配。
-
排查
:测试代理的延迟和带宽。确认代理协议(HTTP/HTTPS/SOCKS5)与Amass配置或
proxychains配置一致。SOCKS5代理对TCP连接的支持更通用。 -
解决
:投资使用高质量的付费代理服务,特别是支持SOCKS5的住宅代理。在
proxychains配置中,可以设置多个代理并配置random_chain或round_robin模式来分担负载和提升可用性。
-
排查
:测试代理的延迟和带宽。确认代理协议(HTTP/HTTPS/SOCKS5)与Amass配置或
4.4 问题:云函数扫描遇到超时或依赖安装失败。
-
可能原因1:单次扫描任务量过大。
- 解决 :进一步细化任务分割。每个云函数只处理几十个或几百个子域名猜测,确保其在超时限制(如3分钟)内能完成。
-
可能原因2:Amass二进制文件体积过大或依赖复杂。
- 解决 :不要尝试在云函数中动态安装Amass。预先将Amass静态编译的二进制文件(或包含其的Docker镜像)与你的扫描脚本一起打包为部署包。对于AWS Lambda,可以使用Lambda Layer或容器镜像来管理依赖。
5. 工具链整合与自动化实践
单一的Amass命令难以实现上述所有技巧的完美结合。一个成熟的攻击面映射流程,必然是一个工具链和自动化脚本的集合。
一个建议的自动化脚本框架(Bash/Python示例思路):
- 初始化配置 :读取配置文件,加载代理列表、DNS解析器列表、自定义字典。
- 被动收集阶段 :调用Amass进行纯被动枚举,结果存入文件A。
- 智能字典生成 :分析文件A,提取关键词,结合通用字典和行业字典,生成本轮扫描的定制字典。
-
主动探测阶段
:
- 从代理池中随机选取一个代理,配置环境。
-
使用极低的速率(
-rate 0.5),配合定制字典和智能变异,运行Amass主动爆破模块,结果存入文件B。 - 每次运行后,随机睡眠一个长间隔(如5-15分钟)。
- 循环步骤,直到定制字典遍历完成,每次循环更换代理。
-
结果处理
:合并文件A和B,去重,使用
httpx进行存活验证,输出最终报告。 - 持续监控 :将上述过程(主要是被动收集)封装,通过系统的定时任务(如Cron)在随机时间点每日执行,并与历史数据库对比,发出资产变更警报。
这个框架将技巧二(速率)、技巧四(被动源)、技巧五(解析器)、技巧六(代理)、技巧八(字典)、技巧九(慢速随机)融合在了一起。实现它需要一定的脚本编写能力,但这是将“技巧”转化为稳定“能力”的关键。
最后需要强调的是,所有这些技巧都必须在 合法授权 的范围内使用。它们的目的不是教人如何作恶,而是让安全专业人员能够更有效地发现那些容易被真正攻击者利用的、隐藏的资产漏洞,从而更好地保护它们。真正的安全,源于比攻击者更深的了解和更持久的耐心。

715

被折叠的 条评论
为什么被折叠?



