介绍
在本实验中,你将学习如何使用 Masscan 这一高性能 TCP 端口扫描器来进行高效的网络侦察。你将通过从源代码安装 Masscan、配置扫描参数、在私有网络范围内执行扫描以及分析结果来获得实践经验。
完成本实验后,你将能够熟练地定义目标、运行高速扫描、解读输出以识别开放端口,并将你的发现导出为常用格式,以便进行报告和进一步分析。
从源码安装 Masscan
在第一步中,你将编译并安装 Masscan。Masscan 是一款速度极快的端口扫描器,能够在几分钟内扫描整个互联网。我们将从源代码安装它,以确保使用的是最新版本。实验环境中已经预装了必要的构建工具和库。
首先,确保你处于 ~/project 目录中,这是本实验指定的工工作区。
cd ~/project
接下来,使用 git 从官方 GitHub 仓库下载 Masscan 源代码。
git clone https://github.com/robertdavidgraham/masscan --depth 1
此命令会创建一个名为 masscan 的新目录,其中包含源代码。进入该目录。
cd masscan
现在,使用 make 命令编译源代码。该命令会读取目录中的 Makefile 并构建可执行二进制文件。
make
编译完成后,你可以在 bin 目录中找到 masscan 可执行文件。你可以通过查看版本号来验证构建是否成功。
./bin/masscan --version
你应该会看到类似如下的输出:
Masscan version 1.3.9-integration ( https://github.com/robertdavidgraham/masscan )
Compiled on: Aug 29 2025 11:15:09
Compiler: gcc 11.4.0
OS: Linux
CPU: x86 (64 bits)
GIT version: unknown
最后,为了让 masscan 命令在系统范围内可用,将其安装到标准位置(如 /usr/local/bin)。提供的 Makefile 包含一个 install 目标,可以为你处理此操作。
sudo make install
此命令将 masscan 二进制文件复制到系统的 PATH 路径下的 /usr/local/bin/ 中。现在你可以在任何目录下运行 Masscan。
验证安装:
masscan --version
如果你看到了版本号,说明 Masscan 已正确安装。
定义目标范围
在运行扫描之前,你必须定义想要针对的 IP 地址。在本实验演示中,我们将专注于私有 IP 地址范围的一个小子集,以确保快速执行。出于学习目的,扫描这些有限的内部范围是一种安全且高效的做法。
我们将创建一个文件来列出我们的目标范围。首先,确保你位于主项目目录中。
cd ~/project
现在,使用 nano 文本编辑器创建一个名为 targets.txt 的文件。
nano targets.txt
在 nano 编辑器中,添加以下用于演示的小型 IP 范围,每行一个。这些范围使用 CIDR(无类别域间路由)表示法编写,这是一种表示 IP 地址块的紧凑方式。
192.168.1.0/24
172.17.0.0/24
10.0.0.0/24
要在 nano 中保存文件,请按 Ctrl+O,然后按 Enter 确认文件名。要退出 nano,请按 Ctrl+X。
保存文件后,你可以使用 cat 命令验证其内容。
cat targets.txt
输出应显示你刚刚输入的三个小型 CIDR 范围。
192.168.1.0/24
172.17.0.0/24
10.0.0.0/24
该文件现在将作为 Masscan 的输入,告诉它在下一步中扫描哪些网络。这些较小的范围(每个仅包含 256 个 IP 地址)将使扫描完成得更快,通常在不到一分钟内即可完成。
运行高速端口扫描
安装好 Masscan 并定义好目标后,你就可以执行端口扫描了。在这一步中,你将使用我们定义的较小 IP 范围对常用端口进行演示扫描,以确保扫描能快速完成以便学习。
确保你处于 targets.txt 文件所在的 ~/project 目录中。
cd ~/project
现在,执行以下 masscan 命令。此命令需要 sudo 权限,因为 Masscan 使用原始套接字(raw sockets)发送数据包,这需要提升权限。
sudo masscan -p22,80,443,8080 -iL targets.txt --rate 1000 -oG scan_results.gnmap
让我们分解一下该命令的选项:
-p22,80,443,8080:指定要扫描的常用端口(SSH、HTTP、HTTPS 和备用 HTTP)。这种聚焦的方法可以确保更快完成。-iL targets.txt:告诉 Masscan 从targets.txt文件中读取目标 IP 范围。--rate 1000:将数据包传输速率设置为每秒 1000 个数据包。对于实验环境来说,这是一个安全的速率。-oG scan_results.gnmap:将输出以「grepable」(可使用 grep 搜索)格式保存到名为scan_results.gnmap的文件中。这种格式易于使用命令行工具进行解析。
在扫描运行时,Masscan 会显示其进度。由于我们的目标范围较小,扫描应在不到一分钟内完成。
Starting masscan 1.3.9-integration (http://bit.ly/14GZzcT) at 2025-08-29 03:20:16 GMT
Initiating SYN Stealth Scan
Scanning 768 hosts [4 ports/host]
扫描完成后,你的目录中会出现一个名为 scan_results.gnmap 的新文件。你可以使用 cat 命令查看其内容。
cat scan_results.gnmap
输出将列出发现的所有开放端口的主机。由于我们是在容器环境中扫描小型私有范围,你可能会在 Docker 桥接网络上发现一些开放端口。任何发现的开放端口都将以类似如下的格式显示:
## Masscan 1.3.9-integration scan initiated Fri Aug 29 03:20:16 2025
## Ports scanned: TCP(4;22-22,80-80,443-443,8080-8080) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Timestamp: 1756437619 Host: 172.17.0.1 () Ports: 22/open/tcp//ssh//
## Masscan done at Fri Aug 29 03:20:31 2025
扫描结果显示,我们扫描了 4 个特定端口(22、80、443、8080)上的 768 台主机,并在约 15 秒内完成了扫描。在此示例中,Masscan 在 172.17.0.1 的 Docker 桥接网关上发现了一个开放端口 —— SSH(端口 22)。这展示了 Masscan 快速发现网络范围内开放服务的能力。
关于输出格式的关键点:
- 时间戳(Timestamp)显示了每次发现的时间。
- 格式
Host: IP () Ports: port/status/protocol//service//提供了清晰的服务识别。 - Masscan 在 Docker 桥接上发现了正在运行的 SSH 服务,这是容器化环境中的典型发现。
查看开放端口
运行扫描后,下一步是分析结果以识别开放端口。scan_results.gnmap 文件包含了所有信息,但可以使用其他工具进行处理,以提取最相关的数据。
首先,确保你处于 ~/project 目录中。
cd ~/project
.gnmap 格式旨在易于解析。要快速找到与开放端口对应的所有行,你可以使用 grep 命令。
grep "open" scan_results.gnmap
此命令会过滤文件并仅显示包含单词「open」的行。输出将如下所示,列出每个主机及其开放端口。
Timestamp: 1756437619 Host: 172.17.0.1 () Ports: 22/open/tcp//ssh//
为了快速汇总扫描网络中最常开放的端口,你可以创建一个命令管道。以下命令仅提取端口号,对其进行排序,然后统计唯一出现的次数。
grep -oP '\d+/open' scan_results.gnmap | sort | uniq -c
让我们分解一下这个强大的单行命令:
grep -oP '\d+/open':仅提取符合 Perl 兼容正则表达式(-P)的匹配部分(-o),该表达式查找数字后跟/open的内容。sort:按字母顺序对开放端口列表进行排序,将相同的端口组合在一起。uniq -c:合并相邻的相同行,并添加每行出现次数的计数(-c)。
示例输出可能如下所示,表明有一台主机开放了 22 端口(SSH)。
1 22/open
这种技术对于获取网络上暴露服务的宏观概览非常有用。在这种情况下,我们可以看到 SSH 是我们扫描中发现的唯一服务,这在网关提供 SSH 访问的 Docker 桥接网络中很常见。
导出扫描结果
为了进行报告或进一步处理,通常需要将扫描结果导出为更结构化的格式。在这一步中,你将把扫描结果转换为 CSV(逗号分隔值)文件,这种文件很容易导入到电子表格中。
确保你处于 ~/project 目录中。
cd ~/project
我们将结合使用 grep 和 sed 来解析 .gnmap 文件并创建一个干净的 CSV 文件。sed 是一个强大的流编辑器,可以使用正则表达式提取和重新格式化数据。
执行以下命令创建 scan_results.csv。
grep "open" scan_results.gnmap | sed 's/.*Host: \([^ ]*\) .*Ports: \([0-9]*\)\/open\/\([^/]*\).*/\1,\2,\3/' > scan_results.csv
以下是该命令的工作原理:
grep "open" scan_results.gnmap:首先,过滤出带有开放端口的行。sed 's/.*Host: \([^ ]*\) .*Ports: \([0-9]*\)\/open\/\([^/]*\).*/\1,\2,\3/':使用正则表达式从 Masscan 输出格式中提取 IP 地址、端口号和协议,并将它们格式化为 CSV。> scan_results.csv:将最终输出重定向到名为scan_results.csv的新文件中。
你现在可以查看新创建的 CSV 文件。
cat scan_results.csv
输出将是一个干净的、以逗号分隔的主机及其开放端口列表。
172.17.0.1,22,tcp
这种结构化格式非常适合与团队成员共享、导入数据库或用作其他安全工具的输入。CSV 格式以易于阅读的格式显示了 IP 地址、端口号和协议。
总结
在本实验中,你成功学习了使用 Masscan 进行高速网络扫描的基础知识。你练习了整个工作流程,从通过源代码安装工具到分析和导出结果。
你获得了以下方面的实践经验:
- 在 Linux 上从源码编译和安装软件。
- 使用 CIDR 表示法定义扫描目标。
- 使用特定的端口、速率和输出格式参数执行端口扫描。
- 使用
grep、sort和uniq等命令行工具分析扫描结果。 - 将数据导出为结构化的 CSV 格式以便生成报告。
这些技能为以快速、高效且负责任的方式执行网络侦察奠定了坚实的基础。



