自动化资产侦察框架ferret-scan:集成化漏洞扫描与安全评估实战
2026/5/16 13:34:08 网站建设 项目流程

1. 项目概述:一个被低估的Web资产侦察利器

如果你做过渗透测试或者红队评估,肯定遇到过这样的场景:拿到一个主域名,需要快速摸清它的整个网络资产轮廓——有哪些子域名、哪些IP、哪些端口开放、这些端口上跑着什么服务、服务版本是什么、有没有已知的漏洞。这个过程,我们通常叫做“资产侦察”或“信息收集”。传统做法是什么?子域名爆破用subfinderamass,端口扫描用masscannmap,服务识别和漏洞探测再用nuclei或者写脚本。工具链很长,步骤繁琐,输出结果分散在各个文件里,最后还得自己手动去关联、去重、整理报告,效率很低,而且容易遗漏。

fubak/ferret-scan这个项目,就是为了解决这个痛点而生的。它不是一个单一功能的扫描器,而是一个高度集成化的自动化资产侦察与漏洞扫描框架。你可以把它理解为一个“侦察流水线”的调度中枢。它的核心思路是:你只需要给它一个主域名(或者一个IP段),它就能自动调用一系列顶尖的开源安全工具,按照预设的、最优化的流程,完成从子域名发现、IP解析、端口扫描、服务指纹识别到漏洞探测的全链条工作,并且将所有结果进行聚合、去重、关联,最终生成一份结构清晰、内容全面的HTML报告。

简单来说,它把安全工程师需要手动串联的十几个步骤,打包成了一个命令。这对于需要快速评估大量资产的安全团队、独立安全研究员,甚至是负责自身资产暴露面管理的运维人员来说,价值巨大。它降低了资产侦察的技术门槛,把专家经验固化成了可重复执行的自动化流程。

2. 核心架构与设计哲学:为什么是“框架”而非“工具”?

理解ferret-scan,首先要明白它和nmapmasscan这类工具的本质区别。nmap是“瑞士军刀”,功能强大,但怎么用、用什么参数、按什么顺序用,取决于使用者。ferret-scan则是一个“自动化工厂”,它内置了一套经过验证的最佳实践流水线。

2.1 模块化流水线设计

它的架构是典型的主从模式。核心的ferret-scan.py脚本是调度器,它本身不执行具体的扫描任务,而是负责:

  1. 解析输入:接受域名、IP或文件列表。
  2. 任务编排:根据配置,决定调用哪些工具(我们称之为“模块”或“插件”),以及调用的顺序。
  3. 依赖管理:检查并确保所需的外部工具(如amass,subfinder,nmap,httpx等)已正确安装。
  4. 数据流转:将上一个工具的输出,处理后作为下一个工具的输入。例如,将subfinder发现的子域名,交给dnsx解析出IP,再交给masscan进行端口扫描。
  5. 结果聚合:收集所有工具生成的原始结果文件(通常是.txt.json),进行去重、合并、格式转换。
  6. 报告生成:将聚合后的结构化数据,渲染成易于阅读的HTML报告。

这种设计的好处是灵活和可扩展。如果未来有新的、更好的子域名枚举工具出现,你理论上可以修改配置,将其集成到流水线中,替换掉旧的模块,而无需重写整个扫描逻辑。

2.2 工具链选型的背后逻辑

