使用 Nmap 执行隐蔽网络扫描

NmapNmapBeginner
立即练习

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

简介

在本次实验中,你将学习如何使用 Nmap(一款强大的用于网络发现和安全审计的开源工具)进行隐蔽网络扫描。隐蔽扫描在网络安全中至关重要,它能让安全专业人员在降低被检测风险的同时识别网络漏洞。

你将探索不同的 Nmap 扫描技术,从基本的隐蔽扫描开始,逐步深入到更高级的隐蔽方法。这些技能对于在不触发现有安全系统或惊动网络潜在威胁的情况下进行网络审计的安全专业人员来说至关重要。实验结束时,你将获得使用 Nmap 进行隐蔽扫描的实践经验,并了解如何在实际的安全评估中应用这些技术。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"]) nmap/NmapGroup -.-> nmap/installation("Installation and Setup") nmap/NmapGroup -.-> nmap/port_scanning("Port Scanning Methods") nmap/NmapGroup -.-> nmap/scan_types("Scan Types and Techniques") nmap/NmapGroup -.-> nmap/target_specification("Target Specification") nmap/NmapGroup -.-> nmap/syn_scan("SYN Scan") nmap/NmapGroup -.-> nmap/stealth_scanning("Stealth and Covert Scanning") subgraph Lab Skills nmap/installation -.-> lab-415933{{"使用 Nmap 执行隐蔽网络扫描"}} nmap/port_scanning -.-> lab-415933{{"使用 Nmap 执行隐蔽网络扫描"}} nmap/scan_types -.-> lab-415933{{"使用 Nmap 执行隐蔽网络扫描"}} nmap/target_specification -.-> lab-415933{{"使用 Nmap 执行隐蔽网络扫描"}} nmap/syn_scan -.-> lab-415933{{"使用 Nmap 执行隐蔽网络扫描"}} nmap/stealth_scanning -.-> lab-415933{{"使用 Nmap 执行隐蔽网络扫描"}} end

设置测试环境

在这一步中,我们将为你准备好进行隐蔽网络审计的环境。我们将搭建一个简单的 Web 服务器,作为我们扫描的目标。拥有这样一个可控的目标至关重要,因为它能让你在不影响实际系统的情况下练习隐蔽扫描技术。

首先,你需要打开一个终端。终端就像是一个命令行界面,你可以在其中输入命令与计算机进行交互。打开终端后,你要导航到你的工作区。工作区是一个特定的目录,你可以将所有与项目相关的文件存放在这里。为此,请使用以下命令:

cd /home/labex/project

cd 命令代表“change directory”(更改目录)。它会告知系统将你从当前位置移动到指定的目录,在这个例子中是 /home/labex/project

现在你已经进入了工作区,我们将创建一个名为 stealth 的新目录。目录就像计算机上的文件夹,创建一个专用目录有助于你整理工作。使用以下命令创建该目录:

mkdir -p /home/labex/project/stealth

mkdir 命令用于创建新目录。-p 选项可确保如果路径中的任何中间目录不存在,也会一并创建。

创建目录后,你需要进入该目录。这样,你创建的任何文件都会存储在 stealth 目录中。再次使用 cd 命令:

cd /home/labex/project/stealth

接下来,我们将创建一个简单的 HTML 文件。HTML(超文本标记语言)是创建网页的标准语言。这个文件将由我们的 Web 服务器提供服务,模拟一个实际的 Web 服务。使用以下命令创建该文件:

echo "Robotics server running..." > index.html

echo 命令会将文本“Robotics server running...”打印到终端。> 符号会将该输出重定向并写入一个名为 index.html 的新文件中。

现在,我们需要设置一个 DNS 解析器。DNS(域名系统)就像是互联网的电话簿,它将域名(如 google.com)转换为 IP 地址。通过设置 DNS 解析器,我们可以确保系统能够正确连接到其他网络。使用以下命令:

sudo sh -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'

