学习 Nmap 网络扫描基础

NmapNmapBeginner
立即练习

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

简介

在这个实验中,你将学习使用 Nmap 进行网络扫描的基础知识。Nmap 是一款功能强大且用途广泛的工具,被网络管理员和安全专家广泛使用。它是一个用于网络发现和安全审计的开源实用程序,能够扫描网络以查找主机和服务、识别操作系统并检测漏洞。

通过实际操作练习,你将了解如何执行不同类型的端口扫描。你还将学习解读扫描结果,并深入了解网络安全评估技术。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"]) nmap/NmapGroup -.-> nmap/installation("Installation and Setup") nmap/NmapGroup -.-> nmap/basic_syntax("Basic Command Syntax") 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/installation -.-> lab-415927{{"学习 Nmap 网络扫描基础"}} nmap/basic_syntax -.-> lab-415927{{"学习 Nmap 网络扫描基础"}} nmap/save_output -.-> lab-415927{{"学习 Nmap 网络扫描基础"}} nmap/port_scanning -.-> lab-415927{{"学习 Nmap 网络扫描基础"}} nmap/target_specification -.-> lab-415927{{"学习 Nmap 网络扫描基础"}} nmap/service_detection -.-> lab-415927{{"学习 Nmap 网络扫描基础"}} end

理解端口并设置环境

在开始学习端口扫描之前,了解计算机网络中端口的概念至关重要。端口充当通信端点,使计算机上的不同进程能够共享网络资源。你可以将它们想象成数据进出计算机的通道。总共有 65,535 个端口可供使用,它们被分为三个范围:

  • 知名端口(Well - known ports):这些端口的编号从 0 到 1023,它们被保留用于特定服务。例如,端口 80 用于 HTTP(超文本传输协议,Hypertext Transfer Protocol),这是用于传输网页的协议;端口 22 用于 SSH(安全外壳协议,Secure Shell),这是用于安全访问远程计算机的协议。
  • 注册端口(Registered ports):这些端口的范围是从 1024 到 49151,它们已在互联网号码分配机构(Internet Assigned Numbers Authority, IANA)注册。虽然已注册,但普通用户也可以将它们用于自己的应用程序。
  • 动态/私有端口(Dynamic/Private ports):这些端口的范围是从 49152 到 65535,它们可自由用于临时用途。应用程序在需要建立短期连接时可以使用这些端口。

在这一步中,我们将在实验环境中设置一个本地服务,稍后我们将对这个服务进行扫描。这种实践方法将帮助你理解强大的端口扫描工具 Nmap 是如何检测开放端口以及运行在这些端口上的服务的。

首先,打开一个终端。终端是一个基于文本的界面,你可以在其中输入命令与计算机进行交互。打开终端后,你需要确保自己位于项目目录中。项目目录是存储与本实验相关的所有文件的地方。你可以通过运行以下命令导航到项目目录:

cd /home/labex/project

接下来,我们将在你的机器上创建一个简单的 HTTP 服务器。我们将使用 Python 内置的 HTTP 服务器模块。这个服务器将监听端口 8080。监听某个端口意味着服务器正在该特定端口上等待传入的请求。这个服务器将成为我们 Nmap 扫描的目标。要启动服务器,请执行以下命令:

python3 -m http.server 8080 &

运行此命令后,输出应该类似于:

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

命令末尾的 & 符号很重要,它会使进程在后台运行。这意味着服务器将继续运行,而你可以继续使用终端输入其他命令。

为了验证服务器是否正在运行,我们将检查监听端口。我们可以通过运行以下命令来实现:

ss -tuln | grep 8080

ss 命令用于显示套接字统计信息。-tuln 选项告诉该命令显示 TCP、UDP、监听套接字并显示数字地址。| 符号是管道符,它将 ss 命令的输出传递给 grep 命令。grep 命令会在输出中搜索字符串 8080

如果服务器正常运行,输出应该显示端口 8080 正在被使用:

tcp   LISTEN  0       1            0.0.0.0:8080      0.0.0.0:*

此输出确认我们的 HTTP 服务器正在按预期运行,并且已准备好由 Nmap 进行扫描。

基本 Nmap 端口扫描

现在我们的 HTTP 服务器已经启动并运行,我们准备开始使用 Nmap 执行基本的端口扫描。但首先,让我们了解一下什么是端口扫描。端口扫描是网络安全中的一项基本技术,它帮助我们找出主机上哪些端口是开放的。端口就像建筑物中的门,计算机上运行的每个服务都使用特定的端口进行通信。对于网络管理员来说,了解哪些端口是开放的可以确保他们的服务按预期运行。对于安全专家来说,这是识别潜在漏洞的关键步骤,因为开放的端口有时可能会被攻击者利用。

