📚 网络安全 Kali 学习系列
模块 0-1 Linux 系统深度 ✅ 已完成
01-06 Kali 安装 → 文件权限 → 进程管理 → 网络配置 → Shell 脚本 → 包管理
模块 0-2 计算机网络 ✅ 已完成
07-10 OSI 模型 → TCP/UDP → ARP/DNS → HTTP/HTTPS
模块 0-3 密码学基础 ✅ 已完成
11-13 对称/非对称加密 → 哈希算法 → 数字证书
模块 0-4 编程基础 ✅ 已完成
14-17 Python → Bash → PHP → JavaScript
模块 0-5 Docker/容器基础 ✅ 已完成
18 Docker 与容器安全
模块 1 信息收集与侦察(攻击技术阶段)
19 nmap 主动扫描与信息收集 ✓
20 masscan 高速扫描与被动侦察(当前篇)
21 指纹识别与目录爆破(下一篇)
阶段二至四共 XX 篇,后续持续更新
masscan 高速扫描与被动侦察
从全端口扫描到信息收集
中级 masscan 1.3.2 subfinder v2.15.0 amass v5.1.1 theHarvester 4.11.1

如果把 nmap 比作手持雷达,逐栋楼敲门确认住户信息,那 masscan 就是一架侦察无人机——它不等待回应,以每秒数万包的速度飞掠整个城市,六分钟内就能绘制出整座城市每一扇窗户的开闭状态。这种"拍完即走"的扫描哲学,让它在全端口扫描场景下无可替代。但侦察不止于扫描:搜索引擎、DNS 记录、证书透明度日志中藏着大量目标从未主动公开的信息。本篇将覆盖 masscan 高速扫描和被动侦察两大领域,读完你将能运用 masscan 在分钟级完成 /16 网段全端口扫描,用 Google Dorking 从公开渠道提取目标敏感信息,用 subfinder 和 amass 枚举隐藏子域名,用 theHarvester 收集邮箱和员工信息。

目录
一、从 nmap 到 masscan:高速扫描的需求与原理
二、masscan 安装与核心参数
三、masscan 实战操作
四、masscan + nmap 联合工作流
五、Google Dorking:搜索引擎作为侦察武器
六、子域名枚举:subfinder 与 amass 实战
七、theHarvester:邮箱与域名信息收集
八、实战演练:从扫描到信息收集的完整流程
一、从 nmap 到 masscan:高速扫描的需求与原理

上一篇详细介绍了 nmap 的主机发现、端口扫描、版本探测和 NSE 脚本。nmap 功能全面,但在一个场景下力不从心:大规模全端口扫描。对一个 /24 网段执行 nmap -p- -sS(65535 个端口 × 256 台主机),即便使用 T4 时序模板,也需要 30 分钟以上。如果目标是 /16 网段(65536 台主机),扫描时间会膨胀到数天。

这就是 masscan 诞生的原因。Robert Graham 在 2013 年开发了这款工具,核心设计目标只有一个字:快。

1.1 nmap 的瓶颈在哪里

nmap 默认的 SYN 扫描是"有状态"的:它发送一个 SYN 包后,会在内核中维护连接状态表,等待目标的 SYN-ACK 回应。如果收到回应,再发送 RST 包关闭连接;如果超时未收到,则重传。这种机制保证了可靠性,但也带来了性能瓶颈——内核连接跟踪表有大小限制,大量并发连接会耗尽表项。

此外,nmap 对每个端口的探测包含超时等待和重传逻辑。默认重传 0 次(--max-retries 0 可加速但降低可靠性)。在高速网络中,丢包率上升会导致大量误判。

1.2 masscan 的设计哲学:无状态 SYN

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 个端口。

