使用 Masscan 进行端口扫描

NmapNmapBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本次实验中,你将学习如何使用 Masscan(一款高性能的 TCP 端口扫描器),在网络安全领域进行高效的网络侦察。你将练习从源代码安装 Masscan、配置扫描参数,并在私有网络范围内分析扫描结果。

这些练习将引导你完成目标定义、扫描执行和结果解读。通过完成本次实验,你将亲身体验 Masscan 的快速扫描能力,同时遵循道德扫描规范。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"]) nmap/NmapGroup -.-> nmap/common_ports("Common Ports Scanning") nmap/NmapGroup -.-> nmap/save_output("Save Output to File") nmap/NmapGroup -.-> nmap/port_scanning("Port Scanning Methods") nmap/NmapGroup -.-> nmap/target_specification("Target Specification") nmap/NmapGroup -.-> nmap/service_detection("Service Detection") subgraph Lab Skills nmap/common_ports -.-> lab-549946{{"使用 Masscan 进行端口扫描"}} nmap/save_output -.-> lab-549946{{"使用 Masscan 进行端口扫描"}} nmap/port_scanning -.-> lab-549946{{"使用 Masscan 进行端口扫描"}} nmap/target_specification -.-> lab-549946{{"使用 Masscan 进行端口扫描"}} nmap/service_detection -.-> lab-549946{{"使用 Masscan 进行端口扫描"}} end

安装 Masscan

在这一步中,你将在你的 LabEx 虚拟机环境中安装 Masscan(一款高性能的 TCP 端口扫描器)。Masscan 以其利用异步传输和自定义 TCP/IP 栈,能在几分钟内扫描整个互联网而闻名。与传统扫描器不同,Masscan 不依赖操作系统的网络栈,这使其能够实现惊人的扫描速度。

在继续操作之前,确保我们处于正确的工作目录。~/project 目录是我们组织所有与扫描相关文件的地方:

cd ~/project

Masscan 需要先安装几个依赖项。这些依赖项包括编译源代码所需的开发工具和库。以下命令将更新你的软件包列表并安装必要的组件:

sudo apt-get update && sudo apt-get install -y git make gcc libpcap-dev

现在,我们将从 Masscan 的官方 GitHub 仓库下载其源代码。克隆仓库可以让我们获取到最新版本的代码:

git clone https://github.com/robertdavidgraham/masscan

下载完成后,我们需要编译源代码以创建可执行程序。make 命令会读取目录中的 Makefile 并构建软件:

cd masscan && make

一旦编译成功完成,我们可以通过检查安装的版本来验证一切是否正常工作。这是确认安装成功的一个好习惯:

./bin/masscan --version

你应该会看到类似于以下的输出:

Masscan version 1.3.2

最后,为了能在任何目录都能轻松访问 Masscan,我们将其复制到 /usr/local/bin/,该目录通常包含在系统的 PATH 环境变量中:

sudo cp bin/masscan /usr/local/bin/

至此,安装过程完成。你现在可以在本次实验的后续步骤中使用 Masscan 进行高速端口扫描了。

定义目标范围

在这一步中,你将为端口扫描操作定义一个目标 IP 范围。理解目标范围是网络扫描的基础,它能告知扫描器要检查哪些网络地址。Masscan 需要特定的目标范围才能高效地进行扫描,因为它是为跨大型网络的高速操作而设计的。

出于学习目的,我们将使用 RFC 1918 中定义的私有 IP 范围。这些是安全的、不可路由的地址,通常用于本地网络,这样可以避免意外扫描到真实的互联网主机。我们将使用的三个主要私有范围如下:

  1. 10.0.0.0/8 —— 最大的私有地址块,常用于企业
  2. 172.16.0.0/12 —— 中型范围,常见于企业网络
  3. 192.168.0.0/16 —— 家庭和小型办公室网络最常用的范围

首先,让我们进入存储目标列表的工作目录:

cd ~/project

现在,我们将创建一个文本文件来存储目标范围。我们使用 nano 作为文本编辑器,因为它简单易用,并且在大多数 Linux 环境中都可用:

nano targets.txt

在编辑器中,添加这三个标准的私有范围(按 Ctrl+O 保存更改,然后按 Ctrl+X 退出 nano):

10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

CIDR 表示法(/8、/12、/16)指定了每个范围中的 IP 地址数量:

  • /8 表示前 8 位是固定的(10.x.x.x)
  • /12 表示前 12 位是固定的(172.16.x.x 到 172.31.x.x)
  • /16 表示前 16 位是固定的(192.168.x.x)

让我们通过显示文件内容来验证目标文件是否正确创建:

cat targets.txt

你应该会看到这三个 CIDR 范围与输入时完全一致。在接下来的步骤中,这个文件将作为 Masscan 的输入,告知它要扫描哪些网络。

执行高速端口扫描

在这一步中,你将使用 Masscan 针对上一步中定义的目标范围执行高速端口扫描。端口扫描是一种基本的网络侦察技术,有助于识别目标系统上可访问的服务。Masscan 独特的架构使其能够每秒扫描数千个端口,同时保持准确性,非常适合快速扫描大型网络。

首先,确保你位于目标文件所在的正确工作目录。这样可以确保 Masscan 能够访问你预定义的目标列表:

cd ~/project

现在,让我们开始实际的扫描。以下 Masscan 命令将扫描目标范围内最常见的端口(1 - 1000)。这些端口通常包括知名服务,如 Web 服务器(80、443)、电子邮件(25、110)和其他常用协议:

sudo masscan -p1-1000 -iL targets.txt --rate 1000 -oG scan_results.gnmap

让我们分解这个命令的每个部分,以了解其作用:

  • -p1-1000:指定要扫描的端口范围(端口 1 到 1000)
  • -iL targets.txt:从你预定义的列表文件中读取目标 IP 地址
  • --rate 1000:控制扫描速度(每秒 1000 个数据包,这在学习环境中是安全的)
  • -oG scan_results.gnmap:以可 grep 的格式保存结果,便于分析

扫描过程中,你将看到显示进度的实时输出。这有助于你监控扫描状态和估计完成时间:

Starting masscan 1.3.2 (http://bit.ly/14GZzcT) at 2023-01-01 00:00:00 GMT
Initiating SYN Stealth Scan
Scanning 3 hosts [1000 ports/host]

扫描完成后(对于小型网络,通常不到 1 分钟),你可以查看扫描结果。可 grep 的格式使你能够轻松识别开放端口和服务:

cat scan_results.gnmap

输出将以清晰的格式显示发现的开放端口,每行代表一个主机及其开放端口:

Host: 10.0.0.1 ()   Ports: 80/open/tcp//http///, 443/open/tcp//https///

审查开放端口

在这一步中,你将分析上一次端口扫描的结果,以识别开放端口及其关联的服务。开放端口就像是网络中的门,当它们打开时,允许设备之间进行通信。了解哪些端口是开放的对于网络安全至关重要,因为每个开放端口都可能是合法流量和安全威胁的潜在入口。

首先,让我们进入存储扫描结果的目录。这样可以确保我们处理的是正确的数据文件:

cd ~/project

要以原始格式查看完整的扫描结果,我们将使用 cat 命令。这将显示 Masscan 记录的所有内容,包括关闭的端口和扫描元数据:

cat scan_results.gnmap

由于我们主要关注开放端口,因此可以使用 grep 过滤结果。此命令将仅显示包含“open”一词的行,从而更容易发现活跃的服务:

grep "open" scan_results.gnmap

为了更好地组织结果,我们可以清晰地显示 IP 地址及其对应的开放端口。awk 命令有助于重新组织输出,以显示哪些特定主机上的哪些端口是开放的:

awk '/Host:/ {ip=$2} /open/ {print ip,$0}' scan_results.gnmap

如果你想查看有多少主机开放了特定端口(例如常见的 Web 端口 80),带有 -c 标志的 grep 命令将给出计数结果:

grep -c "80/open" scan_results.gnmap

最后,为了全面了解扫描网络范围内的所有开放端口,这个管道命令将统计每个开放端口的出现次数。该命令会对端口进行排序并显示每个端口出现的次数:

grep -oP '\d+/open' scan_results.gnmap | sort | uniq -c

示例输出可能如下所示,显示有三台主机开放了 SSH(端口 22),五台开放了 HTTP(端口 80),两台开放了 HTTPS(端口 443):

   3 22/open
   5 80/open
   2 443/open

导出扫描结果

在这一步中,你将学习如何将 Masscan 扫描结果导出为不同的文件格式。正确导出扫描数据至关重要,因为这能让你分析扫描结果、与团队成员分享报告,或将数据提供给其他安全工具使用。我们将创建三种常见的格式:用于电子表格分析的 CSV 格式、便于快速查看的纯文本格式,以及用于自动化处理的 JSON 格式。

首先,进入存储扫描结果的项目目录。这样能确保所有导出的文件都保存到正确的位置:

cd ~/project

第一次转换将创建一个 CSV(逗号分隔值)文件。CSV 非常适合导入到 Excel 等电子表格软件中。awk 命令从可 grep 的格式文件中提取 IP 地址、端口号和服务名称:

awk -F'[ /]' '/Host:/ {ip=$2} /open/ {print ip","$4","$7}' scan_results.gnmap > scan_results.csv

接下来,我们将生成一个简单的文本报告,方便在终端或文本编辑器中阅读。当你需要快速查看哪些主机有开放端口而无需打开电子表格时,这种格式很有用:

grep "open" scan_results.gnmap | awk '{print "Host:", $2, "Port:", $4}' > scan_report.txt

为了与其他工具或脚本集成,我们将创建一个 JSON 文件。JSON 是一种结构化格式,大多数编程语言都能轻松解析。以下命令将构建一个包含所有扫描结果的正确 JSON 数组:

echo '[' > scan_results.json
grep "open" scan_results.gnmap | awk '{print "{\"host\":\""$2"\",\"port\":\""$4"\",\"service\":\""$7"\"},"}' >> scan_results.json
sed -i '$ s/,$//' scan_results.json
echo ']' >> scan_results.json

最后,验证所有导出的文件是否成功创建。此命令将列出文件及其大小,以便你确认导出操作按预期完成:

ls -l scan_results.* scan_report.txt

你应该会看到类似以下的输出:

-rw-r--r-- 1 labex labex 1234 scan_results.csv
-rw-r--r-- 1 labex labex 5678 scan_results.json
-rw-r--r-- 1 labex labex 9012 scan_report.txt

总结

在本次实验中,你学习了如何使用 Masscan 进行高速端口扫描,涵盖了从安装到目标准备的整个过程。该过程包括设置依赖项、编译源代码,以及配置私有 IP 范围以进行安全实践。

你已经掌握了 Masscan 的异步扫描功能和 CIDR 表示法的实际应用知识。本次实验通过专注于不可路由地址,强调了道德扫描实践,让你为现实世界的网络分析场景做好准备。