sudo 命令会赋予你执行需要特殊权限操作的管理员权限。sh -c 用于运行 shell 命令。我们将“nameserver 8.8.8.8”这一行写入 /etc/resolv.conf 文件,该文件是系统存储 DNS 配置的地方。

最后,我们将使用 nc(netcat)命令启动一个简单的 Web 服务器。Netcat 是一个多功能的网络实用工具,可用于各种任务,包括搭建简单的服务器。这个服务器将监听 8080 端口,并提供我们之前创建的 HTML 文件。使用以下命令:

nc -lvp 8080 < index.html &

让我们来分解一下这个命令:

  • nc 是用于网络连接的 netcat 实用工具,它允许你在不同的网络端点之间创建连接。
  • -l 告诉 netcat 监听传入的连接。它不会尝试连接到其他服务器,而是等待其他服务器连接到它。
  • -v 启用详细输出,这意味着 netcat 会提供关于其操作的更详细信息。
  • -p 8080 指定要监听的端口。端口就像计算机上的门,在这种情况下,我们打开 8080 端口以接收传入连接。
  • < index.htmlindex.html 的内容提供给任何连接。当客户端连接到我们的服务器时,它将收到 index.html 文件的内容。
  • & 会将该进程放在后台运行。这样,在服务器运行时,你可以继续使用终端运行其他命令。

运行该命令后,你应该会看到输出,表明服务器正在监听 8080 端口:

Listening on 0.0.0.0 8080

现在,你有一个在 8080 端口上运行的 Web 服务器,它将作为你进行隐蔽扫描练习的目标。

使用 Nmap 进行基本隐蔽扫描

在这一步中,你将学习如何使用 Nmap 进行基本的隐蔽扫描。不过,首先让我们了解一下什么是隐蔽扫描。隐蔽扫描,也称为 SYN 扫描,是网络安全领域中非常实用的一种技术。当你试图确定目标系统上哪些端口处于开放状态时,隐蔽扫描可以帮助你完成这一任务,同时降低被目标系统检测到的几率。这一点很重要,因为如果目标系统检测到你的扫描,它可能会采取防御措施或记录你的活动。

在开始扫描之前,你需要确保自己处于正确的位置。你要回到主工作区,这里就像是你的大本营,所有与项目相关的文件都存放在这里。为此,你可以使用以下命令:

cd /home/labex/project

理解隐蔽扫描

要全面理解隐蔽扫描的工作原理,你首先需要了解传统的 TCP 连接。传统的 TCP 连接遵循三次握手过程,这是客户端和服务器为建立连接而经历的一系列步骤。

  1. 客户端向服务器发送一个 SYN(同步)数据包,这就好比客户端在说:“嘿,我想开始对话。”
  2. 如果服务器准备好进行通信,它会用一个 SYN - ACK(同步 - 确认)数据包进行响应,就像服务器在说:“当然,我准备好对话了。”
  3. 最后,客户端发送一个 ACK(确认)数据包来完成连接,这相当于客户端说:“太好了,让我们开始对话吧。”

然而,隐蔽扫描并不遵循这个完整的过程。相反:

  1. 客户端像正常连接一样向服务器发送一个 SYN 数据包。
  2. 如果服务器上的端口是开放的,服务器会用一个 SYN - ACK 数据包进行响应。
  3. 但这里有一个区别。客户端不会发送 ACK 数据包来完成连接,而是发送一个 RST(重置)数据包,这会阻止连接完全建立。

这种方法之所以有用,是因为目标系统不太可能记录这种交互,因为连接从未完全建立。所以,这是一种在不留下明显痕迹的情况下找出哪些端口开放的巧妙方法。

执行隐蔽扫描

现在你已经了解了隐蔽扫描的工作原理,让我们针对本地 Web 服务器执行一次扫描。你可以使用以下 Nmap 命令:

sudo nmap -sS -p 8080 localhost > /home/labex/project/stealth_scan.txt