ferret-scan集成的工具都是社区公认的“明星项目”,选型体现了作者的实战经验:

  • 资产发现层:同时使用amass(被动收集+字典爆破)和subfinder(纯被动收集)。这不是重复劳动,而是“交叉验证”。amass的数据源更全面,但可能慢一些;subfinder速度快,适合快速初筛。两者结合,能最大程度减少遗漏。
  • 端口扫描层:采用masscan(全端口速扫) +nmap(服务深度识别) 的组合拳。这是业内的黄金标准。masscan是“雷达”,几秒钟就能扫完一个C段的所有65535个端口,找到开放的端口。然后,ferret-scan会提取出这些(IP:端口)对,交给nmap进行“抵近侦察”,用更细致的探针去识别服务类型、版本号、甚至操作系统。
  • Web应用探测层:使用httpx。它不仅仅是检测HTTP/HTTPS服务,还能快速获取标题、状态码、响应大小、技术栈(如X-Powered-By头),并能自动从其他非标端口(如8080, 8443)的服务中识别出Web应用。这步非常关键,因为它将“一个开放的TCP端口”转化为了“一个可访问的Web URL”,为后续的漏洞扫描提供了直接目标。
  • 漏洞扫描层:集成nucleinuclei是一个基于YAML模板的快速漏洞扫描器,社区维护了数千个模板,覆盖从信息泄露、配置错误到各种RCE、SQLi的高危漏洞。ferret-scan会将httpx确认的所有Web URL喂给nuclei,进行一轮高效的漏洞筛查。

注意:这个工具链是“贪婪”的,尤其是masscannmap的扫描,可能会对目标网络产生较大流量和负载。务必仅在获得明确授权的资产上进行测试!未经授权的扫描不仅是非法的,还可能触发对方的IDS/IPS,导致你的IP被封锁甚至法律风险。

2.3 输出与报告:信息价值的最终呈现

很多自动化脚本的最终输出是一堆散落的文本文件,需要人工去翻找。ferret-scan的核心价值之一,就是它的报告系统。最终的HTML报告通常包含以下几个核心视图:

  1. 概览仪表盘:显示扫描的域名/IP数量、发现的子域名数、开放端口数、Web服务数、发现的漏洞数量(高、中、低危)等关键指标。
  2. 资产清单:以表格形式列出所有发现的子域名、对应的IP地址、开放的端口及服务。
  3. 服务详情:聚焦每个具体的服务,展示nmap识别的详细信息,如Banner、版本号。
  4. Web应用列表:列出所有由httpx发现的Web URL,附带状态码、标题、技术栈指纹。
  5. 漏洞发现:这是报告的重头戏。它会清晰列出nuclei发现的所有问题,包括漏洞类型、受影响URL、严重等级、以及对应的nuclei模板ID。通常会直接附上请求和响应片段,方便验证。

这份报告不仅是一份技术数据汇总,更是一份可以直接交付给客户或团队内部讨论的“侦察简报”,极大地提升了工作效率和专业度。

3. 从零开始:环境搭建与实战部署

理论讲完了,我们上手实操。假设你有一台干净的Linux服务器(Ubuntu 20.04/22.04为例),我们来一步步搭建ferret-scan的全套环境。

3.1 基础环境与依赖安装

首先,确保系统是最新的,并安装基础的编译和下载工具。

sudo apt update && sudo apt upgrade -y sudo apt install -y git curl wget build-essential libpcap-dev python3 python3-pip

ferret-scan本身是Python3脚本,我们需要安装一些Python库。

pip3 install requests beautifulsoup4 colorama

这些库用于脚本内部的HTTP请求、HTML解析和彩色终端输出。

3.2 核心工具链的安装与配置

这是最繁琐但也最重要的一步。ferret-scan依赖的所有工具都需要手动安装,并确保其可执行文件位于系统的PATH环境变量中。

1. 安装 Go 环境很多工具(如amass,subfinder,httpx,nuclei)是用Go写的,我们需要先安装Go。

cd /tmp wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc echo 'export GOPATH=$HOME/go' >> ~/.bashrc source ~/.bashrc go version # 验证安装

2. 安装资产发现工具

# 安装 amass go install -v github.com/owasp-amass/amass/v4/...@master sudo cp ~/go/bin/amass /usr/local/bin/ # 安装 subfinder go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest sudo cp ~/go/bin/subfinder /usr/local/bin/ # 安装 dnsx (用于DNS解析和筛选) go install -v github.com/projectdiscovery/dnsx/cmd/dnsx@latest sudo cp ~/go/bin/dnsx /usr/local/bin/

3. 安装端口与服务扫描工具

