使用 Nmap 检测服务 Banner

NmapNmapBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 Nmap 检测服务横幅。主要目标是收集有关目标机器上运行的网络服务的信息,例如服务名称、版本和操作系统。你将在目标 IP 上运行横幅脚本,扫描特定端口,增加扫描的详细程度,保存结果,并在 Xfce 终端中查看和比较横幅。

你将首先使用 nmap --script banner 命令扫描目标上的所有默认端口。然后,你将扫描特定端口,增加详细程度以获得更详细的输出,将结果保存到文件中,最后分析横幅以了解目标上运行的服务。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"]) nmap/NmapGroup -.-> nmap/output_formats("Output Formats") 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/verbosity("Verbosity Levels") nmap/NmapGroup -.-> nmap/os_version_detection("OS and Version Detection") nmap/NmapGroup -.-> nmap/service_detection("Service Detection") nmap/NmapGroup -.-> nmap/scripting_basics("Scripting Engine Basics") nmap/NmapGroup -.-> nmap/script_management("Script Categories and Updating") subgraph Lab Skills nmap/output_formats -.-> lab-547095{{"使用 Nmap 检测服务 Banner"}} nmap/save_output -.-> lab-547095{{"使用 Nmap 检测服务 Banner"}} nmap/port_scanning -.-> lab-547095{{"使用 Nmap 检测服务 Banner"}} nmap/target_specification -.-> lab-547095{{"使用 Nmap 检测服务 Banner"}} nmap/verbosity -.-> lab-547095{{"使用 Nmap 检测服务 Banner"}} nmap/os_version_detection -.-> lab-547095{{"使用 Nmap 检测服务 Banner"}} nmap/service_detection -.-> lab-547095{{"使用 Nmap 检测服务 Banner"}} nmap/scripting_basics -.-> lab-547095{{"使用 Nmap 检测服务 Banner"}} nmap/script_management -.-> lab-547095{{"使用 Nmap 检测服务 Banner"}} end

在这一步中,我们将使用 Nmap 的横幅抓取脚本识别目标机器上运行的服务。横幅抓取是一种通过检查建立连接时网络服务发送的横幅来收集有关该服务信息的技术。此横幅通常包含服务名称、版本和操作系统等详细信息。

首先,让我们了解一下我们将使用的命令:

nmap --script banner 192.168.1.1

  • nmap:这是命令行网络扫描器。
  • --script banner:此选项告诉 Nmap 使用 banner 脚本,该脚本旨在从开放端口抓取横幅。
  • 192.168.1.1:这是目标 IP 地址。你需要将其替换为你有权扫描的网络中某台机器的实际 IP 地址。对于本实验环境,我们将使用 127.0.0.1(localhost)作为目标。这可确保你正在扫描自己的机器,并避免任何潜在的道德或法律问题。

现在,让我们执行该命令。打开你的 Xfce 终端并输入以下内容:

nmap --script banner 127.0.0.1

此命令将扫描 127.0.0.1 上的所有默认端口,并尝试从任何开放服务中抓取横幅。

你可能会看到类似以下的输出(确切输出将取决于你机器上运行的服务):

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:00 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000072s latency).
Other addresses for localhost (alias(es)): localhost

PORT   STATE SERVICE
22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_

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

在此示例中,Nmap 在端口 22 上发现了一个 SSH 服务。横幅显示它是在 Ubuntu 上运行的 OpenSSH 8.2p1 版本。

如果你机器上没有运行任何服务,你可能看不到任何横幅信息。别担心,命令仍在正常工作。在后续步骤中,我们将配置服务以确保有横幅可供捕获。

在上一步中,我们使用横幅脚本扫描了所有默认端口。现在,我们将专注于扫描特定端口。当你知道自己感兴趣的服务,或者想要缩短扫描时间时,这会很有用。

我们将使用的命令是:

nmap --script banner -p 22,80 127.0.0.1

让我们来分析一下这个命令:

  • nmap:网络扫描器。
  • --script banner:指定横幅抓取脚本。
  • -p 22,80:此选项告诉 Nmap 仅扫描端口 22 和 80。端口 22 通常用于 SSH(安全外壳协议),端口 80 通常用于 HTTP(网络服务器)。
  • 127.0.0.1:目标 IP 地址(localhost)。

在运行命令之前,让我们确保这些端口上运行着服务。LabEx VM 默认情况下应该在端口 22 上运行 SSH。我们将在端口 80 上安装一个简单的网络服务器。

打开你的 Xfce 终端并运行以下命令,使用 Python 安装一个基本的 HTTP 服务器:

sudo apt update
sudo apt install -y python3-pip
sudo python3 -m pip install http.server

