使用 Nmap 执行高级主机发现

NmapBeginner
立即练习

介绍

在本实验中,你将学习使用 Nmap 执行高级主机发现。主机发现是识别网络上活动设备的过程。这是网络侦察的关键第一步,帮助你了解网络布局并识别进一步分析的潜在目标。

你将探索各种 Nmap 技术,包括:

  • TCP Ping 扫描 (-PS): 向特定端口发送 TCP SYN 数据包,以确定主机是否在线以及这些端口是否开放。
  • UDP Ping 扫描 (-PU): 向特定端口发送 UDP 数据包,当 TCP Ping 被阻止时经常使用,通过响应或缺乏响应来推断主机状态。
  • 跳过 Ping 扫描 (-Pn): 绕过 Nmap 的默认主机发现阶段,强制它假设所有目标主机都处于在线状态,并直接进行端口扫描。
  • 技术组合: 利用多种发现方法来提高主机检测的可靠性,尤其是在具有防火墙的复杂网络环境中。
  • 保存和分析结果: 将 Nmap 输出保存到文件中以供以后审查,并使用基本的 Linux 命令从扫描结果中提取有价值的信息。

在整个实验过程中,你将执行诸如 nmap -PS2222,8080 127.0.0.1 的 TCP Ping 扫描命令,nmap -PU5353 127.0.0.1 的 UDP Ping 命令,以及 nmap -Pn -oN hosts.txt 127.0.0.1 以保存结果。这些实践练习将增强你对 Nmap 主机发现功能的理解,并为你在实际网络侦察任务中做好准备。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 100%。获得了学习者 100% 的好评率。

使用 nmap -PS 命令扫描特定端口的 TCP Ping

本步骤将教你如何使用 Nmap 对目标主机的特定端口执行 TCP Ping 扫描。此技术对于确定主机是否在线以及特定服务是否在这些端口上运行非常有用,尤其是在防火墙阻止传统 ICMP Ping 的情况下。

理解 TCP Ping:
与传统的 ICMP Ping 不同,TCP Ping 向目标主机上的指定端口发送 TCP SYN 数据包。

  • 如果端口是开放的,目标主机通常会用 SYN/ACK 数据包响应。
  • 如果端口是关闭的,目标主机通常会用 RST 数据包响应。
  • 如果端口是被过滤的(例如,由防火墙过滤),则可能根本没有响应。

Nmap 使用这些响应(或缺乏响应)来确定主机是否在线以及指定端口的状态。Nmap 中的 -PS 选项用于执行 TCP SYN Ping 扫描。你可以使用逗号分隔的列表指定一个或多个要扫描的端口。

在本实验中,设置脚本已在你的本地机器(127.0.0.1)上配置了几个服务。我们将针对运行在端口 2222 的 SSH 服务和运行在端口 8080 的 Nginx Web 服务器。

在 LabEx VM 中打开你的终端。你的默认目录是 ~/project。执行以下命令:

nmap -PS2222,8080 127.0.0.1

该命令指示 Nmap 向主机 127.0.0.1 的端口 22228080 发送 TCP SYN 数据包。

你应该看到类似于以下的输出,表明主机已启动,并且指定端口已打开:

Starting Nmap 7.80 ( https://nmap.org ) at YYYY-MM-DD HH:MM CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000085s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
2121/tcp open  ccproxy-ftp
2222/tcp open  EtherNetIP-1
3001/tcp open  nessus
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds

在此示例中,Nmap 报告主机 127.0.0.1 已启动,并且端口 2222(SSH)和 8080(HTTP 代理)已打开。如果端口已关闭,输出将显示“closed”而不是“open”。如果主机已关闭或无法访问,Nmap 将报告“Host is down”。

使用 nmap -PU 执行 UDP Ping 扫描

本步骤将教你如何使用 Nmap 对目标主机的特定端口执行 UDP Ping 扫描。此技术在防火墙阻止 TCP Ping 或你怀疑主机仅运行 UDP 服务时,对于主机发现特别有用。

理解 UDP Ping:
与预期 SYN/ACK 或 RST 响应的 TCP Ping 不同,UDP Ping 向指定端口发送 UDP 数据包。

  • 如果端口是开放的,目标主机可能根本不响应(因为许多 UDP 服务仅在收到特定请求时才发送响应)。
  • 如果端口是关闭的,目标主机通常会用 ICMP“端口不可达”错误响应。
  • 如果端口是被过滤的,则不会有响应。

Nmap 使用响应的存在或不存在(或响应类型)来确定主机是否在线。Nmap 中的 -PU 选项用于执行 UDP Ping 扫描。你必须指定要扫描的端口。在本实验中,我们将针对运行在本地机器(127.0.0.1)的端口 5353 的 DNS 服务。

重要提示: UDP Ping 扫描需要 root 权限才能读取原始网络响应。你需要使用 sudo 与 nmap 命令一起使用。

在 LabEx VM 中打开你的终端。你的默认目录是 ~/project。执行以下命令:

sudo nmap -PU5353 127.0.0.1

该命令指示 Nmap 向主机 127.0.0.1 的端口 5353 发送 UDP 数据包。

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

Starting Nmap 7.80 ( https://nmap.org ) at YYYY-MM-DD HH:MM CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000040s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
2121/tcp open  ccproxy-ftp
2222/tcp open  EtherNetIP-1
3001/tcp open  nessus
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds

在此示例中,Nmap 报告主机 127.0.0.1 已启动。请注意,当使用 UDP Ping 进行主机发现时,Nmap 在确定主机处于活动状态后仍会执行其默认端口扫描,这就是为什么你看到输出中列出了 TCP 端口的原因。UDP Ping 成功检测到主机已在线。

使用 nmap -Pn 跳过 Ping 扫描

本步骤将教你如何使用 Nmap 的 -Pn 选项跳过主机发现 Ping 扫描。当你想扫描主机而无需先检查它是否在线时,此选项特别有用。这在传统 Ping 方法(例如 ICMP 或甚至 TCP/UDP Ping)被防火墙阻止,或者你只想通过假设主机已启动来节省时间时,非常有用。

理解 -Pn
通常,Nmap 在扫描端口之前会执行主机发现阶段。这包括发送各种探测(ICMP 回显请求、TCP SYN 数据包、UDP 数据包等)来确定目标主机是否在线。如果 Nmap 确定主机已关闭,它将跳过该主机的端口扫描阶段。

-Pn 选项指示 Nmap 完全跳过此主机发现阶段,并将所有目标主机视为在线。这意味着 Nmap 将直接进入端口扫描阶段,而不管主机是否响应任何 Ping 探测。

让我们尝试一个示例。我们将使用 -Pn 选项使用 Nmap 扫描本地主机地址 127.0.0.1

在 LabEx VM 中打开你的终端。你的默认目录是 ~/project。执行以下命令:

nmap -Pn 127.0.0.1

该命令指示 Nmap 跳过主机发现 Ping 扫描,并扫描 127.0.0.1 的端口。

你应该看到类似于以下的输出,显示本地机器上的各种开放端口,包括实验环境设置的端口:

Starting Nmap 7.80 ( https://nmap.org ) at YYYY-MM-DD HH:MM CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000098s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
2121/tcp open  ccproxy-ftp
2222/tcp open  EtherNetIP-1
3001/tcp open  nessus
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds

在此示例中,Nmap 报告主机 127.0.0.1 已启动,并显示开放端口。即使系统上的 ICMP Ping 或其他主机发现方法被阻止,由于 -Pn 选项,Nmap 仍然会尝试扫描端口。

需要注意的是,如果目标主机很多,使用 -Pn 选项可能会导致扫描时间更长,因为 Nmap 将尝试扫描每个指定 IP 地址的端口,即使其中许多实际上是脱机的。

组合主机发现技术

本步骤将教你如何结合 Nmap 中的 TCP 和 UDP Ping 技术来发现活动主机。结合技术可以显著提高主机发现的可靠性,尤其是在处理可能阻止一种探测类型但未阻止另一种探测类型的防火墙或其他网络安全措施时。

正如你先前步骤中所学:

  • -PS 用于 TCP SYN Ping。
  • -PU 用于 UDP Ping(需要 root 权限)。

通过结合这些选项,Nmap 将向指定 TCP 端口发送 TCP SYN 数据包,并向指定 UDP 端口发送 UDP 数据包。如果 任何 一种探测收到响应,Nmap 将认为主机已启动。这提供了一种更可靠的方式来检测活动主机。

在本示例中,我们将使用 Nmap 向本地机器(127.0.0.1)的端口 2222(SSH)发送 TCP SYN 数据包,并向端口 5353(DNS)发送 UDP 数据包。

在 LabEx 实验环境中打开你的终端。你的默认目录是 ~/project。执行以下命令:

sudo nmap -PS2222 -PU5353 127.0.0.1

此命令指示 Nmap 执行以下操作:

  • -PS2222:向目标主机的端口 2222 发送 TCP SYN 数据包。
  • -PU5353:向目标主机的端口 5353 发送 UDP 数据包。
  • 127.0.0.1:扫描本地主机。

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

Starting Nmap 7.80 ( https://nmap.org ) at YYYY-MM-DD HH:MM CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000040s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
2121/tcp open  ccproxy-ftp
2222/tcp open  EtherNetIP-1
3001/tcp open  nessus
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds

在此示例中,Nmap 报告主机 127.0.0.1 已启动。Nmap 通过收到发送到端口 2222 的 TCP SYN 数据包或发送到端口 5353 的 UDP 数据包的响应来确定这一点。在通过 Ping 探测确认主机处于活动状态后,Nmap 将继续进行其默认端口扫描,显示开放的 TCP 端口。

像这样结合技术通常比使用单一方法更有效,因为它增加了绕过可能阻止一种探测类型但未阻止另一种探测类型的防火墙或其他安全措施的机会,从而导致更准确的主机发现结果。

将发现结果保存到文件

本步骤将教你如何使用 -oN 选项将 Nmap 扫描结果保存到文件中。保存扫描结果对于记录你的发现、进行后续分析或与他人共享信息至关重要。

-oN 选项指示 Nmap 将扫描结果以“正常”格式保存到指定的文件中。“正常”格式是一种人类可读的文本文件,易于查看和解析。

在本示例中,我们将使用 Nmap 扫描主机 127.0.0.1,跳过主机发现 Ping 扫描(-Pn),并将结果保存到 ~/project 目录下的名为 hosts.txt 的文件中。

在 LabEx 实验环境中打开你的终端。你的默认目录是 ~/project。执行以下命令:

nmap -Pn -oN hosts.txt 127.0.0.1

此命令指示 Nmap 执行以下操作:

  • -Pn:跳过主机发现 Ping 扫描(假设主机已启动)。
  • -oN hosts.txt:将扫描结果以正常格式保存到文件 hosts.txt 中。
  • 127.0.0.1:扫描主机 127.0.0.1

扫描完成后,你可以使用 cat 命令查看 hosts.txt 文件的内容:

cat hosts.txt

你应该看到类似于以下的输出,其中包含 Nmap 版本、扫描时间、主机状态和开放端口:

## Nmap 7.80 scan initiated Tue Jun  3 10:50:49 2025 as: nmap -Pn -oN hosts.txt 127.0.0.1
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000089s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
2121/tcp open  ccproxy-ftp
2222/tcp open  EtherNetIP-1
3001/tcp open  nessus
8080/tcp open  http-proxy

## Nmap done at Tue Jun  3 10:50:49 2025 -- 1 IP address (1 host up) scanned in 0.05 seconds

现在,hosts.txt 文件包含以人类可读格式的 Nmap 扫描结果。你可以使用此文件进行文档记录、报告或使用基本的 Linux 命令(如 grep)进行进一步分析,以提取有关发现的主机和服务的特定信息。

总结

在本实验中,你学习了如何使用 Nmap 执行高级主机发现。你首先了解并应用了特定 Nmap 选项进行主机发现:

  • TCP Ping 扫描 (-PS): 你使用 nmap -PS2222,8080 127.0.0.1 来识别活动主机和开放的 TCP 端口。
  • UDP Ping 扫描 (-PU): 你执行 sudo nmap -PU5353 127.0.0.1 来使用 UDP 探测发现主机,这在 TCP 受限时非常有用。
  • 跳过 Ping 扫描 (-Pn): 你学习了如何强制 Nmap 在没有先前的主机发现的情况下扫描主机,使用 nmap -Pn 127.0.0.1,这对于防火墙环境至关重要。
  • 结合技术: 你结合了 TCP 和 UDP Ping 扫描,使用 sudo nmap -PS2222 -PU5353 127.0.0.1 来获得更可靠的主机检测。

此外,你掌握了管理 Nmap 输出的实用技能:

  • 保存结果: 你使用 nmap -Pn -oN hosts.txt 127.0.0.1 将扫描结果保存到人类可读的文件中。

通过掌握这些 Nmap 技术,你现在能够更好地执行有效的网络侦察,识别活动设备,并收集关键信息以进行安全评估或网络管理任务。保存的输出文件可以使用标准的 Linux 文本处理工具进行进一步分析,以进行详细的报告和文档记录。