# 安装 masscan (需要从源码编译) cd /tmp git clone https://github.com/robertdavidgraham/masscan.git cd masscan make -j sudo cp bin/masscan /usr/local/bin/ # 安装 nmap (通常系统自带或通过包管理安装) sudo apt install -y nmap

4. 安装Web探测与漏洞扫描工具

# 安装 httpx go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest sudo cp ~/go/bin/httpx /usr/local/bin/ # 安装 nuclei go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest sudo cp ~/go/bin/nuclei /usr/local/bin/ # 首次运行nuclei会自动下载漏洞模板库,也可以手动更新 nuclei -update-templates

5. 验证安装逐一运行以下命令,确保没有“command not found”错误。

amass -version subfinder -version masscan --version nmap --version httpx -version nuclei -version

3.3 获取与配置 ferret-scan

现在安装主角。

cd /opt # 或者你喜欢的任何目录 sudo git clone https://github.com/fubak/ferret-scan.git cd ferret-scan

项目目录结构通常如下:

ferret-scan/ ├── ferret-scan.py # 主脚本 ├── config.ini # 配置文件(可能没有,需要自己创建或修改脚本内参数) ├── tools/ # 可能包含一些辅助脚本或工具 ├── reports/ # 扫描报告输出目录(运行后生成) └── README.md

在运行前,强烈建议你仔细阅读ferret-scan.py脚本的开头部分。里面通常定义了所有外部工具的调用命令和参数。你需要检查这些命令路径是否与你系统的安装路径一致。例如,脚本里可能写的是masscan,而你的masscan如果安装在了/usr/local/bin/下,那通常是没问题的。但如果脚本里写了绝对路径如/opt/masscan/bin/masscan,你就需要修改为正确的路径。

另一个关键点是扫描参数。脚本里masscannmap的参数是直接影响扫描行为和强度的。例如:

  • masscan--max-rate参数:默认可能是10000 packets/second。对于授权测试,你可以根据网络情况调整。速率太高可能造成网络拥堵甚至被当作攻击。
  • nmap-sV(版本探测) 和-sC(默认脚本扫描) 参数:-sC会运行一系列默认的NSE脚本,虽然信息更全,但速度更慢、动静更大。在需要隐蔽或快速扫描时,你可能需要注释掉-sC

实操心得:在第一次对重要目标运行前,我习惯先在一个隔离的测试环境(比如自己的VPS或内网测试机)上跑一遍,观察其行为、流量和输出,确认所有工具都按预期工作,并且参数设置合适。这能避免很多意外。

4. 运行实战与结果分析:针对一个目标的完整扫描

假设我们获得了对example-test.com这个域名的授权测试。我们的目标是摸清它的资产暴露面。

4.1 执行扫描

进入ferret-scan目录,执行:

python3 ferret-scan.py -d example-test.com

如果脚本支持多目标,也可以使用-l target_list.txt参数。

运行后,你会在终端看到流水线式的输出:

[+] 开始对目标: example-test.com 进行侦察 [+] 步骤1: 子域名枚举 (amass)... [+] 发现子域名: 23 个 [+] 步骤2: 子域名枚举 (subfinder)... [+] 发现子域名: 19 个 [+] 步骤3: 解析子域名IP (dnsx)... [+] 获取到唯一IP: 15 个 [+] 步骤4: 端口扫描 (masscan)... [+] 在 15 个IP上发现开放端口: 87 个 [+] 步骤5: 服务识别 (nmap)... [+] 步骤6: Web服务探测 (httpx)... [+] 发现Web服务: 42 个 [+] 步骤7: 漏洞扫描 (nuclei)... [+] 扫描完成!报告已生成: reports/example-test.com_20240527_112233.html

整个过程耗时取决于目标规模,可能从几分钟到几小时不等。masscannmap是主要的时间消耗点。

4.2 报告深度解读

打开生成的HTML报告reports/example-test.com_20240527_112233.html