现在,在端口 80 上启动 HTTP 服务器。首先导航到你的 ~/project 目录。

cd ~/project
python3 -m http.server 80

保持这个终端窗口打开并运行 HTTP 服务器。打开一个新的 Xfce 终端窗口以继续进行 Nmap 扫描。

现在,在新的终端窗口中,执行 Nmap 命令:

nmap --script banner -p 22,80 127.0.0.1

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

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:05 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000072s latency).
Other addresses for localhost (alias(es)): localhost

PORT   STATE SERVICE
22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_
80/tcp open  http
| banner: Server: SimpleHTTP/3.10 Python/3.10
|_

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

此输出表明 Nmap 扫描了端口 22 和 80,抓取了横幅,并显示了服务信息。你可以看到 SSH 横幅和 SimpleHTTP 服务器横幅。

完成此步骤后,记得在运行 Python HTTP 服务器的终端中按 Ctrl+C 停止它。

在这一步中,我们将为 Nmap 扫描添加详细输出。详细输出会提供有关扫描过程的更多详细信息,这有助于故障排除或了解 Nmap 在幕后的操作。

我们将使用的命令是:

nmap -v --script banner 127.0.0.1

让我们来分析一下这个命令:

  • nmap:网络扫描器。
  • -v:此选项会增加详细程度。你可以使用 -vv 以获得更高的详细程度。
  • --script banner:指定横幅抓取脚本。
  • 127.0.0.1:目标 IP 地址(localhost)。

在运行命令之前,请确保上一步中的 Python HTTP 服务器仍在运行。如果没有,请在单独的终端窗口中再次启动它:

cd ~/project
python3 -m http.server 80

现在,在一个新的终端窗口中,执行带有详细输出的 Nmap 命令:

nmap -v --script banner 127.0.0.1

你应该会看到类似以下的输出(确切输出将取决于你机器上运行的服务):

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:10 UTC
Initiating Ping Scan at 10:10
Scanning localhost (127.0.0.1) [2 ports]
Completed Ping Scan at 10:10, 0.00s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 10:10
Completed Parallel DNS resolution of 1 host. at 10:10, 0.00s elapsed
Initiating Connect Scan at 10:10
Scanning localhost (127.0.0.1) [1000 ports]
Discovered open port 22/tcp on 127.0.0.1
Discovered open port 80/tcp on 127.0.0.1
Completed Connect Scan at 10:10, 0.00s elapsed (1000 total ports)
Initiating Service scan at 10:10
Scanning 2 services on localhost (127.0.0.1)
Completed Service scan at 10:10, 0.01s elapsed (2 services total)
Initiating NSE script scan at 10:10
Scanning localhost (127.0.0.1)
Completed NSE script scan at 10:10, 0.09s elapsed
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000072s latency).
Other addresses for localhost (alias(es)): localhost

PORT   STATE SERVICE
22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_
80/tcp open  http
| banner: Server: SimpleHTTP/3.10 Python/3.10
|_

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds

请注意 -v 选项提供的额外信息。你可以看到扫描的不同阶段,例如 Ping 扫描、DNS 解析和连接扫描。这对于理解 Nmap 的工作原理以及诊断任何问题非常有用。

完成此步骤后,记得在运行 Python HTTP 服务器的终端中按 Ctrl+C 停止它。

在这一步中,我们将把 Nmap 扫描的结果保存到一个文件中。这对于后续分析或报告目的很有用。

我们将使用的命令是:

nmap --script banner -oN banners.txt 127.0.0.1

让我们来分析一下这个命令:

  • nmap:网络扫描器。
  • --script banner:指定横幅抓取脚本。
  • -oN banners.txt:此选项告诉 Nmap 将结果以“正常”格式保存到名为 banners.txt 的文件中。还有其他输出格式可用(例如,-oG 用于可用于 Grep 的输出,-oX 用于 XML 输出),但 -oN 是一种人类可读的格式。
  • 127.0.0.1:目标 IP 地址(localhost)。

在运行命令之前,请确保上一步中的 Python HTTP 服务器仍在运行。如果没有,请在单独的终端窗口中再次启动它:

cd ~/project
python3 -m http.server 80

现在,在一个新的终端窗口中,执行 Nmap 命令以将结果保存到文件:

nmap --script banner -oN banners.txt 127.0.0.1

这次你不会看到扫描结果打印到终端上。相反,Nmap 会将输出保存到你当前目录(~/project)中的 banners.txt 文件中。

要验证文件是否已创建并包含扫描结果,你可以使用 cat 命令:

cat banners.txt

