学习 Nmap 网络端口扫描

NmapNmapBeginner
立即练习

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

简介

在本次实验中,你将学习使用 Nmap 进行网络端口扫描的基础知识。Nmap 是一款强大的开源网络扫描工具,深受网络安全专业人士的青睐。端口扫描是网络管理员和安全分析师发现目标系统上开放端口和服务的关键技术。

你将学习执行基本的 TCP Connect 扫描,这是一种常见且可靠的扫描方法。这种方法会与目标端口建立完整的 TCP 连接,以检查其状态。在本次实验结束时,你将能够识别网络上开放的服务,这是进行网络安全评估和系统加固的关键第一步。


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/tcp_connect_scan("Basic TCP Connect Scan") nmap/NmapGroup -.-> nmap/save_output("Save Output to File") nmap/NmapGroup -.-> nmap/target_specification("Target Specification") subgraph Lab Skills nmap/installation -.-> lab-415936{{"学习 Nmap 网络端口扫描"}} nmap/basic_syntax -.-> lab-415936{{"学习 Nmap 网络端口扫描"}} nmap/tcp_connect_scan -.-> lab-415936{{"学习 Nmap 网络端口扫描"}} nmap/save_output -.-> lab-415936{{"学习 Nmap 网络端口扫描"}} nmap/target_specification -.-> lab-415936{{"学习 Nmap 网络端口扫描"}} end

理解网络端口和服务

在开始学习扫描之前,了解什么是网络端口以及它们在网络安全领域为何重要至关重要。网络端口在允许不同服务通过网络进行通信方面起着至关重要的作用。它们就像数据进出计算机的“门”。

什么是网络端口?

网络端口是计算机网络上用于通信的虚拟端点。可以将它们视为计算机内不同服务接收和发送数据的特定地址。每个端口由一个 0 到 65535 之间的数字标识。不同的服务通常使用特定的端口。例如,Web 服务器通常使用端口 80 进行 HTTP(超文本传输协议)通信,使用端口 443 进行 HTTPS(安全超文本传输协议)通信,HTTPS 是 HTTP 的更安全版本。用于安全远程访问计算机的 SSH(安全外壳协议)服务使用端口 22。

当一个服务在计算机上运行时,它会在一个或多个端口上“监听”传入的连接。这意味着它会等待数据到达特定端口,以便进行处理。端口扫描是检查计算机上哪些端口是“开放的”(有服务在监听)或“关闭的”(不接受连接)的过程。通过扫描端口,我们可以识别计算机上运行的服务,并有可能发现安全漏洞。

设置要扫描的服务

现在,让我们在你的本地机器上设置一个简单的服务,以便进行扫描。我们将使用 Python 的内置 HTTP 服务器,这是创建基本 Web 服务器的便捷方法。这个服务器将监听端口 8080。

首先,确保你位于项目目录中。项目目录是存储与本次实验相关的所有文件的地方。你可以使用以下命令导航到该目录:

cd /home/labex/project

现在,让我们创建一个简单的 HTML 文件,供我们的服务器托管。HTML(超文本标记语言)是创建网页的标准语言。以下命令将创建一个包含简单欢迎消息的 index.html 文件:

echo "<html><body><h1>Welcome to Port Scanning Lab</h1></body></html>" > index.html

接下来,我们将在端口 8080 上启动一个 Python HTTP 服务器。我们将在后台运行它,这样你就可以在服务器运行的同时继续进行实验。命令末尾的 & 符号告诉系统在后台运行该命令。

python3 -m http.server 8080 &

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

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

这意味着一个 Web 服务器现在正在你的机器上运行,并监听端口 8080。为了验证服务器是否正常工作,你可以打开一个新的终端并使用 curl 命令。curl 是一个用于从服务器传输数据或向服务器传输数据的工具。以下命令将向运行在你本地机器上端口 8080 的服务器发送一个请求:

curl http://localhost:8080

你应该会看到我们之前创建的 HTML 内容。这证实了我们的服务正在运行,并且可以进行扫描。

Nmap 与 TCP Connect 扫描简介

既然我们已经有一个服务在运行了,现在是时候探索 Nmap 并了解如何使用它进行端口扫描了。端口扫描是网络安全中的一项关键技术,因为它能帮助我们识别目标系统上的开放端口。开放端口可能是攻击者的潜在入口,因此了解哪些端口是开放的以及上面运行着哪些服务,对于保障网络安全至关重要。

