1. 项目概述:为什么我们需要联动HTTPX与Subfinder?
在安全研究、渗透测试甚至是日常的资产梳理工作中,我们常常面临一个核心问题:如何高效、准确且自动化地发现并识别一个目标(可能是一个公司、一个域名或一个IP段)在互联网上暴露的所有资产?传统的手工方式,比如在浏览器里一个个敲域名、用各种在线工具查询,不仅效率低下,而且容易遗漏。这正是自动化资产探测与指纹识别工具链的价值所在。
简单来说,这个项目要解决的就是一个“发现”与“识别”的自动化流水线问题。Subfinder扮演的是“侦察兵”的角色,它的核心任务是进行子域名枚举,通过各种公开的API、搜索引擎、证书透明度日志等渠道,尽可能多地发现与目标主域名关联的子域名。而HTTPX则是一位“情报分析师”,它接收侦察兵带回来的海量域名列表,然后快速、并发地对这些域名发起HTTP/HTTPS请求,探测其Web服务是否存活,并从响应中提取关键“指纹”信息,比如使用的Web服务器(Nginx/Apache)、后端框架(ThinkPHP/Spring Boot)、前端技术栈(Vue/React)、甚至是一些特定的标题头、Cookie或页面内容特征。
将两者联动起来,就形成了一条从“目标输入”到“资产清单与指纹报告输出”的自动化流水线。这不仅仅是工具的简单拼接,更是一种工作流的优化。对于安全工程师,这意味着可以快速绘制攻击面地图;对于运维人员,这有助于发现未知的、可能已废弃但仍在线的老旧服务;对于红队评估,这是信息收集阶段不可或缺的自动化环节。整个过程,我们追求的是在保证一定准确率的前提下,将人力从重复、繁琐的收集工作中解放出来,让工具去做它们最擅长的事情。
2. 核心工具选型与工作原理解析
在构建这条自动化流水线之前,我们必须深入理解手中这两件“利器”的核心机制与优劣,这样才能在后续的联动与调优中做到心中有数。
2.1 Subfinder:高效的子域名枚举引擎
Subfinder 是一款用 Go 语言编写的子域名发现工具,它的设计哲学是“快”和“全”。其高效性主要源于以下几个方面:
多源数据聚合:Subfinder 本身并不维护一个庞大的子域名数据库,而是作为一个智能调度器,整合了数十个公开的、免费的子域名数据源。这包括但不限于:
- 证书透明度(CT)日志:如 crt.sh, certspotter。这是目前最有效、最权威的子域名发现途径之一,因为所有公开信任的SSL/TLS证书签发都会被记录。
- 搜索引擎:通过 Google、Bing、DuckDuckGo 等搜索引擎的 dork 语法进行搜索。
- DNS数据集:如 VirusTotal, SecurityTrails, AlienVault OTX 等安全平台提供的DNS解析历史数据。
- 其他API:如 Wayback Machine(网络档案馆)、DNSDB 等。
被动收集为主:Subfinder 的绝大多数数据源属于“被动收集”,即通过查询第三方已有的数据来获取信息,而非主动向目标域名发起大量DNS查询或连接。这使其在隐蔽性上优于传统的暴力枚举工具,不易触发目标的安全警报。
高性能并发:Go 语言的并发模型(goroutine)让 Subfinder 能够以极高的并发度同时查询多个数据源,极大地缩短了整体枚举时间。
实操心得:Subfinder 的“全”依赖于其配置的数据源。默认配置可能无法访问某些需要API密钥的优质源(如 SecurityTrails)。因此,在实际使用中,获取并配置这些API密钥是提升发现效果的关键一步。同时,它的输出结果是“原始”的,包含大量无法解析或无法访问的域名,需要后续工具进行过滤和验证。
2.2 HTTPX:快速、功能丰富的HTTP探测工具
HTTPX 同样是用 Go 语言编写,它被设计为httprobe和httpx等工具的增强版,核心目标是“又快又准地获取HTTP服务信息”。
智能探测与协议检测:HTTPX 不仅支持HTTP/HTTPS,还能智能探测其他协议如 HTTP/3 (QUIC),并自动处理重定向。它会对每个目标尝试多种可能的URL格式(如
http://host,https://host,http://host:8080等),以发现非标准端口的Web服务。强大的指纹识别能力:这是HTTPX的核心价值。它内置了一个庞大的指纹库,能够从多个维度进行匹配:
- HTTP头指纹:检查
Server,X-Powered-By,Set-Cookie等头部信息。 - 正文内容指纹:在HTTP响应正文中搜索特定的关键字、正则表达式模式。
- TLS证书指纹:提取和分析SSL证书中的信息,如颁发者、组织名称,这常用于识别CDN、WAF或特定的云服务。
- 综合技术栈推断:通过组合多个指纹,可以较准确地识别出如
Nginx 1.18 + PHP 7.4 + Laravel 8这样的技术栈组合。
- HTTP头指纹:检查
极高的并发性能:得益于Go的并发,HTTPX 可以轻松以每秒数百甚至上千个请求的速度扫描目标,并保持稳定的资源占用。
注意事项:高并发是一把双刃剑。在扫描外部目标时,过高的速率可能被视为DoS攻击,导致你的IP被目标或中间网络设备封禁。因此,合理控制线程数(-t)和速率限制是生产环境使用的必备考量。
2.3 联动价值:1+1>2
单独使用 Subfinder,你得到的是一个可能很长的域名列表,但其中很多是“死”的(没有Web服务)。单独使用 HTTPX,你需要手动给它喂目标。联动之后,价值凸显:
- 自动化流水线:Subfinder 的输出直接作为 HTTPX 的输入,整个过程无需人工干预。
- 精准过滤:HTTPX 能快速过滤掉无法连通、返回错误状态码(如4xx, 5xx)或无趣响应的目标,只保留存活的、有内容的Web资产。
- 富信息输出:最终得到的不是一堆域名,而是一份包含每个存活资产详细指纹信息(状态码、标题、技术栈、IP、CDN等)的结构化报告(如JSON、CSV),可直接用于后续分析或导入其他系统。
3. 环境准备与工具安装配置
工欲善其事,必先利其器。下面我们将从零开始,搭建一个稳定、高效的联动扫描环境。我推荐在 Linux 系统(如 Ubuntu)或 macOS 上进行,Windows 用户可以通过 WSL 获得近乎一致的体验。
3.1 安装Go语言环境
由于 Subfinder 和 HTTPX 都是 Go 项目,首先需要安装 Go 语言环境。这里以 Ubuntu 为例:
# 1. 下载最新版的Go安装包(请访问 https://go.dev/dl/ 查看最新版本号) wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz # 2. 移除旧版本(如有)并解压到 /usr/local sudo rm -rf /usr/local/go sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz # 3. 将Go二进制目录添加到PATH环境变量 echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile # 如果你使用 bash,也可以添加到 ~/.bashrc echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc # 4. 使环境变量生效 source ~/.profile # 5. 验证安装 go version如果安装成功,会显示类似go version go1.21.0 linux/amd64的信息。
提示:安装Go的主要目的是使用
go install命令来安装工具,这种方式能确保你获得最新的发布版本。你也可以从项目的 GitHub Release 页面直接下载预编译的二进制文件,更简单快捷。
3.2 安装Subfinder与HTTPX
使用go install安装是最推荐的方式,它能自动处理依赖并安装到$GOPATH/bin(通常是~/go/bin)。
# 安装 Subfinder go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest # 安装 HTTPX go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest安装完成后,你需要将Go的二进制目录添加到PATH,以便在终端中直接调用。
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.bashrc source ~/.bashrc现在,你可以通过以下命令验证安装:
subfinder -version httpx -version3.3 配置API密钥以增强Subfinder发现能力
Subfinder 的默认配置已经能工作,但配置API密钥可以解锁更多、更优质的数据源,显著提升子域名发现的广度和深度。
生成配置文件:首次运行
subfinder会在$HOME/.config/subfinder目录下生成配置文件provider-config.yaml。subfinder -h # 简单运行一下,生成配置目录和文件获取并配置API密钥:你需要注册相应服务来获取密钥。以下是一些关键源的配置示例:
- SecurityTrails:提供非常全面的DNS历史数据。注册免费账户可获得有限额度的API。
- Shodan:网络设备搜索引擎,对发现非Web服务很有用。
- Censys:与Shodan类似,证书数据丰富。
- GitHub:通过GitHub API搜索代码中泄露的子域名、API密钥等。
- VirusTotal:安全社区共享的DNS数据。
编辑
~/.config/subfinder/provider-config.yaml,找到对应部分填入你的API密钥:censys: - id: "你的-censys-api-id" secret: "你的-censys-api-secret" # ... 其他配置保持默认 securitytrails: - "你的-securitytrails-api-key" shodan: - "你的-shodan-api-key" github: - "你的-github-personal-access-token" - "另一个github-token(可选,用于提高速率限制)"验证配置:配置完成后,可以使用
subfinder -d example.com -all进行测试。使用-all参数会启用所有配置的源(包括需要密钥的)。观察输出结果的数量和质量,与不使用-all时进行对比。
实操心得:API密钥的管理很重要。建议使用密码管理器保存这些密钥。对于团队使用,可以考虑将配置文件模板化,通过环境变量或安全的配置管理工具来注入密钥,而不是将硬编码的密钥提交到代码仓库。
3.4 基础联动命令测试
在深入自动化脚本之前,我们先在命令行中手动测试一下管道联动的效果,理解数据流。
# 基本联动:发现 example.com 的子域名,并探测其中存活的HTTP服务 subfinder -d example.com -silent | httpx -silent # 解释: # `subfinder -d example.com -silent`: 枚举 example.com 的子域名,-silent 只输出结果,不显示横幅和统计。 # `|`: 管道符,将 subfinder 的输出作为 httpx 的输入。 # `httpx -silent`: 读取管道传入的域名列表进行探测,-silent 只输出存活的URL。运行后,你可能会看到类似http://blog.example.com,https://api.example.com这样的输出。这证明联动的基础功能是通的。
4. 构建自动化扫描脚本与工作流
手动输入命令适合临时测试,但对于持续性的监控或批量扫描任务,我们需要一个更健壮、功能更完整的自动化方案。下面我将分享一个我常用的 Bash Shell 脚本,并逐步解析其设计思路和每个参数的意义。
4.1 基础联动脚本编写
创建一个文件,例如automated_scan.sh,并赋予执行权限。
#!/bin/bash # automated_scan.sh - HTTPX与Subfinder自动化联动扫描脚本 # 作者:你的名字 # 描述:对指定域名进行子域名枚举、HTTP探测、指纹识别,并生成结构化报告。 # 定义目标域名 TARGET_DOMAIN="example.com" # 定义输出文件前缀 OUTPUT_PREFIX="scan_${TARGET_DOMAIN}_$(date +%Y%m%d_%H%M%S)" # 定义临时文件 SUBFINDER_OUTPUT="${OUTPUT_PREFIX}_subfinder.txt" HTTPX_JSON_OUTPUT="${OUTPUT_PREFIX}_httpx.json" HTTPX_CSV_OUTPUT="${OUTPUT_PREFIX}_httpx.csv" echo "[*] 开始对目标 ${TARGET_DOMAIN} 进行自动化资产探测..." echo "[*] 输出文件前缀: ${OUTPUT_PREFIX}" # 步骤1: 使用Subfinder进行子域名枚举 echo "[1] 正在执行子域名枚举 (Subfinder)..." subfinder -d "${TARGET_DOMAIN}" -all -o "${SUBFINDER_OUTPUT}" -silent SUB_COUNT=$(wc -l < "${SUBFINDER_OUTPUT}" 2>/dev/null || echo 0) echo "[1] 完成。发现 ${SUB_COUNT} 个子域名。结果已保存至: ${SUBFINDER_OUTPUT}" if [ "${SUB_COUNT}" -eq 0 ]; then echo "[!] 未发现任何子域名,扫描终止。" exit 1 fi # 步骤2: 使用HTTPX进行HTTP探测与指纹识别 echo "[2] 正在执行HTTP探测与指纹识别 (HTTPX)..." httpx -l "${SUBFINDER_OUTPUT}" \ -title \ -status-code \ -tech-detect \ -cdn \ -ip \ -cname \ -web-server \ -tls-grab \ -json \ -o "${HTTPX_JSON_OUTPUT}" \ -csv \ -o "${HTTPX_CSV_OUTPUT}" \ -threads 50 \ -timeout 10 \ -retries 2 \ -silent HTTPX_COUNT=$(jq length "${HTTPX_JSON_OUTPUT}" 2>/dev/null || echo 0) echo "[2] 完成。发现 ${HTTPX_COUNT} 个存活Web资产。" echo " JSON报告: ${HTTPX_JSON_OUTPUT}" echo " CSV报告: ${HTTPX_CSV_OUTPUT}" echo "[*] 全部流程执行完毕!"脚本关键参数解析:
Subfinder 部分:
-all: 使用所有配置的源(包括需要API密钥的)。-o: 指定输出文件。将结果保存到文件,而不是直接输出到终端,便于后续处理和作为HTTPX的输入。-silent: 静默模式,减少不必要的输出,让日志更清晰。
HTTPX 部分:
-l: 从文件读取目标列表,这里读取Subfinder的输出文件。-title: 提取HTML页面的标题(<title>标签内容)。-status-code: 输出HTTP状态码。-tech-detect:核心功能,启用技术栈指纹识别。-cdn: 检测目标是否使用了CDN(内容分发网络)。-ip: 解析并输出服务器的IP地址。-cname: 输出CNAME记录(如果有)。-web-server: 识别Web服务器软件(如Nginx, Apache)。-tls-grab: 获取TLS/SSL证书信息。-json -o: 以JSON格式输出完整结果,便于程序解析。-csv -o: 同时输出CSV格式,便于用Excel/Numbers等表格软件查看。-threads: 并发线程数,根据网络情况和目标承受能力调整(50是一个相对保守的起始值)。-timeout: 单个请求超时时间(秒)。-retries: 失败重试次数。
运行脚本:bash automated_scan.sh。脚本会生成带有时间戳的文件,如scan_example.com_20231027_143022_subfinder.txt和对应的JSON/CSV报告。
4.2 进阶:集成到CI/CD或定时任务
基础脚本可以手动运行,但自动化精髓在于“定时”和“事件驱动”。我们可以利用 Linux 的cron或更现代的调度系统(如systemd timers)来实现定期扫描。
使用Cron定时任务: 编辑当前用户的cron表:
crontab -e添加一行,例如每天凌晨2点执行一次扫描,并将日志输出到文件:0 2 * * * cd /path/to/your/script && /bin/bash /path/to/your/script/automated_scan.sh >> /path/to/scan.log 2>&1扫描结果差异对比: 定期扫描会产生大量报告。一个有用的进阶功能是对比两次扫描的结果,快速发现新增或消失的资产。我们可以用一个简单的脚本来实现:
#!/bin/bash # diff_scan.sh - 对比两次扫描的存活资产 PREV_JSON="scan_example.com_20231026_020000_httpx.json" CURR_JSON="scan_example.com_20231027_020000_httpx.json" # 使用jq提取URL字段并排序 jq -r '.url' "${CURR_JSON}" | sort > current_urls.txt jq -r '.url' "${PREV_JSON}" | sort > previous_urls.txt echo "[*] 新增的资产:" comm -13 previous_urls.txt current_urls.txt # 只存在于current的文件 echo "" echo "[*] 消失的资产:" comm -23 previous_urls.txt current_urls.txt # 只存在于previous的文件这个脚本利用了
comm命令和jqJSON处理器。将此类对比脚本集成到主扫描流程之后,可以实现自动化的资产变更告警。
4.3 输出结果解析与利用
扫描完成后,我们得到了结构化的JSON和CSV报告。如何有效利用这些数据?
JSON报告深度分析: JSON文件包含了每个存活资产的丰富信息。使用jq工具可以轻松进行查询和过滤。
# 1. 查看所有使用了Nginx的资产 jq '.[] | select(.webserver | contains("nginx")) | .url' scan_*.json # 2. 查找状态码为200且标题包含“后台”或“admin”的资产(可能是管理后台) jq '.[] | select(.status_code == 200) | select(.title | ascii_downcase | test("admin|后台|login|管理")) | {url: .url, title: .title}' scan_*.json # 3. 统计使用不同Web服务器的资产数量 jq '[.[].webserver] | group_by(.) | map({server: .[0], count: length}) | sort_by(.count) | reverse' scan_*.json # 4. 提取所有使用了特定技术栈(如Spring Boot)的资产 jq '.[] | select(.tech != null) | select(.tech[] | contains("spring")) | {url: .url, tech: .tech}' scan_*.jsonCSV报告的直观查看: CSV文件可以直接用Excel、Google Sheets或LibreOffice Calc打开。你可以进行排序、筛选和制作图表。例如,按状态码排序快速找到成功的请求(200),按“技术栈”列筛选出所有使用ThinkPHP的站点进行重点分析。
将结果导入其他工具: JSON格式的通用性使其可以轻松导入到其他安全工具或平台中,例如:
- 导入到漏洞扫描器:将存活的URL列表导出,作为 Nuclei, Xray 等漏洞扫描器的输入目标。
- 可视化展示:使用 Python 的
pandas和matplotlib库,或者 ELK Stack (Elasticsearch, Logstash, Kibana) 对扫描结果进行可视化,绘制资产地图、技术栈分布图等。
5. 性能调优、错误处理与最佳实践
当扫描目标规模变大(例如,一个拥有数千子域名的大型企业)时,默认配置可能遇到性能瓶颈或产生大量错误。下面分享一些调优和稳定运行的实战经验。
5.1 性能调优参数详解
控制并发 (
-threads):- 默认值:HTTPX默认是50,Subfinder也有并发控制。
- 调优建议:
- 对内网扫描:可以适当提高(如100-200),因为网络延迟低,带宽充足。
- 对公网目标:建议保持保守(50-100)。过高的并发会被目标服务器或你的ISP视为攻击流量。对于重要的合规性扫描,更应降低并发(如20-30),体现“友好扫描”。
- 观察指标:运行
top或htop命令,观察CPU和网络使用率。如果网络带宽已饱和或CPU占用持续过高,应降低线程数。
超时与重试 (
-timeout,-retries):-timeout:默认5秒。对于响应慢的服务器或特定路径的探测,可能需要延长。我通常设置为10秒,在广域网扫描中比较平衡。-retries:默认1次。在网络不稳定或目标临时拥塞时,增加重试次数(如2-3次)可以有效减少因偶发性网络问题导致的漏报。
资源限制与速率限制:
- 限制解析速率:HTTPX 的
-rate-limit参数可以限制每秒请求数,是比单纯控制线程数更精细的流量控制手段。例如-rate-limit 150表示每秒不超过150个请求。 - 限制DNS解析器:使用
-r参数指定自定义的DNS解析器列表(如8.8.8.8,1.1.1.1),可以避免使用系统默认解析器可能带来的性能瓶颈或查询限制。
- 限制解析速率:HTTPX 的
Subfinder的源选择:
- 不是所有源都越快越好。有些免费源速率限制很严格。在
provider-config.yaml中,你可以为每个源配置单独的线程数和超时。对于慢速但数据优质的源,可以单独降低其并发。
- 不是所有源都越快越好。有些免费源速率限制很严格。在
5.2 常见错误排查与处理
在自动化运行中,脚本可能会遇到各种错误,我们需要让脚本更健壮。
网络连接失败:
- 表现:HTTPX 大量输出
[ERR]或超时。 - 排查:首先手动
ping或curl一个已知存活的网站,检查本机网络。其次,检查是否触发了目标的防火墙或WAF规则(可以尝试降低速率、更换User-Agent)。 - 脚本处理:在脚本中增加网络检查环节。
# 在脚本开始处添加网络连通性测试 if ! curl -s --max-time 5 https://httpbin.org/status/200 > /dev/null; then echo "[!] 网络连接检查失败,请检查网络后重试。" exit 1 fi
- 表现:HTTPX 大量输出
工具执行失败:
- 表现:
subfinder或httpx命令返回非零退出码。 - 排查:检查工具是否安装正确(
which subfinder),是否有执行权限。检查输入文件格式是否正确。 - 脚本处理:在关键命令后检查其退出状态
$?。subfinder -d "${TARGET_DOMAIN}" -o "${SUBFINDER_OUTPUT}" if [ $? -ne 0 ]; then echo "[!] Subfinder 执行失败,请检查配置或网络。" # 可以选择发送告警邮件或通知 exit 1 fi
- 表现:
磁盘空间不足:
- 表现:写入文件失败。
- 脚本处理:在脚本开始或写入文件前检查磁盘空间。
REQUIRED_SPACE_MB=500 # 预估所需空间 AVAILABLE_SPACE_MB=$(df -m /path/to/output | awk 'NR==2 {print $4}') if [ "$AVAILABLE_SPACE_MB" -lt "$REQUIRED_SPACE_MB" ]; then echo "[!] 磁盘空间不足(剩余${AVAILABLE_SPACE_MB}MB,需要${REQUIRED_SPACE_MB}MB)。" exit 1 fi
API密钥失效或限额用尽:
- 表现:Subfinder 使用
-all参数时,输出结果异常少,且日志中可能有特定源的错误信息。 - 排查:运行
subfinder -d example.com -v查看详细日志,观察哪个源报错。登录对应平台检查API密钥状态和用量。 - 脚本处理:难以在脚本中直接检测,但可以定期(例如每周)运行一个针对已知域名的测试扫描,对比结果数量,如果骤减则发出告警。
- 表现:Subfinder 使用
5.3 安全与合规性最佳实践
自动化扫描是一把利器,但使用不当可能带来法律风险或对目标系统造成影响。请务必遵守以下原则:
- 明确授权:仅扫描你拥有或已获得明确书面授权扫描的资产。未经授权扫描他人系统是违法行为。
- 控制扫描强度:
- 速率限制:始终使用
-rate-limit或较低的-threads。 - 避开高峰时段:如果扫描生产环境,尽量安排在业务低峰期(如凌晨)。
- 设置友好的User-Agent:HTTPX 支持
-H参数自定义头部。可以设置一个能标识你身份的User-Agent,例如-H "User-Agent: Security-Scan-Bot/1.0 (Contact: security@your-company.com)"。这样如果触发告警,对方管理员可以联系到你。
- 速率限制:始终使用
- 尊重
robots.txt:虽然HTTPX不自动遵守robots.txt,但对于授权的扫描,你应该主动避免扫描robots.txt中明确禁止的路径,以示尊重。 - 数据安全:扫描结果可能包含敏感信息(如内部域名、技术栈版本)。务必妥善保管报告文件,设置适当的访问权限,避免泄露。
- 监控与日志:对于自动化定时任务,一定要有详细的运行日志和错误监控。脚本应将运行状态(开始、结束、发现的资产数、错误信息)记录到日志文件或发送到监控系统(如 Prometheus + Grafana, 或简单的邮件/钉钉/飞书通知)。
6. 实战案例:从发现到初步分析
让我们通过一个模拟的实战场景,将前面所有知识串联起来。假设我们获得了对test-org.com这个域名的授权扫描。
第一步:初始化扫描我们运行增强版的脚本,它包含了更全面的HTTPX参数和基本的错误检查。
./automated_scan.sh(脚本内已将TARGET_DOMAIN设置为test-org.com)
第二步:结果摘要分析扫描完成后,脚本输出:
[*] 完成。发现 127 个存活Web资产。我们有了scan_test-org.com_xxxx_httpx.json文件。
第三步:使用jq进行快速威胁研判我们不是简单地看着127个URL发呆,而是有目的地挖掘信息。
寻找暴露的管理后台:
jq -r '.[] | select(.status_code == 200) | select(.title | ascii_downcase | test("admin|login|dashboard|control|管理|后台|登录")) | {url, title, status_code}' scan_test-org-com_*.json可能发现
https://admin.test-org.com(标题: “TestOrg Admin Portal”),这是一个需要重点检查的入口点。识别老旧或存在已知漏洞的组件:
# 查找使用旧版本Web服务器的资产 jq -r '.[] | select(.webserver | test("Apache/2.2|nginx/1.14|IIS/7.5")) | {url, webserver}' scan_test-org-com_*.json # 查找使用特定危险框架或版本的资产(示例:ThinkPHP) jq -r '.[] | select(.tech != null) | select(.tech[] | contains("thinkphp")) | {url, tech}' scan_test-org-com_*.json | head -5发现测试/开发环境:
jq -r '.[] | select(.url | test("dev|test|staging|qa")) | {url, title}' scan_test-org-com_*.json开发环境的安全标准往往低于生产环境,是很好的突破点。
分析资产分布:
# 统计Top 10 IP地址,看是否有资产集中在少数服务器上 jq -r '.[] | .ip' scan_test-org-com_*.json | sort | uniq -c | sort -rn | head -10 # 统计技术栈分布 jq '[.[].tech // ["Unknown"]] | flatten | group_by(.) | map({tech: .[0], count: length}) | sort_by(.count) | reverse' scan_test-org-com_*.json
第四步:生成 actionable 的报告将上述分析结果,结合CSV/JSON原始数据,整理成一份给安全团队或运维团队的报告。报告应包括:
- 执行摘要:扫描时间、目标、发现资产总数、存活资产数。
- 关键发现:列出疑似管理后台、使用老旧组件、测试环境等高风险资产。
- 资产清单:附上完整的CSV文件作为附件。
- 建议:例如“建议对
Apache/2.2.34版本进行升级”、“建议对admin.test-org.com实施双因素认证”。
通过这个流程,我们不仅完成了自动化的资产发现,更实现了从“数据收集”到“情报提炼”的跨越,为后续的深入安全评估或资产治理提供了扎实的输入。整个过程中,Subfinder和HTTPX的稳定、高效联动是这一切的基础。