让我们来分解这个命令,以便你确切了解每个部分的作用:

  • sudo 用于执行该命令,因为隐蔽扫描需要原始套接字访问权限。原始套接字访问是一种与网络进行底层交互的方式,需要特殊权限。因此,你使用 sudo 以管理员权限运行该命令。
  • nmap 是你使用的扫描工具,它是一款非常流行且功能强大的网络探测和安全审计工具。
  • -sS 指定你要执行 SYN 隐蔽扫描,这告诉 Nmap 使用你刚刚了解的隐蔽扫描技术。
  • -p 8080 告诉 Nmap 只扫描 8080 端口。有时你可能想扫描多个端口,但在这种情况下,你只对 8080 端口感兴趣。
  • localhost 是扫描的目标,由于你是在本地机器上运行此命令,localhost 指的就是你自己的计算机。
  • > /home/labex/project/stealth_scan.txt 将扫描的输出重定向到一个文本文件中,这样你就可以保存结果并在以后查看。

运行扫描后,你需要查看结果。为此,你可以使用以下命令:

cat /home/labex/project/stealth_scan.txt

当你运行此命令时,你应该会看到类似于以下的输出:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-25 12:00 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).

PORT     STATE SERVICE
8080/tcp open  http-proxy

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

注意,Nmap 正确识别出 8080 端口是开放的,这意味着你的隐蔽扫描成功检测到了你在第一步中设置的 Web 服务器。

使用这种扫描技术的优势在于它能提供准确的结果,同时比完整的 TCP 连接扫描更隐蔽。完整的 TCP 连接扫描会经历整个三次握手过程,这更有可能被目标系统察觉,并在受监控的系统上触发警报。因此,当你希望更加隐蔽时,隐蔽扫描是一个不错的选择。

高级隐蔽扫描技术

在这一步中,你将探索更高级的扫描技术,这些技术能提供更高水平的隐蔽性。这些技术在网络安全领域至关重要,因为它们能让你在不被轻易察觉的情况下收集目标网络的信息。其中一种强大的技术就是空闲扫描(Idle Scan),也称为僵尸扫描(Zombie Scan)。这种方法能让你在扫描目标时,将自己的身份隐藏在另一台主机背后。

在开始之前,确保你已进入工作区,这里是执行所有与项目相关文件和命令的地方。要导航到工作区,请在终端中运行以下命令:

cd /home/labex/project

理解空闲扫描

空闲扫描是 Nmap 中最隐蔽的扫描技术之一。它是如何工作的呢?它利用一个第三方主机,也就是所谓的“僵尸”主机来进行扫描。这样一来,目标会以为扫描来自僵尸主机,而不是你。

下面逐步分解空闲扫描的过程:

  1. 首先,扫描器向僵尸主机发送一个探测包。这个探测包能帮助扫描器确定僵尸主机当前的 IP ID 序列号。IP ID 序列号是主机为其发送的每个 IP 数据包分配的唯一编号。
  2. 接着,扫描器向目标发送一个 SYN 数据包,但会将该数据包的源 IP 地址设置为僵尸主机的 IP 地址。SYN 数据包用于发起 TCP 连接。
  3. 如果目标上的端口是开放的,目标会用一个 SYN - ACK 数据包进行响应。这个数据包会被发送到僵尸主机,因为这是它在 SYN 数据包中看到的源 IP 地址。
  4. 僵尸主机没有预料到这个 SYN - ACK 数据包,会向目标发送一个 RST 数据包。RST 数据包用于重置 TCP 连接。
  5. 然后,扫描器再次向僵尸主机发送探测包,检查僵尸主机的 IP ID 序列号是否增加。
  6. 如果 IP ID 序列号增加了,就表明目标上的端口是开放的。这是因为僵尸主机针对目标的 SYN - ACK 数据包发送了 RST 数据包。

