简介
在网络安全和系统管理领域,仅仅知道某个端口是开放的还远远不够。默认情况下,端口扫描器会根据标准端口号来猜测运行的服务(例如,假设 80 端口总是运行 HTTP Web 服务器)。然而,管理员可以在任何端口上运行任何服务。
这就是为什么横幅(Banner)和版本检测至关重要。端口号只是线索,而非证据。在实际环境中,经常会使用自定义端口、反向代理、容器前端或具有误导性的服务名称。
为了准确识别目标系统上真正运行的内容,你需要对开放端口进行探测。在本实验中,你将探索 Nmap 的版本检测功能。你将学习如何获取服务横幅,并准确识别软件名称和版本号,这是漏洞评估中的关键一步。
启用版本检测
在这一步中,你将学习 Nmap 版本检测的基础知识。默认情况下,Nmap 只会根据静态查找表告诉你端口是否开放以及该端口通常运行什么服务。要找出究竟是什么软件在监听,你需要主动对服务进行探测。
你可以通过在 Nmap 命令中添加 -sV 参数来启用版本检测。这会指示 Nmap 向开放端口发送一系列特定的探测包,并分析响应以确定服务及其版本。
换句话说,Nmap 不再仅仅根据端口号进行推断,而是开始直接探测应用程序的行为。
在终端中运行以下命令,扫描你的本地机器并检测运行服务的版本:
nmap -sV -p 80,8080 localhost
你将看到类似以下的输出:
Starting Nmap 7.80 ( https://nmap.org )
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000010s latency).
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.18.0 (Ubuntu)
8080/tcp open http SimpleHTTPServer 0.6 (Python 3.10.12)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.51 seconds
注意输出中的 VERSION 列。Nmap 没有仅仅猜测 80 端口是 HTTP 服务,而是主动与该端口通信,并发现它运行的是 Nginx 1.18.0 版本。它还成功识别出 8080 端口上运行着一个 Python HTTP 服务器。
调整版本检测强度
在这一步中,你将学习如何控制 Nmap 版本检测的激进程度。Nmap 使用 0 到 9 的等级来决定向目标服务发送多少探测包。
默认强度为 7。强度越高,意味着 Nmap 会尝试更多的探测包,这增加了正确识别服务的几率,但会花费更多时间。较低的强度速度更快,但可能无法识别一些冷门服务。你可以使用 --version-intensity 参数后跟 0 到 9 之间的数字来调整此设置。
这是速度与准确性之间的权衡。目标看起来越不确定或越不寻常,进行深度探测的价值就越高。
让我们通过将强度设置为 9 来尝试一次高度激进的扫描。这会强制 Nmap 对开放端口尝试其数据库中的每一个探测包。运行以下命令:
nmap -sV -p 80,8080 --version-intensity 9 localhost
输出看起来与上一步类似,但在后台,Nmap 的探测过程要彻底得多:
Starting Nmap 7.80 ( https://nmap.org )
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000012s latency).
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.18.0 (Ubuntu)
8080/tcp open http SimpleHTTPServer 0.6 (Python 3.10.12)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
你也可以使用 --version-light 参数作为强度 2 的快捷方式,或使用 --version-all 作为强度 9 的快捷方式。这些快捷方式让你无需记住具体数字即可轻松调整扫描行为。
识别软件精确版本
在这一步中,你将专注于识别特定服务的精确软件版本,并将结果保存以供记录。在进行安全评估时,保留精确的软件版本记录对于查找已知漏洞至关重要。
你可以使用 -p 参数指定特定端口,并使用 -oN 参数将输出保存到文件中,而不是扫描所有端口。当你想要隔离特定服务并与团队共享发现结果时,这非常有用。
运行以下命令仅扫描 80 端口,检测其版本,并将输出保存到当前目录下名为 version_scan.txt 的文件中:
nmap -sV -p 80 localhost -oN version_scan.txt
扫描完成后,你可以使用 cat 命令查看保存文件的内容:
cat version_scan.txt
你的输出应该显示 80 端口上运行的 Nginx 服务器的精确版本:
## Nmap 7.80 scan initiated ...
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000015s latency).
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
## Nmap done at ...
通过记录精确版本(例如 nginx 1.18.0),你现在可以搜索漏洞数据库,查看该特定版本是否存在任何已知的安全缺陷。
总结
在本实验中,你探索了 Nmap 强大的版本检测功能。你学习了如何使用 -sV 参数超越简单的端口扫描,主动探测服务以发现其精确的软件名称和版本。你还学习了如何使用 --version-intensity 调整扫描强度以平衡速度与准确性,以及如何针对特定端口进行扫描并将结果保存以供漏洞分析使用。这些技能对于准确的网络映射和安全审计至关重要。