什么是 Nmap?

Nmap 是 Network Mapper 的缩写,它是网络发现和安全审计领域最知名且功能强大的工具之一。它具备一系列对网络管理员和安全专业人员极为有用的功能。

  • 发现网络上的主机和服务:Nmap 可以帮助你找出哪些设备连接到了网络,以及它们提供了哪些服务。例如,它可以检测本地网络上是否有 Web 服务器、文件服务器或电子邮件服务器。
  • 识别目标系统上的开放端口:通过向目标系统的不同端口发送数据包,Nmap 可以确定哪些端口是开放的,并且准备好接受连接。
  • 确定这些端口上运行的服务:一旦识别出开放端口,Nmap 可以尝试确定该端口上运行的是什么服务。例如,如果端口 80 是开放的,很可能运行着一个 Web 服务器。
  • 检测操作系统和服务版本:Nmap 可以分析目标系统的响应,以推测其运行的操作系统和服务的版本。这些信息可用于识别潜在的漏洞。
  • 针对不同场景执行各种类型的扫描:根据你的需求,Nmap 可以执行不同类型的扫描,如 TCP Connect 扫描、SYN 扫描、UDP 扫描等。

理解 TCP Connect 扫描

TCP Connect 扫描是 TCP 扫描最基本的形式。要理解它的工作原理,我们首先需要了解 TCP 三次握手。TCP 三次握手是两个设备用于建立可靠连接的过程。它包括三个步骤:客户端向服务器发送一个 SYN(同步)数据包,服务器用一个 SYN - ACK(同步 - 确认)数据包进行响应,然后客户端发送一个 ACK(确认)数据包来完成连接。

以下是 TCP Connect 扫描的工作方式:

  1. Nmap 尝试与目标端口建立完整的 TCP 三次握手。它的行为就像一个普通的客户端尝试连接到目标系统上的服务。
  2. 如果连接成功,即握手的三个步骤都完成了,该端口将被标记为“开放”。这表明该端口上有一个服务正在监听并准备接受连接。
  3. 如果连接被拒绝,例如目标系统发送了一个 RST(重置)数据包,该端口将被标记为“关闭”。这意味着该端口上没有服务在监听。
  4. 如果目标系统没有响应,该端口将被标记为“过滤”。这通常意味着该端口可能被防火墙或其他安全机制阻止了。

需要注意的是,TCP Connect 扫描是可靠的,因为它会完全建立连接。然而,它的隐蔽性不强。由于它会创建一个真实的连接,会在目标系统上留下连接日志,这可能会引起系统管理员的警觉。

进行你的第一次 Nmap TCP Connect 扫描

让我们来扫描上一步中设置的服务。为此,我们要打开一个新的终端。终端是一个命令行界面,我们可以在其中输入命令与操作系统进行交互。

终端打开后,运行以下命令:

nmap -sT localhost -p 8080

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

  • nmap:这是我们正在使用的工具的名称。它告诉系统我们要运行 Nmap 程序。
  • -sT:这是一个标志,指定进行 TCP Connect 扫描。当 Nmap 看到这个标志时,它将对目标执行 TCP Connect 扫描。
  • localhost:这是我们要扫描的目标。在这种情况下,localhost 指的是我们自己的机器。这是在本地系统上测试扫描过程的一种方式。
  • -p 8080:这个选项指定了我们要扫描的端口。这里,我们正在扫描端口 8080。

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

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-20 12:34 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.04 seconds

输出显示了扫描的详细信息。它告诉我们 Nmap 已经启动,扫描的目标,主机是否在线,以及我们扫描的端口的状态。在这种情况下,端口 8080 被标记为“开放”,并且识别出运行在该端口上的服务是“http - proxy”。

现在,让我们将这个输出保存到一个文件中,以备后续参考。保存输出很有用,因为我们可以稍后查看它,或者与他人分享。为此,运行以下命令:

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

这个命令执行的 TCP Connect 扫描与之前相同。> 符号用于重定向命令的输出。输出不会显示在终端屏幕上,而是会被写入位于 /home/labex/project 目录下的一个名为 nmap_scan_output.txt 的文件中。