1.3 nmap vs masscan:何时用哪个
对比项 nmap masscan
扫描模式 有状态 SYN,维护连接表 无状态 SYN,发完即忘
最大速率 每秒数百到数千包 每秒可达 1000 万包
版本探测 强大(-sV,服务指纹库) 有限(--banners,仅抓取 Banner)
OS 识别 支持(-O,TCP/IP 指纹) 不支持
NSE 脚本 600+ 脚本(漏洞检测等) 不支持
全端口 /16 扫描 数天 数分钟
可靠性 高(重传 + 超时调整) 中(高速时丢包影响准确率)
最佳场景 小范围深度扫描 大范围快速端口发现
💡 小贴士
masscan 的"无状态"设计有个副作用:由于不维护连接状态,操作系统的 TCP 协议栈会看到大量"未请求的"SYN-ACK 回包,默认会回复 RST 包。这些 RST 可能干扰 masscan 的抓包引擎。解决方法是配置防火墙规则静默丢弃这些回包:iptables -A INPUT -p tcp --tcp-flags SYN,RST RST -j DROP。这也是为什么 masscan 通常需要 root 权限——它要直接操作原始套接字。
1.4 实际使用场景

在实际渗透测试中,masscan 和 nmap 不是竞争关系,而是搭档关系。典型工作流分两步:

第一步:masscan 快速发现——对目标网段执行全端口扫描,以高速发现所有开放端口,生成开放端口列表。

第二步:nmap 深度扫描——将 masscan 发现的端口列表传递给 nmap,执行 -sV -sC 进行版本探测和脚本扫描。因为只需要扫描少量已确认开放的端口,nmap 速度会大幅提升。

二、masscan 安装与核心参数
2.1 安装方式

Kali Linux 默认仓库包含 masscan,可直接通过 apt 安装:

Shell
1
2
3
4
5
6
# 方式一:apt 安装(稳定版)
sudo apt update && sudo apt install masscan -y
 
# 方式二:源码编译(获取最新修复)
git clone https://github.com/robertdavidgraham/masscan.git
cd masscan && make && sudo make install

masscan 最新 tagged 发布版是 1.3.2(2021 年 1 月),但项目的 master 分支持续活跃维护至 2026 年 4 月(修复了 SMB 模块的段错误等问题)。如果遇到 apt 版本的 bug,建议从源码编译获取最新修复。编译依赖仅有 libpcap-dev 和 gcc,非常轻量。

2.2 基本语法

masscan 的命令格式简洁直观:

Shell
sudo masscan -p 80,443 --rate=1000 192.168.1.0/24

这条命令扫描 192.168.1.0/24 网段的 80 和 443 端口,速率限制在每秒 1000 包。sudo 是必须的——masscan 需要创建原始套接字来绕过系统 TCP 协议栈。

2.3 核心参数详解
参数 说明 示例
-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 能力,无法直接操作数据链路层。
2.4 配置文件

masscan 支持通过配置文件批量设置参数,适合需要重复执行相同扫描任务的场景。配置文件格式为 key = value 形式:

masscan.conf
1
2
3
4
5
6
7
8
9
10
11
12
# masscan 配置文件示例
rate = 10000
ports = 21,22,80,443,3306,6379,8080,9200
range = 192.168.1.0/24
wait = 5
retries = 1
output-format = json
output-filename = scan_result.json
banners = true
exclude = 192.168.1.1,192.168.1.254
 
# 使用方式:sudo masscan -c masscan.conf

配置文件中 exclude 参数很实用——扫描内网时排除网关和核心设备,避免触发告警或影响业务。

三、masscan 实战操作
3.1 基础端口扫描

以下操作在本地靶机环境(192.168.1.0/24)执行。先从最简单的单端口扫描开始:

Shell
1
2
3
4
5
6
7
8
9
10
11
sudo masscan -p 80 192.168.1.0/24 --rate=1000
# 输出示例:
# Starting masscan 1.3.2 (https://github.com/robertdavidgraham/masscan)
# Scanning 256 hosts [1 port/host]
Discovered open port 80/tcp on 192.168.1.100
Discovered open port 80/tcp on 192.168.1.150
# rate:  0.00-kpps, 0.00% done
# --------------------------------------------------
# 0 seconds total (0 seconds actual)
# 1 hosts responded, in 0 seconds

