构建自动化安全扫描流水线:RapidDNS+Httpx+Nuclei实战指南

📅 2026/6/17 14:44:59
构建自动化安全扫描流水线:RapidDNS+Httpx+Nuclei实战指南
1. 项目概述从“大海捞针”到“精准打击”的自动化革命在红队评估或渗透测试的初期我们常常面临一个经典困境面对一个庞大的目标比如一个大型企业的SRC安全应急响应中心项目如何从海量的潜在资产中快速、精准地找到那些存在已知或未知漏洞的“薄弱点”传统的手工方式比如在搜索引擎中一个个尝试子域名、一个个端口扫描、再一个个用工具去测试效率低下且容易遗漏。这个项目要解决的正是这个痛点。它不是一个单一的工具教程而是一套将资产发现、存活验证、漏洞扫描三个核心环节无缝衔接的自动化流水线。其核心思想是利用RapidDNS这样的网络空间测绘引擎进行高效的子域名枚举通过Httpx对发现的资产进行快速、智能的存活验证与指纹识别最后交由Nuclei这个强大的漏洞扫描引擎进行深度、模板化的漏洞检测。整个过程通过命令行脚本串联实现从输入一个主域名开始到输出一份包含漏洞详情的报告结束的“一键式”闭环。这不仅仅是工具的组合更是一种高效、可复现的实战工作流尤其适合在时间有限的授权测试、红队演练或日常的SRC漏洞挖掘中帮助你快速打开局面建立初始的突破点。2. 核心工具链选型与设计思路为什么是RapidDNSHttpxNuclei这个组合这背后是基于实战效率、资源消耗和结果准确性的综合考量。每个工具都在流水线中扮演着不可替代的角色它们的组合形成了一条高效的数据处理管道。2.1 RapidDNS轻量级、免认证的资产发现入口在资产发现阶段我们有多种选择如Subfinder、Amass、OneForAll等。它们功能强大但通常需要配置多个API密钥如SecurityTrails, Censys, Shodan对于临时性任务或新手来说有一定门槛。RapidDNS的优势在于其完全免费、无需任何认证、查询速度快。它作为一个公开的DNS数据集查询接口能够返回与目标域名相关的子域名、IP等信息。虽然其数据覆盖面可能不及付费的商用平台但对于快速启动一次扫描、获取一批初始资产清单来说它足够好用且稳定。其设计思路是“快速获取一批种子”而不是穷尽所有资产。在实际红队行动中速度往往比百分之百的覆盖率更重要第一批暴露的资产通常也是最容易出成果的。2.2 Httpx智能的HTTP探测与指纹过滤引擎直接从RapidDNS获取的域名列表很多可能是无法解析、解析到内网IP、或者服务器已关闭的。如果直接将上千个无效目标丢给Nuclei会造成巨大的资源浪费和时间消耗。Httpx的作用就是进行资产存活验证与初步分类。它不仅仅是一个简单的HTTP/HTTPS请求工具。它能智能协议探测自动尝试HTTP、HTTPS甚至根据端口猜测协议如8080端口的HTTP。丰富的信息提取获取状态码、响应大小、网页标题、返回头信息、证书信息等。关键技术指纹识别通过响应特征识别中间件Nginx、Apache、IIS、Web框架ThinkPHP、Spring Boot、前端库等。内容过滤可以根据状态码如只保留200、403、500、关键词如包含admin的页面、标题等进行过滤。在流水线中Httpx承上启下。它接收RapidDNS的原始输出过滤掉“死”资产并为存活的资产打上丰富的标签。这些标签对于后续Nuclei的针对性扫描至关重要。例如我们可以只对识别为Spring Boot的应用运行相关的漏洞模板极大提升扫描效率和准确性。2.3 Nuclei基于模板的现代化漏洞扫描器Nuclei是整个流水线的“火力输出”单元。与传统漏洞扫描器不同它基于YAML格式的模板工作。社区有数千个由安全研究员维护的模板覆盖从CVE漏洞、默认凭据、配置错误到逻辑漏洞的广泛类型。它的优势在于高度可定制你可以轻松编写自己的检测逻辑。速度快基于Go语言开发并发能力强。低误报模板通常定义了精确的请求和响应匹配规则。持续更新模板库每天都在增长能快速响应新出现的漏洞。在这个流水线中Nuclei接收经过Httpx清洗和标注的“优质目标列表”并加载相应的模板进行深度检测。我们可以根据Httpx识别的指纹动态选择模板类别实现智能扫描。注意自动化扫描能力强大但必须遵守法律和道德规范。仅在获得明确书面授权的目标上使用此流水线。未经授权扫描他人系统是违法行为。3. 环境准备与工具安装部署工欲善其事必先利其器。下面我们详细讲解在Linux以Kali/Ubuntu为例和Windows系统上搭建这套自动化环境。我会提供多种安装方式并解释其优劣。3.1 核心工具安装指南1. Nuclei 安装Nuclei的安装最为简单因为它提供了编译好的单一可执行文件。Linux/macOS:# 方法一使用官方安装脚本推荐 curl -sL https://raw.githubusercontent.com/projectdiscovery/nuclei/v3/main/install.sh | bash # 安装后将 nuclei 移动到系统 PATH例如 sudo mv nuclei /usr/local/bin/ # 方法二手动下载 # 访问 https://github.com/projectdiscovery/nuclei/releases 下载对应系统的压缩包 wget https://github.com/projectdiscovery/nuclei/releases/download/v3.2.0/nuclei_3.2.0_linux_amd64.zip unzip nuclei_3.2.0_linux_amd64.zip sudo mv nuclei /usr/local/bin/Windows:访问 Nuclei Releases 页面。下载nuclei_*_windows_amd64.zip。解压后你会得到nuclei.exe。你可以将其所在目录添加到系统的PATH环境变量中或者直接在CMD/PowerShell中切换到该目录运行。2. Httpx 安装Httpx同样由ProjectDiscovery开发安装方式与Nuclei几乎一致。Linux/macOS:go install -v github.com/projectdiscovery/httpx/cmd/httpxlatest # 如果未安装Go也可以用下载预编译版本的方式同NucleiWindows: 从 Httpx Releases 页面下载httpx_*_windows_amd64.zip解压得到httpx.exe处理方式同nuclei.exe。3. RapidDNS CLI 工具不我们使用curlRapidDNS本身是一个网站并没有官方的CLI工具。我们的“RapidDNS CLI”指的是通过命令行工具如curl调用其公开的查询接口。curl在Linux和Windows最新版本通常内置或可轻松安装中都是可用的。这是利用现有工具创造价值的典型例子。4. 辅助工具jq为了优雅地处理RapidDNS返回的JSON数据我们需要jq这个强大的命令行JSON处理器。Linux:sudo apt update sudo apt install jq -y # Debian/Ubuntu sudo yum install jq -y # CentOS/RHELmacOS:brew install jqWindows: 可以通过Chocolatey(choco install jq) 或Scoop(scoop install jq) 安装也可以直接从 官网 下载exe文件。3.2 模板与配置初始化安装好工具后还需要进行关键的初始化配置这直接决定了扫描的深度和广度。1. 更新 Nuclei 模板Nuclei的强大依赖于模板。首次使用或定期更新模板至关重要。nuclei -update-templates这个命令会从官方仓库下载最新的漏洞模板到本地默认在~/.nuclei-templates。在自动化脚本中我们可以在扫描开始前先执行一次更新确保检测能力是最新的。2. 配置 Httpx 的探针文件可选但推荐Httpx使用探针文件来识别技术指纹。虽然自带默认探针但使用社区维护的更全的探针库如nuclei-templates中的效果更好。# 假设 nuclei-templates 在默认位置 cp ~/.nuclei-templates/http/technologies/* ~/.config/httpx/probe-config.yaml 2/dev/null || echo 可能需要手动创建目录或查找文件更常见的做法是直接在命令行指定-probe参数使用默认内置的对于大多数场景已足够。实操心得在Linux服务器上部署时建议将这些工具安装在/opt或用户家目录下并做好PATH配置。对于Windows建议创建一个专门的安全工具目录如C:\Tools\将所有exe文件放在里面并将该目录添加到用户环境变量PATH中。这样可以在任何位置的终端直接调用工具为编写自动化脚本打下基础。4. 自动化流水线脚本构建与解析接下来是核心部分如何用Shell脚本Linux/macOS或Batch/PowerShell脚本Windows将这三个工具串联起来。这里我以Bash脚本为例进行详细解析并说明其设计逻辑。Windows PowerShell版本的思路完全一致只是语法不同。4.1 核心脚本autoscan.sh#!/bin/bash # 自动化漏洞挖掘流水线脚本 # 用法./autoscan.sh example.com set -e # 遇到错误立即退出避免错误累积 TARGET_DOMAIN$1 OUTPUT_DIRscan_results_${TARGET_DOMAIN}_$(date %Y%m%d_%H%M%S) mkdir -p $OUTPUT_DIR echo [*] 目标域名: $TARGET_DOMAIN echo [*] 输出目录: $OUTPUT_DIR # 阶段1: 使用 RapidDNS 进行子域名发现 echo [1/3] 正在通过 RapidDNS 发现子域名... RAPIDDNS_URLhttps://rapiddns.io/subdomain/$TARGET_DOMAIN?full1 # 注意实际查询接口可能需要调整。这里模拟一个查询真实情况可能需要解析页面或使用API。 # 以下是假设 RapidDNS 有 JSON 接口的示例命令。若无可能需要用 curl 抓取页面并用 grep/sed 提取。 # 这里我们使用一个更通用的示例通过 curl 请求并利用文本处理提取子域名。 curl -s -L $RAPIDDNS_URL | grep -oE [a-zA-Z0-9._-]\.$TARGET_DOMAIN | sort -u $OUTPUT_DIR/subdomains_raw.txt SUBDOMAIN_COUNT$(wc -l $OUTPUT_DIR/subdomains_raw.txt) echo [] 发现 $SUBDOMAIN_COUNT 个潜在子域名。 if [ $SUBDOMAIN_COUNT -eq 0 ]; then echo [-] 未发现子域名流程终止。 exit 1 fi # 阶段2: 使用 Httpx 进行存活验证和指纹识别 echo [2/3] 正在使用 Httpx 进行存活验证与指纹识别... # -silent: 只输出结果不显示进度条 # -title: 提取页面标题 # -status-code: 输出状态码 # -tech-detect: 进行技术栈指纹识别 # -follow-redirects: 跟随重定向 # -timeout 5: 超时时间5秒 # -threads 50: 并发线程数 httpx -l $OUTPUT_DIR/subdomains_raw.txt -silent -title -status-code -tech-detect -follow-redirects -timeout 5 -threads 50 -o $OUTPUT_DIR/httpx_alive.txt ALIVE_COUNT$(wc -l $OUTPUT_DIR/httpx_alive.txt 2/dev/null || echo 0) echo [] 存活资产数量: $ALIVE_COUNT if [ $ALIVE_COUNT -eq 0 ]; then echo [-] 无存活资产跳过漏洞扫描。 exit 0 fi # 从 httpx 输出中提取纯URL供 Nuclei 使用 # httpx 输出格式可能是https://example.com [200] [Apache] [Title] cat $OUTPUT_DIR/httpx_alive.txt | awk {print $1} $OUTPUT_DIR/urls_for_nuclei.txt # 阶段3: 使用 Nuclei 进行漏洞扫描 echo [3/3] 正在使用 Nuclei 进行深度漏洞扫描... # -l: 从文件读取目标列表 # -severity medium,high,critical: 只扫描中危及以上漏洞避免信息类漏洞刷屏 # -rate-limit 150: 限制请求速率避免对目标造成过大压力 # -timeout 10: 单个请求超时时间 # -retries 2: 重试次数 # -headless: 启用无头浏览器扫描用于检测需要JS渲染的漏洞但较慢 # -system-resolvers: 使用系统DNS解析器 # -stats: 显示实时统计信息 # -o: 输出文件 # -json: 输出为JSON格式便于后续处理 # -silent: 不显示 banner nuclei -l $OUTPUT_DIR/urls_for_nuclei.txt \ -severity medium,high,critical \ -rate-limit 150 \ -timeout 10 \ -retries 2 \ -system-resolvers \ -stats \ -json \ -o $OUTPUT_DIR/nuclei_results.json \ -silent echo [*] 扫描完成 echo [*] 原始子域名列表: $OUTPUT_DIR/subdomains_raw.txt echo [*] 存活资产列表: $OUTPUT_DIR/httpx_alive.txt echo [*] 漏洞扫描结果: $OUTPUT_DIR/nuclei_results.json4.2 脚本关键逻辑解析参数与目录管理脚本接受一个参数目标域名并创建一个带有时间戳的输出目录保证每次扫描结果不会相互覆盖便于归档和管理。RapidDNS 查询模拟脚本中使用了curl加grep的方式从RapidDNS页面提取子域名。这是一个简化示例。在实际中RapidDNS的页面结构可能变化且可能没有直接的JSON API。更稳健的做法是分析RapidDNS网页的实际HTML结构使用grep、awk、sed或pup等工具精确提取。或者使用更专业的子域名枚举工具如subfinder作为替代或补充并将其集成到脚本中。本项目的核心思想是自动化流水线RapidDNS只是资产发现的一种可选输入源。Httpx 参数精讲-tech-detect这是提高后续Nuclei扫描效率的关键。识别出的技术栈会输出在结果中。-follow-redirects很多应用会有HTTP到HTTPS的重定向此参数确保能跟踪到最终地址。-threads并发数需要根据自身网络环境和目标承受能力调整。过高可能导致本地网络拥堵或被目标封禁。Nuclei 参数精讲-severity强烈建议在自动化扫描中限定漏洞等级。如果不加限制Nuclei会运行所有模板包括大量“信息泄露”、“配置披露”等低危模板导致报告冗长核心漏洞被淹没。-rate-limit这是负责任的扫描的关键参数。设置一个合理的速率限制如150每秒避免对目标服务器造成拒绝服务DoS攻击。-json输出JSON格式便于使用jq等工具进行二次分析、筛选和导入到其他平台如Elasticsearch、JIRA。-headless谨慎使用。无头浏览器扫描能发现更复杂的漏洞但速度极慢资源消耗大。通常不在全自动流水线中默认开启而是针对特定目标手动执行。实操心得将这个脚本保存为autoscan.sh后记得赋予执行权限chmod x autoscan.sh。首次运行前最好在一个测试环境如自己搭建的DVWA、bWAPP或获得明确授权的演练目标上试运行观察其行为、输出和资源占用情况并根据实际情况调整参数如超时时间、线程数。5. 进阶优化与场景化定制基础的流水线搭建完成后我们可以根据不同的实战场景对其进行优化和定制使其更智能、更高效。5.1 基于指纹的智能模板选择这是提升扫描效率和精准度的核心优化。我们可以在Httpx扫描后根据识别出的技术栈只运行相关的Nuclei模板。# 在 httpx 扫描后增加一个分析环节 echo [*] 分析技术栈并选择 Nuclei 模板... # 假设我们从 httpx_alive.txt 中提取技术栈这里简化处理如果发现 Spring则运行 spring 相关模板 if grep -qi spring $OUTPUT_DIR/httpx_alive.txt; then echo [] 检测到 Spring 框架启用相关模板扫描。 NUCLEI_TEMPLATE_OPTION-t /root/.nuclei-templates/technologies/spring-boot.yaml -t /root/.nuclei-templates/cves/2023/ fi # 可以添加更多判断如 WordPress, ThinkPHP, Jenkins 等 if grep -qi wordpress $OUTPUT_DIR/httpx_alive.txt; then echo [] 检测到 WordPress启用相关模板扫描。 NUCLEI_TEMPLATE_OPTION$NUCLEI_TEMPLATE_OPTION -t /root/.nuclei-templates/technologies/wordpress.yaml fi # 在最终的 nuclei 命令中加入模板选择 nuclei -l $OUTPUT_DIR/urls_for_nuclei.txt $NUCLEI_TEMPLATE_OPTION -severity medium,high,critical ... (其他参数)更高级的做法是用Python或Go写一个小程序解析Httpx的JSON输出然后动态生成一个针对性的Nuclei命令或配置文件。5.2 结果聚合与报告生成Nuclei输出的JSON文件虽然机器可读但不利于人工快速 review。我们可以用jq进行初步处理生成一个更易读的HTML或Markdown报告。# 使用 jq 从 JSON 结果中提取关键信息生成简易 Markdown 报告 echo # 漏洞扫描报告 - $TARGET_DOMAIN $OUTPUT_DIR/report.md echo **扫描时间:** $(date) $OUTPUT_DIR/report.md echo **目标数量:** $ALIVE_COUNT $OUTPUT_DIR/report.md echo $OUTPUT_DIR/report.md echo ## 漏洞清单 $OUTPUT_DIR/report.md # 提取漏洞信息按严重程度排序 jq -r .[] | ### \(.info.severity | ascii_upcase): \(.info.name)\n- **URL:** \(.host)\n- **协议:** \(.type)\n- **模板:** \(.template)\n- **描述:** \(.info.description)\n- **参考:** \(.info.reference? // \N/A\)\n $OUTPUT_DIR/nuclei_results.json | sort $OUTPUT_DIR/report.md echo [] 已生成报告: $OUTPUT_DIR/report.md你还可以将结果导入到SQLite数据库或者使用Nuclei自带的-me参数指定一个输出目录它会为每个模板类型生成单独的文件。5.3 集成其他资产发现源RapidDNS只是数据源之一。为了提高资产发现覆盖率可以将其与其他工具结合。# 在子域名发现阶段可以并行或串行使用多个源 # 使用 subfinder (需要配置API密钥) subfinder -d $TARGET_DOMAIN -silent -o $OUTPUT_DIR/subfinder.txt # 使用 assetfinder assetfinder --subs-only $TARGET_DOMAIN $OUTPUT_DIR/assetfinder.txt # 合并并去重 cat $OUTPUT_DIR/subdomains_raw.txt $OUTPUT_DIR/subfinder.txt $OUTPUT_DIR/assetfinder.txt 2/dev/null | sort -u $OUTPUT_DIR/all_subdomains.txt # 然后用合并后的文件作为 Httpx 的输入注意事项集成的工具越多需要配置的API密钥也越多脚本的复杂度和运行时间也会增加。根据任务的紧急程度和重要性权衡。6. 实战问题排查与性能调优在真实环境中运行这套流水线你肯定会遇到各种问题。下面是一些常见问题的排查思路和性能调优建议。6.1 常见问题与解决方案问题现象可能原因排查与解决思路RapidDNS查询无结果或结果少1. 目标域名确实子域名很少。2.RapidDNS页面结构已更新grep命令失效。3. 网络问题或RapidDNS限制。1. 手动访问https://rapiddns.io/subdomain/example.com确认。2. 使用浏览器开发者工具查看网页源码调整grep或awk命令。3. 添加curl的-v参数查看请求详情或更换网络。4.备用方案临时换用subfinder或amass进行发现。Httpx扫描速度极慢1. 目标网络延迟高。2. 并发线程 (-threads) 设置过高导致本地端口耗尽或网络拥堵。3. 某些目标响应慢拖累整体进度。1. 增加超时时间 (-timeout)如从5秒加到10秒。2.降低并发数如从100降到30。3. 使用-delay参数在请求间增加延迟。4. 使用-skip参数跳过某些已知慢的或无关的端口。Httpx误报存活返回200但内容是CDN拦截页目标使用了CDN/WAF对所有不存在的子域名返回统一拦截页面。1. 在Httpx命令中添加-filter-string或-filter-regex参数过滤掉包含CDN特定关键词如Access Denied,Fastly,Cloudflare的响应。2. 结合-content-length过滤掉大小固定的拦截页面。Nuclei扫描结果为空或很少1. 存活资产本身确实没有漏洞。2.-severity过滤太严格。3. 模板路径错误或未更新。4. 网络问题导致请求失败。1. 先用-severity low扫描一次看是否有信息类发现。2. 运行nuclei -update-templates更新模板。3. 使用nuclei -l urls.txt -debug查看详细的请求和响应判断是否被WAF拦截。4. 检查nuclei_results.json文件可能Nuclei有输出但被-silent隐藏了。Nuclei被目标封禁IP扫描速率过快触发了目标的防御策略。1.立即降低-rate-limit如从150降到50甚至更低。2. 使用-retries和-timeout应对临时拦截。3. 考虑使用-proxy参数通过代理池进行扫描需确保代理可用且合规。4.最重要的在授权测试中应与客户沟通扫描时段和速率限制。脚本在Windows上无法运行脚本是Bash语法Windows默认不兼容。1. 安装Git Bash、Cygwin或WSL在Bash环境中运行。2. 用PowerShell重写脚本逻辑。PowerShell同样可以调用curl、处理文本和调用exe。6.2 性能与稳定性调优分而治之如果目标资产极多上万不要一次性全部塞给Httpx和Nuclei。可以将资产列表分割成多个小文件分批扫描并结合GNU Parallel等工具进行并行处理同时监控系统资源CPU、内存、网络。结果去重与状态管理对于周期性扫描如每日对SRC资产进行监控应该记录历史扫描结果只对新发现的资产或发生变化的资产进行Nuclei深度扫描。这需要引入简单的数据库或文件对比逻辑。错误处理与日志在脚本中增加更完善的错误处理trap信号和日志记录功能tee命令将每一步的输出和错误信息重定向到日志文件便于后期排查。资源限制在VPS或云服务器上运行长时间扫描时可以使用ulimit或cpulimit等工具限制单个进程的资源使用避免扫描进程耗尽系统资源影响其他服务。7. 扩展思路从脚本到可持续集成的安全平台这套命令行流水线已经具备了强大的自动化能力。但我们可以更进一步将其工程化融入日常的安全运营。1. 与监控系统集成将脚本设置为Cron定时任务定期如每天凌晨对关键资产进行扫描。扫描结果通过jq解析后对于中高危漏洞可以通过Python脚本调用企业微信、钉钉、Slack的Webhook接口发送告警消息实现漏洞的实时感知。2. 构建简易的漏洞管理前端使用Python的Flask/Django或Go的Gin框架开发一个简单的Web界面。后端定期执行扫描脚本将Nuclei的JSON结果解析后存入SQLite或MySQL数据库。前端展示资产列表、漏洞分布、严重等级统计并提供确认、修复、忽略等状态管理功能。这就构成了一个轻量级的内部漏洞扫描与管理平台。3. 作为 CI/CD 的一部分在开发流程中可以将此流水线稍作改造集成到GitLab CI/Jenkins Pipeline中。在测试环境部署完成后自动对新上线的服务进行一次快速的资产发现和安全基线扫描主要运行配置错误、信息泄露类模板确保不会有明显的安全漏洞被带入生产环境。踩坑心得自动化带来了效率也带来了风险。最大的风险是不可控的扫描行为对业务造成影响。因此在任何自动化扫描上线前务必在隔离的测试环境进行充分验证。特别是速率限制 (-rate-limit)、超时时间 (-timeout) 和并发数 (-threads)需要根据目标系统的实际抗压能力反复调整找到一个既高效又安全的平衡点。永远记住我们是安全工程师不是攻击者我们的工具首先要保证安全、可控、合规。这套RapidDNS CLI Nuclei/Httpx的自动化流水线其精髓不在于使用了某个特定的工具而在于将“发现-验证-检测”这一核心工作流通过脚本固化下来实现了标准化和可重复执行。你可以随时替换其中的任何一个组件比如把RapidDNS换成Subfinder或者把Nuclei换成自定义的Python检测脚本只要保持管道的数据流通逻辑不变。它为你提供了一个强大的基础框架剩下的就是根据你的实际战场环境对其进行打磨和武装。