使用 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/save_output("Save Output to File") nmap/NmapGroup -.-> nmap/port_scanning("Port Scanning Methods") nmap/NmapGroup -.-> nmap/target_specification("Target Specification") nmap/NmapGroup -.-> nmap/firewall_evasion("Firewall Evasion Techniques") subgraph Lab Skills nmap/installation -.-> lab-415921{{"使用 Nmap 检测和绕过防火墙限制"}} nmap/save_output -.-> lab-415921{{"使用 Nmap 检测和绕过防火墙限制"}} nmap/port_scanning -.-> lab-415921{{"使用 Nmap 检测和绕过防火墙限制"}} nmap/target_specification -.-> lab-415921{{"使用 Nmap 检测和绕过防火墙限制"}} nmap/firewall_evasion -.-> lab-415921{{"使用 Nmap 检测和绕过防火墙限制"}} end

搭建用于扫描的本地服务

在开始练习 Nmap 扫描技术之前,拥有一个可扫描的目标服务至关重要。这就好比在射击场需要有一个目标一样。在这一步,我们将在本地机器上创建一个简单的 HTTP 服务器。这个服务器将作为我们所有扫描练习的目标。

首先,我们需要打开一个终端。终端就像是一个命令中心,我们可以在其中向计算机发出指令。终端打开后,我们将为 HTTP 服务创建一个目录结构。目录类似于计算机上的文件夹,它有助于我们组织文件。

mkdir -p /home/labex/project/http_service

mkdir 命令代表“创建目录”。-p 选项确保如果路径中的任何中间目录不存在,它们将被创建。因此,此命令在 /home/labex/project 路径下创建了一个名为 http_service 的目录。

接下来,我们需要导航到新创建的目录。就像你在计算机上打开一个文件夹以访问其内容一样,我们使用 cd 命令进入该目录。

cd /home/labex/project/http_service

现在,我们将创建一个简单的 HTML 文件。HTML 是用于创建网页的语言。我们的 HTTP 服务器将把这个 HTML 文件提供给任何请求它的人。

echo "<html><body><h1>Welcome to the StarPath Exploration Server</h1></body></html>" > index.html

echo 命令会打印引号内的文本。> 符号将输出重定向到一个名为 index.html 的文件中。因此,此命令创建了一个包含指定基本 HTML 内容的 index.html 文件。

为确保文件已正确创建,我们可以查看其内容。为此,我们使用 cat 命令。

cat index.html

cat 命令读取文件内容并将其显示在终端上。你应该会看到我们刚刚创建的 HTML 内容:

<html><body><h1>Welcome to the StarPath Exploration Server</h1></body></html>

现在,是时候启动一个简单的 HTTP 服务器了。我们将使用 Python 的内置 http.server 模块。Python 是一种编程语言,这个模块使我们能够快速搭建一个 Web 服务器。

python3 -m http.server 8000

Python 中的 -m 选项用于将模块作为脚本运行。在这里,我们运行 http.server 模块,并让它监听 8000 端口。端口就像是数据进出计算机的一扇门。

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

Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

此输出表明 HTTP 服务器正在运行,并正在 8000 端口等待连接。务必保持此终端窗口打开,因为如果你关闭它,服务器将停止运行。

你已经成功搭建了一个本地服务。在接下来的步骤中,我们将使用这个服务作为 Nmap 扫描练习的目标。

绕过主机发现的基本 Nmap 扫描

在这一步,我们将进行首次 Nmap 扫描。但在开始之前,让我们先了解一个关键概念。许多防火墙被配置为阻止 ICMP 回显请求,也就是通常所说的“ping”。Nmap 通常会在开始扫描端口之前使用这些 ping 请求来检查主机是否在线。然而,通过绕过这个主机发现阶段,即使防火墙阻止了 ICMP 流量,我们仍然可以扫描目标。

首先,确保之前的终端中的 HTTP 服务器仍在运行。然后,打开一个 新的终端窗口。在这个新终端中,我们需要导航到项目目录。项目目录是存储本次实验所有相关文件和配置的地方。为此,我们将使用 cd 命令,它代表“更改目录”。命令如下:

cd /home/labex/project

现在我们已经进入了正确的目录,是时候对本地 HTTP 服务器进行基本的 Nmap 扫描了。我们将在 Nmap 命令中使用 -Pn 选项。这个选项告诉 Nmap 跳过主机发现步骤,并假设目标主机是在线的。命令如下:

nmap -Pn --reason -p 8000 localhost

让我们分解一下命令选项,了解每个选项的作用:

  • -Pn:此选项跳过主机发现过程。Nmap 不会使用 ping 来检查目标是否在线,而是直接假设目标在线并开始扫描端口。
  • --reason:此选项使 Nmap 显示端口处于特定状态的原因。例如,如果某个端口是开放的,它会告诉我们为什么认为该端口是开放的。
  • -p 8000:此选项告诉 Nmap 仅扫描 8000 端口。我们对这个特定端口感兴趣,因为我们的本地 HTTP 服务器正在该端口上运行。
  • localhost:这是我们要扫描的目标。在这种情况下,localhost 指的是我们的本地机器。

运行命令后,你应该会看到类似以下的输出:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-09-05 15:30 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up, received localhost-response (0.000097s latency).

PORT     STATE SERVICE      REASON
8000/tcp open  http-alt     syn-ack

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

输出显示 8000 端口是开放的,并且正在运行一个 HTTP 服务。“REASON”列显示“syn-ack”,这意味着当 Nmap 尝试连接到该端口时,该端口以 SYN-ACK 数据包进行响应。这是服务器在 TCP 协议中接受连接请求的标准方式。

接下来,我们要将扫描结果保存到一个文件中。保存结果很有用,因为这样我们可以在以后分析它们、与他人共享,或者将它们与未来的扫描结果进行比较。为了保存结果,我们将使用 > 符号,它将 Nmap 命令的输出重定向到一个文件中。命令如下:

nmap -Pn --reason -p 8000 localhost > /home/labex/project/nmap_scan.txt

最后,让我们检查保存的扫描结果。我们将使用 cat 命令,它代表“连接”。这个命令读取文件的内容并将其显示在终端中。命令如下:

cat /home/labex/project/nmap_scan.txt

你应该会看到与之前在终端中显示的相同的扫描结果。

这个基本扫描向我们展示了如何使用 -Pn 选项绕过阻止 ping 探测的防火墙规则。在现实场景中,当你需要扫描受阻止 ICMP 流量的防火墙保护的主机时,这种技术非常有用。

利用数据包分段进行高级防火墙绕过

在这一步,我们将探索一种更高级的防火墙绕过技术——数据包分段(packet fragmentation)。在深入了解之前,让我们先弄清楚什么是数据包分段。当数据在网络中传输时,它会被分割成称为数据包的较小单元。一些防火墙和入侵检测系统(Intrusion Detection Systems,IDS)会检查这些数据包,以查找任何恶意活动的迹象。然而,这些安全系统在处理分段数据包(即被进一步拆分成更小片段的数据包)时可能会遇到困难。这种困难为我们在扫描过程中绕过某些安全措施创造了机会。

我们将继续使用本地 HTTP 服务器作为扫描目标。首先,你需要在终端中导航到之前进行扫描的目录。这个目录是项目文件所在的位置,确保处于该目录中,这样命令才能正确执行。为此,我们将运行以下命令:

cd /home/labex/project

现在我们已经进入了正确的目录,可以使用 Nmap 的分段选项进行扫描了。该选项会将 IP 数据包拆分成更小的片段,使数据包过滤器更难检测到我们的扫描。我们将使用以下命令:

sudo nmap -f -Pn --reason -p 8000 localhost

让我们来分析一下这个命令中的额外选项 -f-f 选项告诉 Nmap 对 IP 数据包进行分段。这样做会让数据包过滤器更难分析数据包,从而难以检测到我们正在进行扫描。

运行命令后,你应该会看到类似以下的输出:

Starting Nmap 7.80 ( https://nmap.org ) at 2025-03-18 16:46 CST
Nmap scan report for localhost (127.0.0.1)
Host is up, received user-set (0.000062s latency).
Other addresses for localhost (not scanned): ::1

PORT     STATE SERVICE  REASON
8000/tcp open  http-alt syn-ack ttl 64

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

这个输出显示了扫描结果。它表明主机(localhost)处于活动状态,并且 8000 端口是开放的。

接下来,我们要将这些结果保存到一个单独的文件中。这样,我们可以在以后参考这些结果,并将其与其他扫描结果进行比较。为了保存结果,我们将运行以下命令:

sudo nmap -f -Pn --reason -p 8000 localhost > /home/labex/project/nmap_frag_scan.txt

此命令中的 > 符号将 Nmap 扫描的输出重定向到指定的文件。

现在,让我们检查这个文件的内容,确保结果已正确保存。我们将使用 cat 命令来显示文件内容:

cat /home/labex/project/nmap_frag_scan.txt

扫描结果可能看起来与我们之前的扫描相似,但底层技术不同。在这种情况下,Nmap 将 IP 数据包分割成了更小的片段,这使得无状态数据包过滤器更难检测到扫描。

让我们比较一下到目前为止使用的两种扫描方法:常规扫描和分段扫描。我们将创建一个新文件来存储这个比较结果。以下是实现该操作的命令:

echo "Comparing regular scan vs. fragmented scan:" > /home/labex/project/scan_comparison.txt
echo "---------------------------------------------" >> /home/labex/project/scan_comparison.txt
echo "" >> /home/labex/project/scan_comparison.txt
echo "1. Regular scan with -Pn:" >> /home/labex/project/scan_comparison.txt
cat /home/labex/project/nmap_scan.txt >> /home/labex/project/scan_comparison.txt
echo "" >> /home/labex/project/scan_comparison.txt
echo "2. Fragmented scan with -f -Pn:" >> /home/labex/project/scan_comparison.txt
cat /home/labex/project/nmap_frag_scan.txt >> /home/labex/project/scan_comparison.txt

这些命令首先在比较文件中写入一个标题,然后将常规扫描和分段扫描的结果添加到文件中。

现在,让我们通过显示比较文件的内容来查看比较结果:

cat /home/labex/project/scan_comparison.txt

在我们的受控环境中,两种扫描的结果可能看起来相似。然而,在现实场景中,这些不同的技术在面对不同的防火墙配置时,成功率可能会有所不同。数据包分段(-f)对无状态数据包过滤器特别有效。无状态数据包过滤器会独立检查每个数据包,并且通常无法重新组装片段以检查完整的数据包,这使得我们的分段扫描更有可能绕过这些过滤器。

为了实现更多的分段,Nmap 允许你通过使用多个 -f 标志(例如 -ff)或使用 --mtu 选项指定自定义的最大传输单元(Maximum Transmission Unit,MTU)大小来增加分段级别。MTU 是可以在网络上传输的最大数据包大小。通过指定自定义的 MTU,你可以控制数据包的分段方式。

这种技术展示了在进行安全评估时,如何将数据包分段作为一种额外的方法来绕过防火墙检测。

总结

在本次实验中,你学习了如何使用 Nmap 的防火墙绕过技术来识别并绕过防火墙限制。首先,你搭建了一个本地 HTTP 服务器作为扫描目标,创建了一个安全的环境来练习不同的扫描方法,而不会对外部系统造成影响。然后,你使用 -Pn 选项进行了基本的 Nmap 扫描,以绕过主机发现过程。当防火墙阻止 ICMP 回显请求时,这种方法非常有用,它使你能够扫描可能隐藏在防火墙规则背后的端口。

接下来,你探索了一种高级的绕过技术:使用 -f 选项进行数据包分段。这种方法将 IP 数据包进行分段,使无状态数据包过滤器更难检测和阻止扫描。通过比较这两种技术的结果,你了解了它们的差异和应用场景。这些技术对于安全专业人员进行全面的安全评估至关重要。不过,请记住,仅在获得适当授权的评估中使用这些技术,以避免违反法律和政策。