扫描结果以 Discovered open port 格式直接输出到终端。256 台主机的单端口扫描在 1000 pps 速率下不到 1 秒完成。

3.2 全端口扫描

masscan 最核心的使用场景——对目标执行 1-65535 全端口扫描:

Shell
1
2
3
4
5
6
7
8
9
# 单主机全端口扫描
sudo masscan -p 1-65535 192.168.1.100 --rate=10000
 
# 全端口扫描+输出JSON+等待5秒收集回应
sudo masscan -p 1-65535 192.168.1.100 \
  --rate=10000 --wait=5 -oJ full_scan.json
 
# /24网段全端口扫描(约7秒完成)
sudo masscan -p 1-65535 192.168.1.0/24 --rate=100000 -oJ net_scan.json
# 256主机 × 65535端口 = 16776960包,100kpps约168秒
💡 小贴士
--wait 参数很容易被忽略但至关重要。masscan 发包速度极快,发完所有包可能只需要几秒,但最后发送的 SYN 包的 SYN-ACK 回应还在网络中传输。--wait=5 让 masscan 在发包结束后再等 5 秒收集迟到的回应。不加此参数会导致远端主机的开放端口被遗漏——尤其是高延迟网络中,丢包率可能高达 30% 以上。
3.3 速率控制:从谨慎到激进

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。
3.4 输出格式与结果解析

masscan 支持三种输出格式,各有用途:

Shell
1
2
3
4
5
6
7
8
9
# JSON格式(推荐,结构化,便于程序解析)
sudo masscan -p 1-65535 10.0.0.5 --rate=10000 -oJ result.json
 
# grepable格式(与nmap兼容,可用grep过滤)
sudo masscan -p 1-65535 10.0.0.5 --rate=10000 -oG result.gnmap
 
# XML格式(可导入其他工具如nautilus)
sudo masscan -p 1-65535 10.0.0.5 --rate=10000 -oX result.xml
 
# 查看JSON输出
cat result.json | python3 -m json.tool | head -20

JSON 输出格式如下,每条记录包含 IP、端口、协议、时间戳和 Banner(如果启用):

JSON
1
2
3
4
5
6
7
8
[
  {
    "ip": "192.168.1.100",
    "timestamp": "1724035200",
    "ports": [
      {"port": 80, "proto": "tcp", "status": "open"}
    ]
  }
]

grepable 格式与 nmap 的 -oG 兼容,可用 grep "open" result.gnmap 快速过滤开放端口,方便在脚本中串联使用。

3.5 Banner 抓取

masscan 的 --banners 参数可以在发现开放端口后尝试建立完整 TCP 连接并抓取服务 Banner。这不能替代 nmap 的版本探测(-sV),但能快速获取服务信息:

Shell
1
2
3
4
5
6
7
8
sudo masscan -p 21,22,80,443,3306 10.0.0.0/24 \
  --rate=5000 --banners -oJ banners.json
 
# Banner输出示例:
# FTP:    "220 (vsFTPd 3.0.5)"
# SSH:    "SSH-2.0-OpenSSH_9.6p1 Debian-4"
# MySQL:  "5.7.44-log"
# HTTP:   需要主动发HTTP请求,masscan不主动获取

注意 --banners 会降低扫描速度(每个开放端口都需要完成 TCP 三次握手并等待 Banner 数据),且 HTTP 服务通常不会主动发送 Banner,需要客户端先发送请求。对于 Web 服务指纹识别,建议后续用 nmap 的 -sV 或 whatweb 工具。

四、masscan + nmap 联合工作流

现在把前一篇的 nmap 和本篇的 masscan 串起来,构建一个实战渗透测试中常用的"两阶段扫描"工作流。

4.1 工作流原理

核心思路:让 masscan 做它最擅长的事——高速发现开放端口,让 nmap 做它最擅长的事——版本探测和脚本扫描。

