使用 Masscan 扫描端口

NmapBeginner
立即练习

介绍

在本实验中,你将学习如何使用 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

我们将结合使用 grepsed 来解析 .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 表示法定义扫描目标。
  • 使用特定的端口、速率和输出格式参数执行端口扫描。
  • 使用 grepsortuniq 等命令行工具分析扫描结果。
  • 将数据导出为结构化的 CSV 格式以便生成报告。

这些技能为以快速、高效且负责任的方式执行网络侦察奠定了坚实的基础。