你应该会在终端中看到类似以下的输出:

## Nmap 7.80 scan initiated Fri Oct 27 10:15:00 2023
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000072s latency).
Other addresses for localhost (alias(es)): localhost

PORT   STATE SERVICE
22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_
80/tcp open  http
| banner: Server: SimpleHTTP/3.10 Python/3.10
|_

## Nmap done at Fri Oct 27 10:15:00 2023 -- 1 IP address (1 host up) scanned in 0.10 seconds

这确认了扫描结果已保存到 banners.txt 文件中。

完成此步骤后,记得在运行 Python HTTP 服务器的终端中按 Ctrl+C 停止它。

在 Xfce 终端中查看横幅详细信息

在这一步中,我们将查看上一步保存在 banners.txt 文件中的横幅详细信息。我们将使用 Xfce 终端来查看文件内容并了解其中包含的信息。

首先,确保你的 ~/project 目录中有 banners.txt 文件。如果你尚未完成上一步,请在继续之前完成。

要查看 banners.txt 文件的内容,打开一个终端窗口并使用 cat 命令:

cat banners.txt

输出将显示文件的内容,应该类似于此:

## Nmap 7.80 scan initiated Fri Oct 27 10:20:00 2023
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000072s latency).
Other addresses for localhost (alias(es)): localhost

PORT   STATE SERVICE
22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_
80/tcp open  http
| banner: Server: SimpleHTTP/3.10 Python/3.10
|_

## Nmap done at Fri Oct 27 10:20:00 2023 -- 1 IP address (1 host up) scanned in 0.10 seconds

让我们分析一下输出:

  • Nmap scan report for localhost (127.0.0.1):这表明扫描是在本地主机(127.0.0.1)上执行的。
  • Host is up:这确认目标主机是可达的。
  • PORT STATE SERVICE:此部分提供有关目标主机上开放端口的信息。
  • 22/tcp open ssh:这表明端口 22 开放并运行 SSH 服务。
  • | banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5:这是 SSH 服务的横幅信息。它揭示了 SSH 版本和操作系统。
  • 80/tcp open http:这表明端口 80 开放并运行 HTTP 服务。
  • | banner: Server: SimpleHTTP/3.10 Python/3.10:这是 HTTP 服务的横幅信息。它揭示了服务器软件和版本。

通过查看横幅详细信息,你可以获得有关目标主机上运行的服务的有价值信息。此信息可用于漏洞分析或识别潜在的安全风险。

完成此步骤后,记得在运行 Python HTTP 服务器的终端中按 Ctrl+C 停止它。

在 Xfce 终端中比较不同端口的横幅

在这一步中,我们将比较从不同端口获取的横幅信息。这有助于我们识别在这些端口上运行的服务并了解其版本。我们将使用 Xfce 终端和 grep 命令从 banners.txt 文件中提取并比较横幅信息。

首先,确保你的 ~/project 目录中有 banners.txt 文件,该文件包含上一步的 Nmap 扫描结果。

要提取端口 22(SSH)的横幅信息,使用以下命令:

grep "22/tcp" banners.txt

这将输出包含端口 22 信息的行,包括横幅:

22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_

同样,要提取端口 80(HTTP)的横幅信息,使用以下命令:

grep "80/tcp" banners.txt

这将输出包含端口 80 信息的行,包括横幅:

80/tcp open  http
| banner: Server: SimpleHTTP/3.10 Python/3.10
|_

现在,让我们比较横幅信息。我们可以看到:

  • 端口 22 运行 SSH,横幅显示它是 Ubuntu 上的 OpenSSH 8.2p1 版本。
  • 端口 80 运行 HTTP,横幅显示它是用 Python 3.10 实现的 SimpleHTTP 服务器。

通过比较横幅信息,我们可以快速识别在这些端口上运行的服务及其版本。此信息对于安全评估和漏洞分析很有价值。例如,了解 SSH 或 HTTP 服务器的特定版本使我们能够检查与这些版本相关的已知漏洞。

在这个简单的例子中,我们只比较了两个端口。但是,你可以扩展此技术以比较许多不同端口和主机的横幅,以全面了解你环境中运行的网络服务。

完成此步骤后,记得在运行 Python HTTP 服务器的终端中按 Ctrl+C 停止它。

总结

在这个实验中,参与者学习使用 Nmap 来检测服务横幅。他们首先通过在目标 IP 上运行 nmap --script banner 来运行横幅脚本,使用 127.0.0.1 以避免道德和法律问题。他们还学习扫描特定端口、增加扫描的详细程度并将结果保存到文件中。最后,他们在 Xfce 终端中查看和比较横幅详细信息。