让我们查看文件的内容,以确认输出已正确保存。运行以下命令:

cat /home/labex/project/nmap_scan_output.txt

cat 命令用于显示文件的内容。运行此命令后,你应该会看到与之前相同的 Nmap 输出,现在已保存到文件中。

分析扫描结果并理解端口状态

既然我们已经成功完成了第一次扫描,现在是时候深入研究结果,理解每一项信息的含义了。这一步至关重要,因为它能帮助我们理解所收集的数据,并对目标系统得出有意义的结论。

理解 Nmap 中的端口状态

Nmap 是一款强大的网络扫描工具,它将端口分为六种不同的状态。每种状态都提供了关于目标系统上端口状态的有价值信息。

  1. open(开放):当一个端口被报告为“open”时,意味着有一个应用程序正在该端口上积极监听传入的连接。这表明有一个服务正在运行并准备好接受请求。
  2. closed(关闭):“closed”端口表示当前没有应用程序在该端口上监听。不过,该端口仍然可以访问,这意味着它将来有可能被某个服务使用。
  3. filtered(过滤):如果 Nmap 将一个端口报告为“filtered”,意味着它无法确定该端口是否开放。这通常是因为防火墙或其他安全措施阻止了对该端口的访问。
  4. unfiltered(未过滤):“unfiltered”端口表示 Nmap 可以访问该端口,但无法确定它是开放还是关闭的。这可能是由于各种因素造成的,例如目标系统的配置或网络状况。
  5. open|filtered(开放或过滤):当 Nmap 将一个端口报告为“open|filtered”时,意味着它无法确定该端口是开放还是被过滤了。在通过防火墙或其他安全设备进行扫描时,这是一个常见的结果。
  6. closed|filtered(关闭或过滤):“closed|filtered”端口表示 Nmap 无法确定该端口是关闭还是被过滤了。与“open|filtered”状态类似,这通常是由于安全措施阻止了对该端口的访问。

在我们的扫描结果中,端口 8080 被报告为“open”。这告诉我们,我们的 Python HTTP 服务器正在该端口上成功监听,并准备好接受传入的连接。

理解服务检测

你可能已经注意到,Nmap 将端口 8080 上的服务识别为“http - proxy”。Nmap 使用一个常见端口分配的数据库,对端口上可能运行的服务进行合理猜测。端口 8080 通常用于 HTTP 代理服务,所以 Nmap 根据其数据库做出了这样的假设。

然而,这种猜测并不总是准确的。要获得关于端口上运行的服务更精确的信息,你可以使用服务检测标志 (-sV)。这个标志告诉 Nmap 执行额外的检查,以确定确切的服务及其版本。

让我们尝试使用服务检测标志:

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

在这个命令中,-sT 指定进行 TCP 连接扫描,-sV 启用服务检测,localhost 是我们要扫描的目标,-p 8080 指定我们只扫描端口 8080,> /home/labex/project/nmap_service_output.txt 将输出重定向到一个文件。

现在,让我们查看输出:

cat /home/labex/project/nmap_service_output.txt

运行此命令后,你应该会看到关于端口 8080 上运行的服务的额外信息。它可能会将该服务识别为“Python http.server”或类似的内容,让你更准确地了解该端口上运行的是什么。

使用详细模式探索更多信息

如果你想更详细地了解 Nmap 在扫描过程中所做的操作,可以使用 -v 标志启用详细模式。详细模式会提供关于扫描过程的额外信息,包括发送和接收的数据包的详细信息、时间信息,以及 Nmap 确定端口状态所采取的具体步骤。

让我们尝试使用详细模式:

nmap -sT -v localhost -p 8080 > /home/labex/project/nmap_verbose_output.txt

在这个命令中,-sT 用于 TCP 连接扫描,-v 启用详细模式,localhost 是目标,-p 8080 指定要扫描的端口,> /home/labex/project/nmap_verbose_output.txt 将输出重定向到一个文件。

让我们查看输出:

cat /home/labex/project/nmap_verbose_output.txt

详细输出将让你更深入地了解扫描过程,帮助你理解 Nmap 是如何得出关于端口状态和目标系统上运行的服务的结论的。

拓展你的扫描知识

