简介
在本次实验中,你将学习使用 Nmap 进行网络端口扫描的基础知识。Nmap 是一款强大的开源网络扫描工具,深受网络安全专业人士的青睐。端口扫描是网络管理员和安全分析师发现目标系统上开放端口和服务的关键技术。
你将学习执行基本的 TCP Connect 扫描,这是一种常见且可靠的扫描方法。这种方法会与目标端口建立完整的 TCP 连接,以检查其状态。在本次实验结束时,你将能够识别网络上开放的服务,这是进行网络安全评估和系统加固的关键第一步。
在本次实验中,你将学习使用 Nmap 进行网络端口扫描的基础知识。Nmap 是一款强大的开源网络扫描工具,深受网络安全专业人士的青睐。端口扫描是网络管理员和安全分析师发现目标系统上开放端口和服务的关键技术。
你将学习执行基本的 TCP Connect 扫描,这是一种常见且可靠的扫描方法。这种方法会与目标端口建立完整的 TCP 连接,以检查其状态。在本次实验结束时,你将能够识别网络上开放的服务,这是进行网络安全评估和系统加固的关键第一步。
在开始学习扫描之前,了解什么是网络端口以及它们在网络安全领域为何重要至关重要。网络端口在允许不同服务通过网络进行通信方面起着至关重要的作用。它们就像数据进出计算机的“门”。
网络端口是计算机网络上用于通信的虚拟端点。可以将它们视为计算机内不同服务接收和发送数据的特定地址。每个端口由一个 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 并了解如何使用它进行端口扫描了。端口扫描是网络安全中的一项关键技术,因为它能帮助我们识别目标系统上的开放端口。开放端口可能是攻击者的潜在入口,因此了解哪些端口是开放的以及上面运行着哪些服务,对于保障网络安全至关重要。
Nmap 是 Network Mapper 的缩写,它是网络发现和安全审计领域最知名且功能强大的工具之一。它具备一系列对网络管理员和安全专业人员极为有用的功能。
TCP Connect 扫描是 TCP 扫描最基本的形式。要理解它的工作原理,我们首先需要了解 TCP 三次握手。TCP 三次握手是两个设备用于建立可靠连接的过程。它包括三个步骤:客户端向服务器发送一个 SYN(同步)数据包,服务器用一个 SYN - ACK(同步 - 确认)数据包进行响应,然后客户端发送一个 ACK(确认)数据包来完成连接。
以下是 TCP Connect 扫描的工作方式:
需要注意的是,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 是一款强大的网络扫描工具,它将端口分为六种不同的状态。每种状态都提供了关于目标系统上端口状态的有价值信息。
在我们的扫描结果中,端口 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 选项获取详细信息、扫描多个端口和端口范围,以及识别开放端口上的服务。这些技能是网络侦察的基础,对网络管理和安全评估至关重要。随着你在网络安全领域的不断进步,你可以在这些基础上探索高级技术和安全实践。