1. 项目概述:从“大海捞针”到“精准打击”的自动化革命
在红队评估或渗透测试的初期,我们常常面临一个经典困境:面对一个庞大的目标,比如一个大型企业的SRC(安全应急响应中心)项目,如何从海量的潜在资产中,快速、精准地找到那些存在已知或未知漏洞的“薄弱点”?传统的手工方式,比如在搜索引擎中一个个尝试子域名、一个个端口扫描、再一个个用工具去测试,效率低下且容易遗漏。这个项目要解决的,正是这个痛点。它不是一个单一的工具教程,而是一套将资产发现、存活验证、漏洞扫描三个核心环节无缝衔接的自动化流水线。其核心思想是:利用RapidDNS这样的网络空间测绘引擎进行高效的子域名枚举,通过Httpx对发现的资产进行快速、智能的存活验证与指纹识别,最后交由Nuclei这个强大的漏洞扫描引擎进行深度、模板化的漏洞检测。整个过程通过命令行脚本串联,实现从输入一个主域名开始,到输出一份包含漏洞详情的报告结束的“一键式”闭环。这不仅仅是工具的组合,更是一种高效、可复现的实战工作流,尤其适合在时间有限的授权测试、红队演练或日常的SRC漏洞挖掘中,帮助你快速打开局面,建立初始的突破点。
2. 核心工具链选型与设计思路
为什么是RapidDNS+Httpx+Nuclei这个组合?这背后是基于实战效率、资源消耗和结果准确性的综合考量。每个工具都在流水线中扮演着不可替代的角色,它们的组合形成了一条高效的数据处理管道。
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/httpx@latest # 如果未安装Go,也可以用下载预编译版本的方式,同Nuclei - Windows: 从 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/RHEL - macOS:
brew install jq - Windows: 可以通过
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_DIR="scan_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_URL="https://rapiddns.io/subdomain/$TARGET_DOMAIN?full=1" # 注意:实际查询接口可能需要调整。这里模拟一个查询,真实情况可能需要解析页面或使用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.json"4.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检测脚本),只要保持管道的数据流通逻辑不变。它为你提供了一个强大的基础框架,剩下的就是根据你的实际战场环境,对其进行打磨和武装。