如果把 nmap 比作手持雷达,逐栋楼敲门确认住户信息,那 masscan 就是一架侦察无人机——它不等待回应,以每秒数万包的速度飞掠整个城市,六分钟内就能绘制出整座城市每一扇窗户的开闭状态。这种"拍完即走"的扫描哲学,让它在全端口扫描场景下无可替代。但侦察不止于扫描:搜索引擎、DNS 记录、证书透明度日志中藏着大量目标从未主动公开的信息。本篇将覆盖 masscan 高速扫描和被动侦察两大领域,读完你将能运用 masscan 在分钟级完成 /16 网段全端口扫描,用 Google Dorking 从公开渠道提取目标敏感信息,用 subfinder 和 amass 枚举隐藏子域名,用 theHarvester 收集邮箱和员工信息。
上一篇详细介绍了 nmap 的主机发现、端口扫描、版本探测和 NSE 脚本。nmap 功能全面,但在一个场景下力不从心:大规模全端口扫描。对一个 /24 网段执行 nmap -p- -sS(65535 个端口 × 256 台主机),即便使用 T4 时序模板,也需要 30 分钟以上。如果目标是 /16 网段(65536 台主机),扫描时间会膨胀到数天。
这就是 masscan 诞生的原因。Robert Graham 在 2013 年开发了这款工具,核心设计目标只有一个字:快。
nmap 默认的 SYN 扫描是"有状态"的:它发送一个 SYN 包后,会在内核中维护连接状态表,等待目标的 SYN-ACK 回应。如果收到回应,再发送 RST 包关闭连接;如果超时未收到,则重传。这种机制保证了可靠性,但也带来了性能瓶颈——内核连接跟踪表有大小限制,大量并发连接会耗尽表项。
此外,nmap 对每个端口的探测包含超时等待和重传逻辑。默认重传 0 次(--max-retries 0 可加速但降低可靠性)。在高速网络中,丢包率上升会导致大量误判。
masscan 采用了完全不同的架构——"无状态"SYN 扫描。它绕过操作系统的 TCP/IP 协议栈,直接使用原始套接字(raw socket)发送 SYN 包,完全不跟踪连接状态。发完就忘,不管目标是否回应、何时回应。
当目标的 SYN-ACK 回来时,masscan 的抓包引擎(基于 libpcap)会捕获这个回应包,从中提取源 IP 和源端口,记录为"开放"。如果收到 RST,则记录为"关闭"或"被过滤"。
这种设计意味着 masscan 的发送速度不受连接跟踪表限制,只受网卡带宽和 CPU 包处理能力约束。在 10Gbps 网络环境下,masscan 理论上可达每秒 1000 万包的发送速率——这意味着 6 分钟内扫描完整个 IPv4 地址空间(0.0.0.0/0)的 65535 个端口。
| 对比项 | nmap | masscan |
| 扫描模式 | 有状态 SYN,维护连接表 | 无状态 SYN,发完即忘 |
| 最大速率 | 每秒数百到数千包 | 每秒可达 1000 万包 |
| 版本探测 | 强大(-sV,服务指纹库) | 有限(--banners,仅抓取 Banner) |
| OS 识别 | 支持(-O,TCP/IP 指纹) | 不支持 |
| NSE 脚本 | 600+ 脚本(漏洞检测等) | 不支持 |
| 全端口 /16 扫描 | 数天 | 数分钟 |
| 可靠性 | 高(重传 + 超时调整) | 中(高速时丢包影响准确率) |
| 最佳场景 | 小范围深度扫描 | 大范围快速端口发现 |
iptables -A INPUT -p tcp --tcp-flags SYN,RST RST -j DROP。这也是为什么 masscan 通常需要 root 权限——它要直接操作原始套接字。在实际渗透测试中,masscan 和 nmap 不是竞争关系,而是搭档关系。典型工作流分两步:
第一步:masscan 快速发现——对目标网段执行全端口扫描,以高速发现所有开放端口,生成开放端口列表。
第二步:nmap 深度扫描——将 masscan 发现的端口列表传递给 nmap,执行 -sV -sC 进行版本探测和脚本扫描。因为只需要扫描少量已确认开放的端口,nmap 速度会大幅提升。
Kali Linux 默认仓库包含 masscan,可直接通过 apt 安装:
masscan 最新 tagged 发布版是 1.3.2(2021 年 1 月),但项目的 master 分支持续活跃维护至 2026 年 4 月(修复了 SMB 模块的段错误等问题)。如果遇到 apt 版本的 bug,建议从源码编译获取最新修复。编译依赖仅有 libpcap-dev 和 gcc,非常轻量。
masscan 的命令格式简洁直观:
这条命令扫描 192.168.1.0/24 网段的 80 和 443 端口,速率限制在每秒 1000 包。sudo 是必须的——masscan 需要创建原始套接字来绕过系统 TCP 协议栈。
| 参数 | 说明 | 示例 |
| -p | 指定目标端口,支持逗号和范围 | -p 80,443,8080 / -p 1-65535 |
| --rate | 发包速率(包/秒),核心控速参数 | --rate=10000 |
| --wait | 发完包后等待回应的秒数 | --wait=5 |
| -e | 指定网卡接口 | -e eth0 |
| --adapter-ip | 指定源 IP(多 IP 场景) | --adapter-ip 10.0.0.100 |
| --shard | 分片扫描(分布式扫描某一段) | --shard 1/3(三取一) |
| --banners | 抓取 Banner 信息(有限版本探测) | --banners |
| -oJ/-oG/-oX | 输出为 JSON/grepable/XML 格式 | -oJ results.json |
| --exclude | 排除特定 IP 或网段 | --exclude 10.0.0.1 |
| --retries | 重传次数(默认 0,提高可靠性) | --retries 2 |
masscan 不加 sudo,会报错 FAIL: failed to detect route to ... 或 couldn't open adapter。masscan 必须以 root 权限运行才能创建原始套接字(raw socket),这是无状态 SYN 扫描的基础。普通用户没有 CAP_NET_RAW 能力,无法直接操作数据链路层。masscan 支持通过配置文件批量设置参数,适合需要重复执行相同扫描任务的场景。配置文件格式为 key = value 形式:
配置文件中 exclude 参数很实用——扫描内网时排除网关和核心设备,避免触发告警或影响业务。
以下操作在本地靶机环境(192.168.1.0/24)执行。先从最简单的单端口扫描开始:
扫描结果以 Discovered open port 格式直接输出到终端。256 台主机的单端口扫描在 1000 pps 速率下不到 1 秒完成。
masscan 最核心的使用场景——对目标执行 1-65535 全端口扫描:
--wait 参数很容易被忽略但至关重要。masscan 发包速度极快,发完所有包可能只需要几秒,但最后发送的 SYN 包的 SYN-ACK 回应还在网络中传输。--wait=5 让 masscan 在发包结束后再等 5 秒收集迟到的回应。不加此参数会导致远端主机的开放端口被遗漏——尤其是高延迟网络中,丢包率可能高达 30% 以上。masscan 的 --rate 参数决定了扫描速度,但并非越快越好。速率选择取决于三个因素:网络带宽、目标负载承受能力、自身不想被 IDS 发现的程度。
| 速率 | 场景 | /24 全端口耗时 | 隐蔽性 |
| --rate=100 | 谨慎扫描,避免触发告警 | 约 46 小时 | 高 |
| --rate=1000 | 常规扫描,适合内网测试 | 约 4.6 小时 | 中 |
| --rate=10000 | 快速扫描,适合授权渗透 | 约 28 分钟 | 低 |
| --rate=100000 | 激进扫描,需高速网络 | 约 3 分钟 | 极低 |
--rate=100000 扫描时,如果网络带宽不足(如百兆网络),大量数据包会在路由器/交换机缓冲区排队导致拥塞丢包。判断方法:查看 masscan 输出末尾的统计,如果 actual 时间远大于 total 时间,说明网络拥塞导致发包延迟。降低 rate 到网卡带宽的 70% 左右通常是安全区间。百兆网卡建议不超过 5000 pps,千兆网卡建议不超过 50000 pps。masscan 支持三种输出格式,各有用途:
JSON 输出格式如下,每条记录包含 IP、端口、协议、时间戳和 Banner(如果启用):
grepable 格式与 nmap 的 -oG 兼容,可用 grep "open" result.gnmap 快速过滤开放端口,方便在脚本中串联使用。
masscan 的 --banners 参数可以在发现开放端口后尝试建立完整 TCP 连接并抓取服务 Banner。这不能替代 nmap 的版本探测(-sV),但能快速获取服务信息:
注意 --banners 会降低扫描速度(每个开放端口都需要完成 TCP 三次握手并等待 Banner 数据),且 HTTP 服务通常不会主动发送 Banner,需要客户端先发送请求。对于 Web 服务指纹识别,建议后续用 nmap 的 -sV 或 whatweb 工具。
现在把前一篇的 nmap 和本篇的 masscan 串起来,构建一个实战渗透测试中常用的"两阶段扫描"工作流。
核心思路:让 masscan 做它最擅长的事——高速发现开放端口,让 nmap 做它最擅长的事——版本探测和脚本扫描。
数据流:masscan 扫描 → 提取开放端口列表 → 传递给 nmap -p 参数 → nmap 对已知开放端口执行深度扫描。由于 nmap 只需扫描确认开放的少量端口(而非 65535 个全端口),速度提升可达数十倍。
以下 Bash 脚本实现完整的两阶段扫描工作流:
脚本逻辑解析:
第 6-7 行:masscan 全端口扫描,速率 10000 pps,等待 10 秒收集回应,输出为 grepable 格式。
第 10-14 行:管道链解析 grepable 输出——grep 提取含 "Ports:" 的行,正则匹配 "数字/open",cut 取端口号部分,sort + uniq 去重排序,paste 合并为逗号分隔字符串。
第 20-21 行:nmap 对开放端口执行 -sV(版本探测)和 -sC(默认脚本扫描),输出为文本和 XML 双格式。
-oG 输出中每行一个主机,端口状态格式为 80/open/tcp//http///;而 masscan 的 grepable 格式为 80/open/tcp。上述脚本中用 [0-9]+/open 正则兼容了两种格式,所以也可以直接处理 nmap 的 grepable 输出。如果使用 JSON 输出,可以用 Python 更精确地解析:
使用方式:python3 parse_masscan.py result.json 输出逗号分隔的端口列表,可直接用于 nmap 的 -p 参数。
主动扫描会向目标发送数据包,可能被 IDS/IPS 检测到。而被动侦察不直接接触目标系统——信息来源是搜索引擎、DNS 记录、证书透明度日志等公开渠道。目标完全无感知。
Google Dorking(也称 Google Hacking)是利用搜索引擎的高级搜索语法,从公开索引的网页中提取目标敏感信息的技术。MITRE ATT&CK 框架将其映射为 T1593 Search Open Websites/Domains。
Google 支持多个搜索操作符,组合使用可以精确过滤结果:
| 操作符 | 功能 | 示例 |
| site: | 限定搜索特定域名 | site:example.com |
| filetype: | 限定文件类型 | filetype:pdf |
| inurl: | URL 中包含特定关键词 | inurl:admin |
| intitle: | 页面标题包含特定关键词 | intitle:"index of" |
| intext: | 页面正文中包含特定关键词 | intext:"password" |
| ext: | 文件扩展名(同 filetype:) | ext:php |
| cache: | 查看 Google 缓存的页面 | cache:example.com |
以下是渗透测试中常用的 Google Dork 组合,用于发现目标暴露的敏感信息:
site:target.com 限定范围后查询量会自然降低;也可以交替使用 Bing、DuckDuckGo 等不同搜索引擎分担查询负载。Google Hacking Database(GHDB)是 Exploit-DB 维护的 Dork 集合,可搜索关键词"GHDB"找到分类整理的 Dork 列表。Google Dorking 的价值不在于单个查询,而在于系统化地覆盖信息收集的各个维度。一个完整的被动侦察应该覆盖:
技术信息——服务器版本、CMS 类型、框架指纹。如 site:example.com intitle:"Apache Status" 可能暴露 Apache 状态页面。
敏感文件——配置文件、备份文件、数据库导出。如 site:example.com ext:bak intext:"DB_PASSWORD" 搜索泄露的 WordPress 配置备份。
员工信息——邮箱、姓名、职位。这些信息后续可用于社会工程学或密码喷洒攻击。如 site:linkedin.com "example.com" 在 LinkedIn 上搜索目标公司员工。
子域名枚举是被动侦察的核心环节。主域名(如 example.com)可能只暴露了 www 和 mail 服务,但 dev.example.com、staging.example.com、api.example.com 等子域名往往运行着测试环境或内部服务,安全配置通常弱于生产环境。
子域名信息的来源包括:DNS 记录、证书透明度日志(CT Log)、搜索引擎缓存、第三方 API(如 VirusTotal、SecurityTrails)。两种工具擅长从这些来源批量收集子域名:subfinder 和 amass。
subfinder 是 ProjectDiscovery 团队开发的子域名枚举工具,特点是速度快、依赖少、输出干净。最新版 v2.15.0(2026 年 8 月发布)新增了 ShodanCT 被动源和改进的 VirusTotal 分页。
-all 参数启用所有数据源(包括被动源和 API 源),结果更全面但速度稍慢。-silent 只输出子域名列表不显示 banner 信息,适合管道传递。
amass 是 OWASP 项目,功能比 subfinder 更丰富——除了被动枚举子域名,还支持主动 DNS 解析、DNS 区域传输尝试、证书透明度查询和可视化图谱。最新版 v5.1.1(2026 年 4 月)引入了新的资产数据库引擎和 REST API 服务器。
~/.config/subfinder/provider-config.yaml,填入各平台的免费 API Key 后,子域名发现量可提升 3-5 倍。免费 API 额度通常足够个人学习使用:VirusTotal 每月 500 次查询、SecurityTrails 每月 50 次、Shodan 每月 100 次。建议同时注册多个平台,轮换使用避免触限。| 对比项 | subfinder | amass |
| 设计定位 | 纯被动枚举,快 | 被动 + 主动,全面 |
| 扫描速度 | 秒级完成 | 分钟级(主动模式更慢) |
| DNS 爆破 | 不支持 | 支持(-brute) |
| 可视化 | 不支持 | 支持(viz 模块) |
| 隐蔽性 | 高(完全不接触目标) | 被动模式高,主动模式低 |
| 最佳场景 | 快速初筛子域名范围 | 深度枚举 + DNS 侦察 |
实战中通常先用 subfinder 快速获取子域名列表,再用 amass 主动模式补充。两者结果合并去重后,用 httpx 或 dnsx 验证哪些子域名实际可解析和存活。
theHarvester 是一款 OSINT(开源情报)收集工具,专门从公开渠道收集目标的邮箱地址、子域名、虚拟主机和员工信息。最新版 4.11.1(2026 年 6 月)新增了 Sherlockeye 源模块并升级了运行时依赖。MITRE ATT&CK 将其映射为 T1589 Gather Victim Identity Information。
Kali Linux 默认包含 theHarvester,也可以通过 pip 安装:
-d 指定目标域名,-b 指定数据源(搜索引擎、证书查询等),-f 输出 HTML 报告。使用 -b all 会调用所有数据源但速度较慢,建议初筛时用 google,bing,certspotter 三个主要源。
theHarvester 的输出分为四类信息:
邮箱地址——从搜索引擎索引的网页、PGP 密钥服务器、证书透明度日志中提取。这些邮箱可用于钓鱼攻击模拟或密码喷洒测试。
子域名——与 subfinder/amass 结果互补,来源侧重不同。
虚拟主机——通过反查 IP 获取同一服务器上托管的其他域名。
员工信息——从 LinkedIn 等职场社交平台提取姓名和职位,可用于社会工程学评估。
Spring2026!、Company@2026)逐个邮箱尝试登录邮件系统,这种攻击在未启用 MFA 的环境中成功率极高。二是钓鱼演练:根据收集到的员工姓名和职位,定制钓鱼邮件模板评估组织安全意识。两种测试都必须在授权范围内进行。将本章所有工具串联起来,构建一个完整的侦察工作流。场景设定:授权渗透测试中,目标是一家名为 example.com 的公司,已知其公网 IP 段为 203.0.113.0/24。
以下脚本整合了 masscan、nmap、subfinder、theHarvester 四个工具,按"被动侦察 → 主动扫描"的顺序执行:
脚本按时间线组织:阶段 1(第 10-19 行)先执行被动侦察,subfinder 和 amass 并行收集子域名,theHarvester 收集邮箱和员工信息——此阶段目标完全无感知。阶段 2(第 20-29 行)执行主动扫描,masscan 全端口扫描后发现开放端口,nmap 对这些端口执行版本探测和脚本扫描。
本篇涉及的工具和技术在 MITRE ATT&CK 框架中的映射:
| 技术编号 | 技术名称 | 对应工具 |
| T1595.001 | Scanning IP Blocks(扫描 IP 段) | masscan |
| T1592 | Gather Victim Host Information | masscan + nmap |
| T1589 | Gather Victim Identity Information | theHarvester |
| T1596 | Search Open Technical Databases | subfinder, amass, Google Dorking |
site:example.com filetype:pdf,记录找到的 PDF 文档数量。-p- 扫描的耗时差异。--shard 参数,在两台机器上分布式扫描同一 /16 网段,对比单机和分布式扫描的耗时。注意:仅在授权网段内操作。本篇覆盖了高速扫描和被动侦察。下一篇进入主动信息收集的另一个维度——指纹识别与目录爆破。whatweb 和 wappalyzer 用于识别 Web 应用的技术栈(CMS、框架、服务器);gobuster 和 ffuf 用于发现隐藏的目录和文件。这些工具组合使用,能在不触发告警的前提下,从公开可访问的 Web 界面中提取大量攻击面信息。