这种技术的精妙之处在于其隐蔽性。目标只能看到来自僵尸主机的通信,而看不到实际扫描器的通信。因此,目标很难检测到自己正在被扫描。

执行空闲扫描

现在,让我们使用 Nmap 执行一次空闲扫描。在实际情况中,你会使用外部的僵尸主机。但在这个实验中,我们将使用本地机器来模拟这个过程。

在终端中运行以下命令:

sudo nmap -sI 127.0.0.1 localhost -p 8080 > /home/labex/project/idle_scan.txt

让我们来理解这个命令的各个部分:

  • sudo 用于执行该命令,因为 Nmap 需要原始套接字访问权限才能执行空闲扫描。原始套接字访问允许 Nmap 创建和发送自定义 IP 数据包,这对于这种类型的扫描是必要的。
  • nmap 是我们用于此任务的知名扫描工具。
  • -sI 127.0.0.1 指定我们正在执行空闲扫描,并使用 127.0.0.1(即本地主机)作为僵尸主机。
  • localhost 是我们要扫描的目标。
  • -p 8080 告诉 Nmap 只扫描目标上的 8080 端口。
  • > /home/labex/project/idle_scan.txt 将扫描的输出重定向到一个文本文件中,这样我们可以在以后轻松查看结果。

运行扫描后,让我们查看结果。使用以下命令查看输出文件的内容:

cat /home/labex/project/idle_scan.txt

你可能会看到类似于以下的输出:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-25 12:10 UTC
Idle scan using zombie 127.0.0.1 (127.0.0.1:80); Class: Incremental
Skipping Idle Scan against localhost (127.0.0.1) -- you can't idle scan your own machine (localhost).
Nmap scan report for localhost (127.0.0.1)
Host is up.

PORT     STATE   SERVICE
8080/tcp unknown http-proxy

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

注意,Nmap 报告它正在跳过空闲扫描。这是因为你试图将自己的机器同时用作僵尸主机和目标。在实际场景中,如果你有不同的主机,这种技术对于隐蔽扫描将非常有效。

尽管在实验环境中存在这个限制,但这个练习仍然向你展示了如何使用空闲扫描命令。在实际操作中,你会选择不同的主机作为僵尸主机,扫描将不会出现这个警告信息。

当你需要最大限度的隐蔽性时,这种高级技术非常有价值。它让目标极难将扫描追溯到实际的扫描器。

理解扫描输出及实际应用

在最后这一步,你将重点学习如何解读已获取的扫描结果,以及了解这些结果在现实世界的网络安全场景中是如何应用的。掌握这些知识至关重要,因为它能让你在应对实际安全挑战时,有效地运用隐蔽扫描技术。

首先,你需要导航到工作区。工作区就像是一个专门的区域,所有与项目相关的文件都存放在这里。要进入工作区,你可以使用 cd 命令。cd 命令代表“change directory”(更改目录),用于在文件系统中从一个目录切换到另一个目录。在终端中运行以下命令:

cd /home/labex/project

比较不同的扫描类型

现在,让我们来比较你所执行的不同扫描类型的输出。通过比较这些输出,你可以看到每种扫描类型在揭示目标网络信息方面的差异。

以下命令将显示隐蔽扫描的结果。echo 命令用于将文本打印到终端,cat 命令用于显示文件的内容。在这里,我们首先打印一个标题,表明这些是隐蔽扫描的结果,然后显示 stealth_scan.txt 文件的实际内容:

echo "=== Stealth Scan Results ===" && cat /home/labex/project/stealth_scan.txt

同样,这个命令将显示空闲扫描的结果:

echo "=== Idle Scan Results ===" && cat /home/labex/project/idle_scan.txt

解读端口状态

