简介
在本实验中,你将学习 Nmap SYN 扫描,这是网络安全中用于隐蔽端口侦察的一项关键技术。SYN 扫描无需完全建立 TCP 连接即可高效识别目标系统上的开放端口,因此比传统方法更难被检测到。这对于安全专业人员评估网络漏洞和加强防御至关重要。
完成本实验后,你将了解如何进行 SYN 扫描、解读扫描结果,并认识到它们在网络安全评估中的重要性。
创建用于扫描的目标服务
在这一步中,我们将创建一个受控环境,以便你练习 Nmap SYN 扫描。在开始扫描任何网络或系统之前,必须明确一点:合乎道德的扫描需要获得适当的授权。为了避免任何法律问题,我们将设置一个可以安全扫描的自有服务。
首先,你需要打开终端。终端是一个基于文本的界面,允许你通过输入命令与计算机的操作系统进行交互。打开终端后,导航到你的项目目录。项目目录是存储与本实验相关的所有文件的地方。使用以下命令将当前目录更改为项目目录:
cd /home/labex/project现在,我们将使用流行的编程语言 Python 创建一个简单的 HTTP 服务器。HTTP 服务器是一种可以向客户端(如 Web 浏览器)提供网页的软件。Python 内置了易于设置此类服务器的功能。我们将使用该服务器作为 Nmap SYN 扫描的目标。在终端中运行以下命令:
python -m http.server --bind 127.0.0.1 8080 &此命令在 8080 端口启动一个简单的 Web 服务器,并将其绑定到 IPv4 回环地址
127.0.0.1。端口是计算机网络中的通信端点。不同的服务使用不同的端口进行通信。使用明确的 IPv4 地址可以将服务器和后续的 Nmap 扫描保持在同一个回环接口上。命令末尾的&会在后台运行服务器。这意味着服务器将持续运行,你可以继续使用同一个终端窗口执行其他命令。启动服务器后,我们需要验证它是否确实在运行。我们可以通过检查系统上打开的网络连接来做到这一点。
ss命令是一个可以显示套接字统计信息的工具,其中包括有关打开的网络连接的信息。我们将使用它来检查服务器是否正在监听 8080 端口。运行以下命令:ss -tulwn | grep 8080|是管道操作符,它将ss命令的输出作为grep命令的输入。grep命令在ss命令的输出中搜索字符串8080。如果服务器正在运行,你应该看到类似以下的输出:tcp LISTEN 0 5 127.0.0.1:8080 0.0.0.0:*此输出表明服务器正在监听 8080 端口,这意味着它已成功运行并准备好被扫描。
理解并执行 Nmap SYN 扫描
现在我们已经有了运行中的目标服务,是时候深入了解 SYN 扫描了。SYN 扫描是网络安全测试的重要组成部分,使我们能够发现目标系统上的开放端口。在本节中,我们将了解 SYN 扫描的工作原理,然后使用强大的网络扫描工具 Nmap 对我们的 HTTP 服务器执行 SYN 扫描。
什么是 SYN 扫描?
在开始实际扫描之前,了解 SYN 扫描的底层机制至关重要。为此,我们先来看看正常的 TCP 连接是如何建立的。
正常的 TCP 连接
在正常的 TCP 连接中,会进行“三次握手”。这是在客户端和服务器之间建立可靠连接的基本过程:
- 步骤 1:客户端发送 SYN 数据包 客户端通过向服务器发送 SYN(同步)数据包来发起连接。此数据包就像是一个开始对话的请求,询问服务器是否准备好进行通信。
- 步骤 2:服务器响应 SYN-ACK 数据包 收到 SYN 数据包后,如果服务器可用且愿意通信,它会响应一个 SYN-ACK(同步-确认)数据包。此数据包确认了客户端的请求,并表明服务器已准备好建立连接。
- 步骤 3:客户端发送 ACK 数据包 最后,客户端发送一个 ACK(确认)数据包来完成三次握手。此步骤完成后,TCP 连接即完全建立,数据可以在客户端和服务器之间交换。
SYN 扫描过程
另一方面,SYN 扫描采用不同的方法:
- 步骤 1:Nmap 发送 SYN 数据包 我们的扫描工具 Nmap 向目标端口发送初始 SYN 数据包。这类似于正常 TCP 连接的第一步。
- 步骤 2:目标响应 SYN-ACK 数据包 如果目标端口是开放的,它会像正常 TCP 连接一样响应 SYN-ACK 数据包。
- 步骤 3:Nmap 终止连接 Nmap 不会发送最终的 ACK 数据包来完成握手,而是直接终止连接。这使得扫描更难被检测到,因为从未建立完整的连接。此外,它比全连接扫描(Connect Scan)更快,因为全连接扫描需要为每个被扫描的端口完成整个三次握手。
执行 SYN 扫描
步骤 1:导航到项目目录
首先,我们需要确保处于正确的项目目录中。这一点很重要,因为我们将把扫描结果保存在该目录下的一个文件中。要导航到项目目录,请在终端中运行以下命令:
cd /home/labex/project
步骤 2:执行 SYN 扫描
现在,我们准备使用 Nmap 执行 SYN 扫描。在终端中运行以下命令:
sudo nmap -sS 127.0.0.1 -p 8080 > /home/labex/project/nmap-syn-scan-results.txt
让我们分解此命令以了解每个部分的作用:
sudo:此命令用于以提升的权限运行后续命令。SYN 扫描需要 root 权限,因为它涉及发送原始网络数据包,因此我们需要使用sudo来执行nmap命令。nmap:这是我们正在使用的网络扫描工具。Nmap 被广泛用于网络探测和安全审计。-sS:此选项指定我们要执行 SYN 扫描。127.0.0.1:这是我们自己机器的 IPv4 回环地址。使用明确的 IPv4 地址可以使扫描与我们在步骤 1 中启动的 HTTP 服务器保持一致。-p 8080:此选项告诉 Nmap 仅扫描 8080 端口。我们有兴趣检查本地机器上的这个特定端口是否开放。> /home/labex/project/nmap-syn-scan-results.txt:命令的这一部分将nmap扫描的输出重定向到项目目录中名为nmap-syn-scan-results.txt的文件中。这样,我们稍后可以查看结果。
步骤 3:查看扫描结果
扫描完成后,我们可以查看结果。在终端中运行以下命令:
cat /home/labex/project/nmap-syn-scan-results.txt
你应该看到类似以下的输出:
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-18 12:00 UTC
Nmap scan report for 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.03 seconds
此输出提供了有价值的信息。它确认了本地机器上的 8080 端口是开放的,并且正在运行 HTTP 服务。这些信息可用于进一步的安全分析或网络故障排除。
分析扫描结果与安全影响
执行 SYN 扫描后,理解如何解读结果及其安全影响至关重要。这一步非常重要,因为它能帮助你识别网络中的潜在风险。让我们深入了解细节。
解读扫描结果
首先,让我们仔细看看扫描结果。我们将使用
cat命令查看存储 Nmap SYN 扫描结果的文件内容。cat命令是在终端中显示文件内容的简单方法。cat /home/labex/project/nmap-syn-scan-results.txt运行此命令时,你将看到输出。以下是输出中各部分的含义:
Host is up:此消息表明目标主机在网络上是可达的。如果主机处于开启状态,意味着你的扫描能够与目标进行通信。- 延迟值(latency):这显示了目标对你的扫描响应的速度。较低的延迟意味着目标响应更快。
8080/tcp open:这表明目标主机上的 8080 端口是开放的,并准备好接受传入连接。开放的端口可能是攻击者的潜在切入点。http-proxy:这是 Nmap 对 8080 端口上运行的服务所做的猜测。Nmap 会根据扫描期间收到的响应尝试识别服务。
在现实世界的安全评估中,目标主机上的每个开放端口都代表了几件事:
- 攻击者的潜在切入点:攻击者可以利用开放端口访问目标系统。例如,如果 Web 服务器在开放端口上运行,攻击者可能会尝试利用 Web 应用程序中的漏洞。
- 可能存在漏洞的服务:在开放端口上运行的每个服务都有可能存在安全缺陷。攻击者可以利用这些漏洞来破坏系统。
- 需要保护的攻击面的一部分:攻击面是攻击者可以尝试进入系统的所有点的总和。开放端口是此攻击面的一部分,需要妥善保护。
安全最佳实践
在保护网络时,你应该遵循以下最佳实践:
- 仅开放必要的端口:开放不必要的端口会增加网络的攻击面。通过关闭未使用的端口,可以减少攻击者的潜在切入点。
- 每个开放端口都应服务于合法的业务目的:如果一个端口是开放的,它应该有正当理由,例如运行 Web 服务器或数据库服务。这有助于确保你的网络得到高效且安全的使用。
- 所有服务都应保持更新以防止被利用:软件供应商会定期发布更新以修复安全漏洞。通过保持服务处于最新状态,你可以保护网络免受已知威胁。
- 防火墙规则应限制对敏感端口的访问:防火墙可用于控制谁可以访问网络上的特定端口。通过设置适当的防火墙规则,你可以将对敏感端口的访问限制为仅限授权用户或系统。
清理环境
现在,我们需要通过停止之前启动的 HTTP 服务器来清理环境。首先,我们需要确定 HTTP 服务器的进程 ID (PID)。PID 是分配给系统上每个运行进程的唯一编号。我们将使用
ps aux命令列出所有正在运行的进程,然后过滤结果以找到 HTTP 服务器进程。ps aux | grep "http.server" | grep -v grep运行此命令时,你将看到类似以下的输出:
labex 1234 0.0 0.1 31116 3164 pts/0 S 12:00 0:00 python -m http.server --bind 127.0.0.1 8080输出的第二列显示了 HTTP 服务器进程的 PID。
接下来,我们将使用 PID 停止服务器。我们将使用
kill命令,它会向进程发送终止信号。以下命令会自动查找并终止 HTTP 服务器进程:kill $(ps aux | grep "http.server" | grep -v grep | awk '{print $2}')此命令首先使用与之前相同的过滤方法找到 HTTP 服务器进程的 PID,然后将 PID 传递给
kill命令。最后,我们需要验证服务器是否已停止。我们将使用
ss命令来显示套接字统计信息。通过过滤输出以仅显示有关 8080 端口的信息,我们可以检查服务器是否仍在运行。ss -tulwn | grep 8080如果服务器已成功停止,此命令将不会有任何输出,表明服务器不再监听 8080 端口。
总结
在本实验中,你学习了如何执行和理解 Nmap SYN 扫描,这是网络安全侦察中的一项关键技术。你使用 Python HTTP 服务器搭建了一个受控环境,执行了 SYN 扫描以查找开放端口,分析了结果,并清理了测试环境。这些技能对于合乎道德的网络扫描和漏洞评估至关重要。
理解 SYN 扫描使安全专业人员能够高效地检测潜在的网络漏洞,同时降低被检测到的风险。随着你在网络安全之旅中的进步,请务必确保在应用这些技术之前已获得扫描网络的许可。