数据流:masscan 扫描 → 提取开放端口列表 → 传递给 nmap -p 参数 → nmap 对已知开放端口执行深度扫描。由于 nmap 只需扫描确认开放的少量端口(而非 65535 个全端口),速度提升可达数十倍。

4.2 实战脚本

以下 Bash 脚本实现完整的两阶段扫描工作流:

recon.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
# 两阶段扫描:masscan快速发现 → nmap深度扫描
# 用法:sudo bash recon.sh <target_ip_or_cidr>
TARGET=${1:-"192.168.1.0/24"}
echo "[*]阶段1:masscan全端口快速扫描..."
sudo masscan -p 1-65535 $TARGET \
  --rate=10000 --wait=10 -oG masscan_raw.gnmap
 
# 从grepable输出中提取开放端口
PORTS=$(grep "Ports:" masscan_raw.gnmap | \
  grep -oE '[0-9]+/open' | \
  cut -d'/' -f1 | sort -n | uniq | \
  paste -sd ',' )
 
echo "[*]发现开放端口: $PORTS"
 
if [ -n "$PORTS" ]; then
  echo "[*]阶段2:nmap深度扫描开放端口..."
  sudo nmap -sV -sC -p $PORTS $TARGET \
    -oN nmap_detail.txt -oX nmap_detail.xml
  echo "[+]扫描完成,结果已保存"
else
  echo "[-]未发现开放端口"
fi

脚本逻辑解析:

第 6-7 行:masscan 全端口扫描,速率 10000 pps,等待 10 秒收集回应,输出为 grepable 格式。

第 10-14 行:管道链解析 grepable 输出——grep 提取含 "Ports:" 的行,正则匹配 "数字/open",cut 取端口号部分,sort + uniq 去重排序,paste 合并为逗号分隔字符串。

第 20-21 行:nmap 对开放端口执行 -sV(版本探测)和 -sC(默认脚本扫描),输出为文本和 XML 双格式。

💡 小贴士
masscan 的 grepable 输出格式和 nmap 略有差异。nmap 的 -oG 输出中每行一个主机,端口状态格式为 80/open/tcp//http///;而 masscan 的 grepable 格式为 80/open/tcp。上述脚本中用 [0-9]+/open 正则兼容了两种格式,所以也可以直接处理 nmap 的 grepable 输出。
4.3 用 Python 提取端口列表

如果使用 JSON 输出,可以用 Python 更精确地解析:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python3
# parse_masscan.py - 从masscan JSON输出提取开放端口
import json, sys
 
def extract_open_ports(json_file):
    with open(json_file) as f:
        results = json.load(f)
    ports = set()
    for entry in results:
        for p in entry.get('ports', []):
            if p.get('status') == 'open':
                ports.add(p['port'])
    return sorted(ports)
 
if __name__ == '__main__':
    ports = extract_open_ports(sys.argv[1])
    print(','.join(str(p) for p in ports))

使用方式:python3 parse_masscan.py result.json 输出逗号分隔的端口列表,可直接用于 nmap 的 -p 参数。

五、Google Dorking:搜索引擎作为侦察武器

主动扫描会向目标发送数据包,可能被 IDS/IPS 检测到。而被动侦察不直接接触目标系统——信息来源是搜索引擎、DNS 记录、证书透明度日志等公开渠道。目标完全无感知。

Google Dorking(也称 Google Hacking)是利用搜索引擎的高级搜索语法,从公开索引的网页中提取目标敏感信息的技术。MITRE ATT&CK 框架将其映射为 T1593 Search Open Websites/Domains。

5.1 Google 搜索操作符

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
5.2 安全相关 Dork 语法

以下是渗透测试中常用的 Google Dork 组合,用于发现目标暴露的敏感信息:

Google Dorking
1
2
3
4
5
6
7
8
9
10
11
12
# 查找目标域名的PDF文档(可能含敏感信息)
site:example.com filetype:pdf
 