在分析扫描结果时,你会注意到 Nmap 会报告端口处于不同的状态。理解这些状态是解读扫描数据的关键。

  1. open(开放)—— 这意味着有服务正在该端口上主动接受连接。例如,如果一个 Web 服务器在某个特定端口上运行,该端口将被报告为 open
  2. closed(关闭)—— 端口可访问,但没有服务在监听。这就好比一扇门是解锁的,但里面没有人。
  3. filtered(过滤)—— 防火墙或其他网络障碍正在阻止对该端口的访问。就好像有一个保安阻止你进入那个端口。
  4. unfiltered(未过滤)—— 端口可访问,但 Nmap 无法确定它是开放还是关闭的。这就像看着一扇门,却无法判断里面是否有人。
  5. open|filtered(开放或过滤)—— Nmap 无法确定端口是开放还是被过滤。端口的状态存在一定的不确定性。
  6. closed|filtered(关闭或过滤)—— Nmap 无法确定端口是关闭还是被过滤。

在你的隐蔽扫描中,8080 端口被报告为 open。这表明你的 Web 服务器正在该端口上主动接受连接,意味着它已准备好向客户端提供网页或其他服务。

实际应用

理解如何解读这些结果在网络安全领域有几个实际应用:

  1. 识别安全漏洞:开放的端口可能代表攻击者的潜在入口。如果存在不必要的开放端口,攻击者可能会利用它们来未经授权地访问你的系统。
  2. 验证防火墙配置:被过滤的端口表明防火墙规则正在正确地阻止访问。这有助于你确保网络受到保护,免受不必要的流量攻击。
  3. 进行安全审计:定期扫描有助于确保只有必要的端口是开放的。通过定期扫描你的网络,你可以检测到任何可能构成安全风险的新开放端口。
  4. 制定补救计划:根据扫描结果,你可以制定计划来解决安全问题。例如,如果你发现一个不必要的开放端口,你可以将其关闭。

现在,让我们创建一份简单的报告,总结你的发现和建议。报告是记录你所发现的问题以及应采取的行动的有用方式。

cat << EOF > /home/labex/project/scan_report.txt
## Network Scan Report

### Findings:
- Port 8080 is open and running an HTTP proxy service
- This port was successfully detected using stealth scanning techniques

### Recommendations:
- Ensure this port is intended to be open
- Implement proper access controls if this service is necessary
- Close the port if the service is not required
- Regularly scan the network to detect changes in the network footprint
EOF

要查看你的报告,请再次使用 cat 命令:

cat /home/labex/project/scan_report.txt

这种报告格式有助于记录你的发现,并根据扫描结果提供可操作的建议。它能帮助你将网络的安全状态传达给他人,并采取适当的行动。

清理工作

在结束之前,你需要清理环境。在第一步中,你启动了一个 Web 服务器,现在需要停止它。你可以使用 pkill 命令,该命令用于根据进程的名称或其他条件终止进程。-f 选项告诉 pkill 在进程的完整命令行中进行搜索。

pkill -f "nc -lvp 8080"

这个命令将终止在 8080 端口上运行 Web 服务器的 netcat 进程。

至此,你已经完成了对使用 Nmap 进行隐蔽扫描技术的全面探索,从基本设置到高级方法,再到结果的实际应用。

总结

在这个实验中,你学习了如何使用 Nmap 进行隐蔽的网络扫描,这是网络安全专业人员必备的一项关键技能。你首先搭建了一个带有简单 Web 服务器的测试环境,以便在可控的环境中练习扫描。接着,你探索了使用 SYN 扫描技术进行的基本隐蔽扫描,这种扫描方式能提供准确的结果,同时降低被检测到的风险,非常适合在不惊动被监控系统的情况下进行安全审计。

随后,你深入研究了更高级的隐蔽扫描方法,例如空闲扫描(Idle Scan),它可以隐藏扫描的来源。尽管在实验中其应用受到一定限制,但你已经了解了它在现实场景中的工作原理。最后,你学会了解读扫描结果并创建可执行的报告,这使你能够识别安全漏洞并制定补救计划。掌握这些隐蔽扫描技术,能让你进行全面的网络评估,并主动应对潜在威胁。