既然你已经掌握了 TCP Connect 扫描的基础知识,现在是时候将你的知识提升到一个新的水平了。在本节中,我们将学习如何扫描多个端口,并了解如何解读扫描结果。这将帮助你更全面地了解目标系统上运行的网络服务。

扫描常见端口

让我们从扫描本地机器(也称为 localhost)上最常见的端口开始。这些常见端口通常被知名的网络服务所使用。

nmap -sT localhost --top-ports 10 > /home/labex/project/common_ports_scan.txt

在这个命令中,-sT 选项告诉 Nmap 执行 TCP Connect 扫描。localhost 指定了目标,即你自己的机器。--top-ports 10 选项指示 Nmap 扫描 10 个最常用的端口。> 符号将扫描的输出重定向到 /home/labex/project 目录下一个名为 common_ports_scan.txt 的文件中。

现在,让我们看看这次扫描的结果:

cat /home/labex/project/common_ports_scan.txt

cat 命令用于显示文件的内容。当你运行这个命令时,你会看到一个端口列表。例如,端口 21 用于 FTP(文件传输协议),端口 22 用于 SSH(安全外壳协议),端口 23 用于 Telnet,端口 25 用于 SMTP(简单邮件传输协议),端口 80 用于 HTTP(超文本传输协议)。在你的系统上,这些端口中的大多数可能是关闭的,除非你运行了特定的服务。例如,如果我们在端口 8080 上运行的 HTTP 服务器在这 10 个最常用端口之列,它将显示为开放状态。

扫描端口范围

除了扫描常见端口,你还可以扫描特定的端口范围。让我们扫描本地机器上从 8000 到 8100 的端口。

nmap -sT localhost -p 8000-8100 > /home/labex/project/port_range_scan.txt

在这里,-p 8000 - 8100 选项告诉 Nmap 扫描从 8000 到 8100 的端口范围。这次扫描的输出被重定向到 /home/labex/project 目录下一个名为 port_range_scan.txt 的文件中。

要查看这次扫描的结果:

cat /home/labex/project/port_range_scan.txt

在输出中,你应该会看到端口 8080(如果它在扫描范围内)是开放的,而该范围内的其他端口可能是关闭的。

结合多种技术

让我们结合目前所学的技术。我们将执行一次 TCP Connect 扫描,并尝试检测从 8000 到 8100 端口范围内运行的服务。

nmap -sT -sV localhost -p 8000-8100 > /home/labex/project/combined_scan.txt

-sV 选项用于启用服务检测。这意味着 Nmap 不仅会告诉你一个端口是开放还是关闭,还会尝试识别开放端口上运行的服务。这次综合扫描的输出被保存到 /home/labex/project 目录下的 combined_scan.txt 文件中。

要查看结果:

cat /home/labex/project/combined_scan.txt

这次扫描提供了目前为止最详细的信息。它显示了指定范围内每个端口的状态,并尝试识别开放端口上运行的服务。

清理工作

在结束本次实验之前,我们需要停止一直在使用的 Python HTTP 服务器来进行清理。首先,我们需要找到服务器的进程 ID(PID)。

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

ps aux 命令列出了你系统上所有正在运行的进程。| 符号是一个管道,它将 ps aux 命令的输出传递给 grep 命令。grep 命令会搜索包含文本 "python3 -m http.server 8080" 的行,这是启动 Python HTTP 服务器的命令。

找到显示 Python HTTP 服务器进程的行。这一行的第二列包含进程 ID(PID)。记下 PID 后,你可以使用 kill 命令停止该进程。

kill <PID>

<PID> 替换为你找到的实际进程 ID。例如,如果 PID 是 1234,你将运行:

kill 1234

总结

在本次实验中,你学习了使用 Nmap 进行网络端口扫描的基础知识。你练习了设置用于扫描的服务、进行基本的 TCP Connect 扫描以及分析扫描结果。

你掌握的关键技能包括:理解网络端口及其扫描的重要性、设置简单的 HTTP 服务器、使用 Nmap 进行 TCP Connect 扫描、解读端口状态、使用 Nmap 选项获取详细信息、扫描多个端口和端口范围,以及识别开放端口上的服务。这些技能是网络侦察的基础,对网络管理和安全评估至关重要。随着你在网络安全领域的不断进步,你可以在这些基础上探索高级技术和安全实践。