1. 关注“漏洞发现”板块这是最高优先级的。报告会按高危、中危、低危、信息等级分类。点开一个高危漏洞,例如[CVE-2021-41773] Apache Path Traversal。报告里会给出:

  • 漏洞名称和CVE编号:方便你查找公开的漏洞详情和利用方式。
  • 受影响URLhttp://assets.example-test.com:8080/...
  • 严重等级:High。
  • 请求与响应:通常会展示触发漏洞的HTTP请求包和服务器的响应包。这是关键证据。你需要手动复制这个请求到curlBurp Suite中重放,以确认漏洞真实存在,避免误报。
  • 模板IDnuclei-templates/vulnerabilities/apache/apache-path-traversal.yaml。你可以根据这个路径找到具体的检测规则,理解其原理。

2. 分析“资产清单”与“服务详情”即使没有发现直接漏洞,这部分信息也极具价值。

  • 非常规端口:你是否发现了在80、443之外端口运行的Web服务?比如:8080,:8443,:9000。这些往往是管理后台、开发环境或临时系统,安全防护可能更弱。
  • 老旧服务版本:在“服务详情”里,nmap可能会识别出OpenSSH 7.4,Apache 2.4.49,MySQL 5.5.60。将这些版本号与公开的漏洞数据库(如CVE Details)进行比对,很可能发现已知的、未修补的漏洞。这就是下一步渗透测试的突破口。
  • 资产关联:一个IP上可能绑定了多个子域名。这有助于你理解目标的网络架构。比如,blog.example-test.comshop.example-test.comapi.example-test.com都解析到同一个IP的443端口,但通过HTTPS的SNI区分。这告诉你,这是一个使用了虚拟主机的Web服务器。

3. 审视“Web应用列表”httpx收集的技术栈信息是Web攻击面的风向标。

  • 服务器nginx/1.18.0,Apache/2.4.49
  • 编程语言PHP/7.2.34,Python/3.8.10
  • 前端框架Vue.js,React
  • 中间件/组件WordPress 5.8,ThinkPHP 5.0

这些信息直接指导你的后续测试方法。看到ThinkPHP就要想到其历史RCE漏洞;看到特定版本的WordPress就要去查它的插件和主题是否有已知漏洞。

4.3 扫描后的动作:从信息到行动

一份报告不是终点,而是起点。基于报告,你应该:

  1. 漏洞验证与利用:对nuclei报出的中高危漏洞进行手工验证,尝试构造利用证明(PoC),评估实际风险。
  2. 深度服务测试:对识别出的Redis(端口6379)、MongoDB(端口27017)等数据库服务,尝试未授权访问测试。对SSHFTP等服务,考虑弱口令爆破(必须在授权范围内进行)。
  3. Web路径探测:针对发现的每一个Web URL,使用dirsearchgobuster等工具进行目录和文件爆破,寻找后台登录页、备份文件、配置文件等。
  4. 关联资产拓展:报告中发现的IP段(例如192.168.1.0/24),可以作为新的输入,再次运行ferret-scan(使用-i或文件列表参数),进行内网或同网段资产的横向发现。

5. 进阶调优与避坑指南

默认配置适合一般场景,但要发挥最大威力或适应特殊环境,需要调整。

5.1 性能与效率优化

  • 控制扫描广度与深度:对于非常大的目标(如*.example.com),子域名枚举可能会返回成千上万个结果。这会导致后续的端口扫描任务爆炸。可以在运行amasssubfinder时,通过修改脚本,添加-max-dns-queries-nW等参数来限制解析的并发数,或者先对子域名列表进行初步筛选(比如只保留响应快的)。
  • 分层扫描策略:不要总是全端口扫描。对于已知是Web服务器的IP,可以先用nmap -p 80,443,8080,8443,9000快速扫描常见Web端口。对于其他IP,再进行全端口扫描。这需要你修改脚本,根据资产类型动态生成扫描命令。
  • 利用CDN识别与绕过:如果目标使用了CloudFlare、Akamai等CDN,masscan扫到的IP可能是CDN节点,而非真实服务器。ferret-scan本身不处理这个。你需要额外集成工具如cdncheck,或在扫描前先通过dignslookup判断是否存在CDN,并尝试寻找真实IP(通过历史DNS记录、子域名枚举、SSL证书关联等)。