# 查找暴露的管理后台
site:example.com inurl:admin OR inurl:login
 
# 查找目录列表暴露
site:example.com intitle:"index of" "parent directory"
 
# 查找配置文件泄露
site:example.com ext:env OR ext:yml OR ext:conf intext:"password"
 
# 查找SQL备份文件
site:example.com ext:sql OR ext:dump OR ext:bak
💡 小贴士
Google Dorking 在 5-10 分钟内连续执行大量复杂查询后,Google 会弹出验证码(reCAPTCHA)甚至临时封禁 IP。这不是 bug 而是反爬虫机制。缓解方法:每执行 3-5 个查询后间隔 30 秒;使用 site:target.com 限定范围后查询量会自然降低;也可以交替使用 Bing、DuckDuckGo 等不同搜索引擎分担查询负载。Google Hacking Database(GHDB)是 Exploit-DB 维护的 Dork 集合,可搜索关键词"GHDB"找到分类整理的 Dork 列表。
5.3 从搜索引擎到信息收集

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 上搜索目标公司员工。

六、子域名枚举:subfinder 与 amass 实战

子域名枚举是被动侦察的核心环节。主域名(如 example.com)可能只暴露了 www 和 mail 服务,但 dev.example.com、staging.example.com、api.example.com 等子域名往往运行着测试环境或内部服务,安全配置通常弱于生产环境。

子域名信息的来源包括:DNS 记录、证书透明度日志(CT Log)、搜索引擎缓存、第三方 API(如 VirusTotal、SecurityTrails)。两种工具擅长从这些来源批量收集子域名:subfinder 和 amass。

6.1 subfinder:轻量快速型

subfinder 是 ProjectDiscovery 团队开发的子域名枚举工具,特点是速度快、依赖少、输出干净。最新版 v2.15.0(2026 年 8 月发布)新增了 ShodanCT 被动源和改进的 VirusTotal 分页。

Shell
1
2
3
4
5
6
7
8
9
10
11
# 安装(Go方式,获取最新版)
go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
 
# 或下载预编译二进制
wget https://github.com/projectdiscovery/subfinder/releases/download/v2.15.0/subfinder_2.15.0_linux_amd64.zip
unzip subfinder_2.15.0_linux_amd64.zip
sudo mv subfinder /usr/local/bin/
 
# 基本使用
subfinder -d example.com -o subdomains.txt
# -d指定域名,-o输出到文件
subfinder -d example.com -silent -all -o subs_all.txt

-all 参数启用所有数据源(包括被动源和 API 源),结果更全面但速度稍慢。-silent 只输出子域名列表不显示 banner 信息,适合管道传递。

6.2 amass:深度全面型

amass 是 OWASP 项目,功能比 subfinder 更丰富——除了被动枚举子域名,还支持主动 DNS 解析、DNS 区域传输尝试、证书透明度查询和可视化图谱。最新版 v5.1.1(2026 年 4 月)引入了新的资产数据库引擎和 REST API 服务器。

Shell
1
2
3
4
5
6
7
8
9
10
11
12
# Kali自带amass,也可手动安装
sudo apt install amass -y
 
# 被动枚举(不接触目标DNS服务器)
amass enum -passive -d example.com -o amass_passive.txt
 
# 主动枚举(直接查询目标DNS,尝试区域传输)
amass enum -active -d example.com -brute -w /usr/share/wordlists/dirb/common.txt -o amass_active.txt
 
# 查看枚举结果统计
amass db -list -d example.com
 