首先,我们需要确保 Nmap 已安装在我们的系统上。Nmap 是一个强大的网络扫描工具,我们将在整个实验中使用它。要检查它是否已安装,我们可以在终端中运行以下命令:

nmap --version

此命令要求系统显示已安装的 Nmap 版本。如果 Nmap 安装正确,你应该会看到类似以下的输出:

Nmap version 7.80 ( https://nmap.org )

执行基本端口扫描

现在我们已经确认 Nmap 已安装,让我们执行一次基本扫描,检查本地主机(localhost)上的端口 8080 是否开放。本地主机指的是我们当前正在使用的计算机,其 IP 地址为 127.0.0.1。要执行扫描,请执行以下命令:

nmap -p 8080 localhost

在这个命令中,-p 标志用于指定我们要扫描的端口。这里,我们只对端口 8080 感兴趣。当你运行此命令时,Nmap 将向本地主机的端口 8080 发送特殊的网络数据包,并分析响应以确定该端口是否开放。

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

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

PORT     STATE SERVICE
8080/tcp open  http-proxy

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

此输出为我们提供了重要信息。它告诉我们端口 8080 是开放的,并且 Nmap 已将运行在该端口上的服务识别为“http - proxy”。

接下来,我们要将这次扫描的输出保存到一个文件中。保存扫描结果很有用,因为我们以后可以参考它们进行进一步分析。要保存输出,请运行以下命令:

nmap -p 8080 localhost > /home/labex/project/basic_scan.txt

在这个命令中,> 符号用于将 Nmap 扫描的输出重定向到位于 /home/labex/project 目录下名为 basic_scan.txt 的文件中。

为了验证输出是否已正确保存,我们可以使用 cat 命令。cat 命令用于显示文件的内容。运行以下命令:

cat /home/labex/project/basic_scan.txt

你应该会看到与之前相同的输出,现在它已保存在文件中。

理解输出

让我们仔细查看 Nmap 扫描的输出,了解每一行的含义:

  • Starting Nmap 7.80 ( https://nmap.org ) at 2023-08-01 10:00 UTC:这一行告诉我们 Nmap 扫描何时开始,有助于记录扫描执行的时间。
  • Nmap scan report for localhost (127.0.0.1):这一行标识了扫描的目标主机。在这种情况下,是 IP 地址为 127.0.0.1 的本地主机。
  • Host is up (0.00020s latency):这一行确认目标主机在线。延迟值表示网络数据包往返主机所需的时间。对于本地主机,由于它就是我们正在使用的同一台计算机,因此预期延迟非常低。
  • PORT STATE SERVICE:这是端口扫描结果的标题,它告诉我们接下来的行将显示哪些信息。
  • 8080/tcp open http-proxy:这一行表明端口 8080 是开放的。/tcp 部分指定了所使用的网络协议类型(TCP,这是一种用于可靠数据传输的常见协议)。Nmap 已将运行在该端口上的服务识别为“http - proxy”。
  • Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds:这一行总结了扫描情况。它告诉我们 Nmap 扫描了一个 IP 地址(本地主机),发现主机在线,并在 0.05 秒内完成了扫描。

高级 Nmap 扫描技术

既然我们已经成功完成了基本的端口扫描,现在是时候提升技能,探索一些更高级的 Nmap 扫描技术了。Nmap 是一个强大的工具,它提供了众多选项来收集有关网络服务的详细信息。这些信息对于网络管理和安全评估都至关重要。通过使用高级扫描技术,你可以更深入地了解网络中的系统,这有助于识别潜在的安全风险并更有效地管理网络。

服务版本检测

Nmap 最有用的功能之一是能够确定开放端口上运行的服务及其版本。了解服务及其版本至关重要,因为这有助于你识别与特定服务版本相关的潜在漏洞。许多软件漏洞都与特定版本相关,因此通过了解端口上运行的确切版本,你可以快速检查是否存在已知的安全问题。

要对端口 8080 执行服务版本检测扫描,你需要执行以下命令:

nmap -sV -p 8080 localhost

在这个命令中,-sV 标志是关键。它告诉 Nmap 探测开放端口以确定服务信息。-p 8080 指定我们要扫描端口 8080,localhost 表示我们正在扫描自己的机器。

此命令的输出应该类似于以下内容:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-08-01 10:15 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00022s latency).

PORT     STATE SERVICE VERSION
8080/tcp open  http    SimpleHTTPServer 0.6 (Python 3.10.12)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.32 seconds

如你所见,Nmap 现在提供了关于端口 8080 上运行的服务的更详细信息。它将该服务识别为 Python SimpleHTTPServer,并显示了其版本以及运行它的 Python 版本。

现在,让我们将这些有价值的信息保存到一个文件中。你可以通过运行以下命令来实现:

nmap -sV -p 8080 localhost > /home/labex/project/advanced_scan.txt

> 符号用于将 nmap 命令的输出重定向到指定的文件。

要查看文件的内容,你可以使用 cat 命令:

cat /home/labex/project/advanced_scan.txt

理解基本扫描和高级扫描的区别

让我们比较一下基本扫描和高级扫描,以了解为什么高级扫描如此有用。

  1. 基本扫描 (nmap -p 8080 localhost):当你运行基本扫描时,它只告诉你端口 8080 是开放的并且正在运行一个服务。根据端口号,Nmap 会猜测该服务可能是“http - proxy”。然而,这只是一个粗略的估计,它不会为你提供有关实际服务的详细信息。
  2. 高级扫描 (nmap -sV -p 8080 localhost):相比之下,高级扫描提供了更详细的信息。它告诉你确切的服务名称(SimpleHTTPServer)、其版本(0.6),甚至是服务所运行的编程语言及其版本(Python 3.10.12)。

这些额外的信息之所以有价值,有以下几个原因:

  • 识别过时的服务:通过了解服务的确切版本,你可以轻松检查它是否是可能存在已知漏洞的过时版本。如果是,你可以采取措施更新服务并保护你的网络。
  • 了解你的网络:你可以清楚地了解网络上到底运行着哪些软件。这有助于进行网络管理和资源分配。
  • 规划安全措施:你可以针对系统上运行的服务制定特定的安全措施。例如,如果你知道某个特定服务存在已知漏洞,你可以实施有针对性的安全控制。

其他有用的 Nmap 选项

Nmap 提供了许多其他扫描选项,这些选项可以组合使用以执行不同类型的扫描。以下是一些最常用的选项:

  • -sS:这是一种 TCP SYN 扫描,也称为隐身扫描。这是一种快速且隐蔽的端口扫描方式,因为它不会完成完整的 TCP 连接,因此更难被检测到。
  • -O:此选项启用操作系统检测。它允许 Nmap 尝试确定目标机器上运行的操作系统。
  • -A:一种激进扫描,结合了多种功能,包括操作系统检测、版本检测、脚本扫描和路由跟踪。它提供了目标系统的全面视图。
  • -T<0 - 5>:此选项用于设置计时模板。数字越大意味着扫描速度越快,但也可能增加被检测到的几率。
  • -Pn:此选项将所有主机视为在线,跳过主机发现阶段。当你知道目标在线并且想节省时间时,这个选项很有用。

例如,如果你想快速扫描本地机器上的所有知名端口,可以使用以下命令:

nmap -F localhost

-F(快速)选项告诉 Nmap 扫描比默认扫描更少的端口。当你想快速了解系统上的开放端口时,这个选项很有用。

注意:在实际的网络安全评估中,在扫描任何系统之前获得适当的授权非常重要。在许多司法管辖区,未经授权的扫描可能是违法的。

解读和分析扫描结果

在这一步,我们将学习如何理解和分析 Nmap 扫描的结果。在网络安全领域,能够解读扫描输出至关重要,它有助于你对网络安全状况做出明智的决策。例如,你可以根据扫描结果识别潜在的漏洞或未经授权的访问点。

比较不同的扫描类型

让我们再进行几种不同类型的扫描,看看它们的输出有何不同。首先,我们进行一次全面扫描。这种扫描包含了所有常见的选项,能让我们详细了解目标。

nmap -A -p 8080 localhost > /home/labex/project/comprehensive_scan.txt

在这个命令中,-A 标志非常重要,它启用了激进扫描选项。这些选项包括检测目标的操作系统、确定运行服务的版本、扫描可用脚本以及执行路由跟踪。通过使用这个标志,我们可以收集到很多关于目标的有用信息。

现在,让我们看看这次全面扫描的结果。

cat /home/labex/project/comprehensive_scan.txt

输出会非常详细,其中包含了端口 8080 上运行的服务信息、可能针对该服务运行的脚本以及其他相关细节。这些详细信息能帮助我们更好地了解目标的安全状况。

理解端口状态

Nmap 会报告端口的几种可能状态,每种状态都能让我们了解到端口的不同情况。

  • open(开放):这意味着有应用程序正在该端口上主动接受 TCP 连接或 UDP 数据包,就像一扇敞开的门,随时准备迎接访客。
  • closed(关闭):端口可以访问,但没有应用程序在监听,就像一扇未锁的门,但里面没有人应答。
  • filtered(被过滤):Nmap 无法确定端口是否开放,因为数据包过滤阻止了它的探测到达该端口,就像有保安挡住了 Nmap 看门的视线。
  • unfiltered(未过滤):端口可以访问,但 Nmap 无法判断它是开放还是关闭,就像看着一扇门,却无法确定里面是否有人。
  • open|filtered(开放或被过滤):Nmap 无法确定端口是开放还是被过滤,这是一种不确定的状态,我们不确定门是开着还是被挡住了。
  • closed|filtered(关闭或被过滤):Nmap 无法确定端口是关闭还是被过滤,与上一种状态类似,我们不确定门是锁着还是被挡住了。

让我们通过扫描一系列端口,看看这些状态在扫描结果中是如何呈现的。

nmap -p 8080-8085 localhost > /home/labex/project/port_states.txt

扫描完成后,我们可以查看结果。

cat /home/labex/project/port_states.txt

你应该会看到端口 8080 被报告为开放,而该范围内的其他端口可能被报告为关闭。这能让我们了解哪些端口正在被积极使用,哪些没有。

结果的实际分析

现在,让我们从扫描结果中提取关键信息,创建一份总结报告。我们将使用 grep 命令来过滤出开放的端口。开放端口对于安全评估非常重要,因为它们是攻击者潜在的入口。

grep "open" /home/labex/project/comprehensive_scan.txt > /home/labex/project/open_ports.txt

过滤完成后,我们可以查看结果。

cat /home/labex/project/open_ports.txt

这种过滤后的输出让我们更容易关注开放端口。我们无需查看整个详细的扫描报告,就能快速了解哪些端口是开放的,并开始评估它们的安全风险。

安全影响

理解扫描结果的安全影响至关重要。以下是一些需要牢记的关键点。

  1. 不必要的开放端口:任何开放端口都是攻击者潜在的入口。如果某个服务不再需要,就应该将其禁用。例如,如果你有一个不再使用的服务对应的端口是开放的,攻击者可能会利用该端口进入你的系统。
  2. 过时的服务:较旧版本的服务可能存在已知的漏洞,攻击者可以利用这些漏洞。为了避免这些风险,保持服务的更新非常重要。
  3. 配置错误的服务:即使是最新版本的服务,如果配置错误也可能存在漏洞。配置中的一个小错误就可能使你的系统遭受攻击。

在我们的实验环境中,我们有意为 HTTP 服务器开放了端口 8080。但在现实的生产环境中,你需要仔细评估这个服务是否必要,以及它是否得到了妥善的安全保护。

停止 HTTP 服务器

在完成这一步之前,让我们清理一下,停止之前启动的 HTTP 服务器。首先,我们需要找到它的进程 ID。

ps aux | grep "python3 -m http.server"

当你运行这个命令时,找到显示我们 HTTP 服务器进程的那一行。输出的第二列包含进程 ID(PID)。找到 PID 后,你可以用它来停止服务器。

kill <PID>

<PID> 替换为上一个命令输出中的实际进程 ID。

或者,你可以使用以下命令一步完成查找并终止进程的操作。

pkill -f "python3 -m http.server"

停止服务器后,我们需要验证它是否不再运行。

ss -tuln | grep 8080

如果没有输出,就意味着服务器已成功停止。

总结

在本次实验中,你学习了使用 Nmap 进行网络扫描的基础知识,Nmap 是网络安全行业中一款强大且广泛使用的工具。首先,你掌握了端口的概念及其在计算机网络中的功能。然后,你搭建了一个本地 HTTP 服务器,用于练习扫描实际的服务。

你进行了各种 Nmap 扫描,从基本的端口扫描到高级的服务版本检测。你学会了解读扫描结果,理解端口状态及其安全影响。你还练习了为安全评估过滤结果。这些技能对于网络管理员和安全专业人员来说至关重要,有助于他们识别开放端口、检测漏洞、做出明智的安全决策以及记录网络配置。通过掌握这些技术,你在网络安全评估和管理方面迈出了重要的一步。在现实场景中扫描系统之前,一定要获得适当的授权,因为未经授权的扫描可能是违法的。