5.2 常见问题与解决方案

问题1:工具执行报错command not found

  • 原因:工具未安装,或安装路径不在PATH中,或脚本中指定的命令路径错误。
  • 解决
    1. which amass检查工具是否在PATH
    2. 如果不在,用sudo cp /path/to/tool /usr/local/bin/拷贝。
    3. 修改ferret-scan.py脚本,将工具调用命令改为绝对路径(不推荐,维护麻烦)或确保系统PATH正确。

问题2:masscan扫描速度极慢或报错failed to initialize

  • 原因:最常见的是权限问题。masscan需要发送原始数据包,需要root权限或CAP_NET_RAW能力。
  • 解决:使用sudo运行整个ferret-scan.py脚本。但要注意,以root权限运行来自互联网的脚本存在安全风险。更安全的方法是:sudo setcap cap_net_raw+ep /usr/local/bin/masscan,然后以普通用户运行脚本。

问题3:nuclei扫描时间过长,或漏报

  • 原因nuclei默认会使用所有模板进行扫描,模板数量庞大。且网络状况、目标响应速度都会影响。
  • 解决
    1. 限速:在脚本中给nuclei命令添加-rl 150参数,限制每秒最大请求数。
    2. 模板筛选:使用-t cves/只扫描CVE漏洞模板,或-severity critical,high只扫描高危模板,加快速度。
    3. 更新模板:定期运行nuclei -update-templates,确保使用最新的漏洞检测规则。

问题4:报告中的漏洞误报率高

  • 原因:这是自动化扫描的通病。nuclei的模板质量参差不齐,有些检测逻辑可能比较宽泛。
  • 解决自动化扫描的结果永远需要人工复核!将报告中的漏洞作为“线索”,而不是“结论”。每一个中高危漏洞都必须手工验证。这也是专业安全测试和纯工具扫描的区别。

问题5:扫描被目标防火墙/IPS拦截

  • 原因masscan的SYN包速率过高,或nmap的某些探针(如-sC脚本)特征明显。
  • 解决
    1. 降低masscan--max-rate(如降到500)。
    2. nmap参数中去除-sC(脚本扫描)和-O(操作系统探测),只保留-sV(版本探测),减少攻击特征。
    3. 增加--scan-delay-T调整时序模板,使用-T2(Polite) 或-T1(Sneaky) 模式。

5.3 集成到自动化工作流

ferret-scan可以成为你自动化安全监控的一环。例如,结合crontab每周对己方关键资产进行一次扫描,及时发现新增的、不应对外开放的服务或错误配置。你也可以将其集成到CI/CD管道中,在应用上线前对测试环境进行快速的暴露面检查。

一个简单的监控脚本思路:

#!/bin/bash TARGET="your-company-domain.com" REPORT_DIR="/opt/security-scans/reports" LOG_FILE="/var/log/ferret-scan.log" cd /opt/ferret-scan echo "[$(date)] 开始扫描 $TARGET" >> $LOG_FILE python3 ferret-scan.py -d $TARGET >> $LOG_FILE 2>&1 # 移动报告到指定目录,并发送通知(例如通过邮件或Slack) NEW_REPORT=$(ls -t reports/*.html | head -1) cp "$NEW_REPORT" "$REPORT_DIR/" # 此处可以添加发送通知的命令,例如使用 curl 调用 Webhook echo "[$(date)] 扫描完成,报告: $NEW_REPORT" >> $LOG_FILE

最后,我想强调的是,ferret-scan是一个强大的“力量倍增器”,但它不能替代安全工程师的思考和判断。它提供的是广度和效率,而深度和精度则需要依靠人的经验。把它当作你的“侦察卫星”,它能帮你绘制出详细的战场地图,但如何分析地图上的关键据点、选择最佳的进攻路线,仍然取决于指挥官——也就是你。在实际使用中,不断根据反馈调整工具参数和流程,将你的经验反哺到自动化脚本中,才能真正形成战斗力。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询