# 生成可视化图谱(需Graphviz)
amass viz -d3 -o network.html -i amass_results.txt
💡 小贴士
subfinder 和 amass 都支持配置第三方 API 密钥来扩展数据源(VirusTotal、SecurityTrails、Shodan 等)。以 subfinder 为例,配置文件位于 ~/.config/subfinder/provider-config.yaml,填入各平台的免费 API Key 后,子域名发现量可提升 3-5 倍。免费 API 额度通常足够个人学习使用:VirusTotal 每月 500 次查询、SecurityTrails 每月 50 次、Shodan 每月 100 次。建议同时注册多个平台,轮换使用避免触限。
6.3 subfinder vs amass 对比
对比项 subfinder amass
设计定位 纯被动枚举,快 被动 + 主动,全面
扫描速度 秒级完成 分钟级(主动模式更慢)
DNS 爆破 不支持 支持(-brute)
可视化 不支持 支持(viz 模块)
隐蔽性 高(完全不接触目标) 被动模式高,主动模式低
最佳场景 快速初筛子域名范围 深度枚举 + DNS 侦察

实战中通常先用 subfinder 快速获取子域名列表,再用 amass 主动模式补充。两者结果合并去重后,用 httpx 或 dnsx 验证哪些子域名实际可解析和存活。

七、theHarvester:邮箱与域名信息收集

theHarvester 是一款 OSINT(开源情报)收集工具,专门从公开渠道收集目标的邮箱地址、子域名、虚拟主机和员工信息。最新版 4.11.1(2026 年 6 月)新增了 Sherlockeye 源模块并升级了运行时依赖。MITRE ATT&CK 将其映射为 T1589 Gather Victim Identity Information。

7.1 安装与基本使用

Kali Linux 默认包含 theHarvester,也可以通过 pip 安装:

Shell
1
2
3
4
5
6
7
8
9
10
11
# Kali自带,直接运行
theHarvester -h
 
# 从pip安装最新版
pip3 install theHarvester
 
# 收集example.com的邮箱和子域名
theHarvester -d example.com -b google,bing,certspotter -f result.html
 
# 使用所有数据源
theHarvester -d example.com -b all -f result_all.html
 
# 查看可用数据源列表
theHarvester -s

-d 指定目标域名,-b 指定数据源(搜索引擎、证书查询等),-f 输出 HTML 报告。使用 -b all 会调用所有数据源但速度较慢,建议初筛时用 google,bing,certspotter 三个主要源。

7.2 收集结果分析

theHarvester 的输出分为四类信息:

邮箱地址——从搜索引擎索引的网页、PGP 密钥服务器、证书透明度日志中提取。这些邮箱可用于钓鱼攻击模拟或密码喷洒测试。

子域名——与 subfinder/amass 结果互补,来源侧重不同。

虚拟主机——通过反查 IP 获取同一服务器上托管的其他域名。

员工信息——从 LinkedIn 等职场社交平台提取姓名和职位,可用于社会工程学评估。

💡 小贴士
theHarvester 收集的邮箱地址可以进一步用于两个方向的测试。一是密码喷洒(Password Spraying):用常见弱密码(如 Spring2026!、Company@2026)逐个邮箱尝试登录邮件系统,这种攻击在未启用 MFA 的环境中成功率极高。二是钓鱼演练:根据收集到的员工姓名和职位,定制钓鱼邮件模板评估组织安全意识。两种测试都必须在授权范围内进行。
八、实战演练:从扫描到信息收集的完整流程

将本章所有工具串联起来,构建一个完整的侦察工作流。场景设定:授权渗透测试中,目标是一家名为 example.com 的公司,已知其公网 IP 段为 203.0.113.0/24。

8.1 综合侦察脚本

以下脚本整合了 masscan、nmap、subfinder、theHarvester 四个工具,按"被动侦察 → 主动扫描"的顺序执行:

recon_workflow.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
# 完整侦察工作流:被动侦察→主动扫描
# 用法:sudo bash recon_workflow.sh <domain> <ip_range>
DOMAIN=${1:-"example.com"}
IP_RANGE=${2:-"192.168.1.0/24"}
WORKDIR="recon_$(date +%Y%m%d_%H%M%S)"
mkdir -p $WORKDIR && cd $WORKDIR
echo "[*]工作目录: $(pwd)"
echo "[*]=== 阶段1:被动侦察 ==="
# 1.1 子域名枚举
subfinder -d $DOMAIN -silent -all -o subfinder.txt
amass enum -passive -d $DOMAIN -o amass.txt 2>/dev/null
cat subfinder.txt amass.txt | sort -u > all_subdomains.txt
echo "[*]子域名数: $(wc -l < all_subdomains.txt)"
# 1.2 邮箱与员工信息
theHarvester -d $DOMAIN -b google,bing,certspotter -f harvester.html
echo "[*]=== 阶段2:主动扫描 ==="
# 2.1 masscan全端口快速扫描
sudo masscan -p 1-65535 $IP_RANGE \
  --rate=10000 --wait=10 -oG masscan.gnmap
# 2.2 提取开放端口
PORTS=$(grep "Ports:" masscan.gnmap | grep -oE '[0-9]+/open' | cut -d'/' -f1 | sort -n | uniq | paste -sd ',')
# 2.3 nmap深度扫描
if [ -n "$PORTS" ]; then
  sudo nmap -sV -sC -p $PORTS $IP_RANGE -oN nmap_detail.txt
fi
echo "[+]侦察完成,结果保存在 $(pwd)"

脚本按时间线组织:阶段 1(第 10-19 行)先执行被动侦察,subfinder 和 amass 并行收集子域名,theHarvester 收集邮箱和员工信息——此阶段目标完全无感知。阶段 2(第 20-29 行)执行主动扫描,masscan 全端口扫描后发现开放端口,nmap 对这些端口执行版本探测和脚本扫描。

8.2 ATT&CK 框架映射

本篇涉及的工具和技术在 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
分级练习
基础级(理解概念)
1. 用 masscan 扫描本地靶机 192.168.1.100 的 80 和 443 端口,速率设为 1000 pps,结果输出为 JSON 格式。
2. 用 subfinder 对 example.com 执行被动子域名枚举,记录发现的子域名数量。
3. 用 Google Dorking 搜索 site:example.com filetype:pdf,记录找到的 PDF 文档数量。
进阶级(实战操作)
1. 编写 masscan + nmap 两阶段扫描脚本,对 192.168.1.0/24 网段执行全端口扫描。记录 masscan 耗时和 nmap 耗时,对比直接用 nmap -p- 扫描的耗时差异。
2. 分别用 subfinder 和 amass 对同一域名执行枚举,合并结果去重后统计:两个工具各独占多少子域名?重叠率是多少?
3. 用 theHarvester 对一个授权域名收集邮箱,分析邮箱命名规律(如 firstname.lastname@domain vs flastname@domain),推断公司的邮箱命名规则。
挑战级(综合应用)
1. 完善 8.1 的综合侦察脚本,添加以下功能:用 dnsx 验证子域名存活状态;用 httpx 检测存活的 HTTP 服务;对存活的 Web 服务用 nmap NSE 脚本检测已知漏洞。输出一份结构化的侦察报告。
2. 研究 masscan 的 --shard 参数,在两台机器上分布式扫描同一 /16 网段,对比单机和分布式扫描的耗时。注意:仅在授权网段内操作。
知识回顾
masscan 无状态 SYN --rate 速率控制 masscan + nmap 两阶段 --wait 等待回应 --banners 抓取 grepable 输出格式 Google Dorking site:/filetype:/inurl: subfinder v2.15.0 amass v5.1.1 被动 vs 主动枚举 theHarvester 4.11.1 ATT&CK T1595/T1589/T1596
下一篇预告
21 指纹识别与目录爆破

本篇覆盖了高速扫描和被动侦察。下一篇进入主动信息收集的另一个维度——指纹识别与目录爆破。whatweb 和 wappalyzer 用于识别 Web 应用的技术栈(CMS、框架、服务器);gobuster 和 ffuf 用于发现隐藏的目录和文件。这些工具组合使用,能在不触发告警的前提下,从公开可访问的 Web 界面中提取大量攻击面信息。

网络安全 Kali 学习系列 · 第 20 篇
本系列持续更新,关注公众号获取最新文章