学习 Nmap 基础扫描技术

NmapBeginner
立即练习

介绍

在本次实验中,你将了解 Nmap,这是一款用于网络发现和安全审计的重要工具。Nmap 被网络管理员和安全专家广泛使用,它有助于识别开放端口、检测正在运行的服务,并发现潜在的网络漏洞。

在本次实验中,你还将学习基本的 Nmap 扫描技术。通过扫描了解网络配置是一项基本的网络安全技能。完成本实验后,你将能够运行基本的 Nmap 扫描并解读其输出结果,为高级网络安全任务奠定坚实的基础。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 96%。获得了学习者 95% 的好评率。

设置用于扫描的 Web 服务器

在这一步中,我们将使用 Docker 搭建一个简单的 Web 服务器。Docker 是一个强大的平台,它允许你将应用程序及其所有依赖项打包成称为容器的标准化单元。这些容器可以轻松地部署和运行在不同的系统上。通过搭建这个 Web 服务器,我们将在后续步骤中有一个可供 Nmap 扫描的目标。

1. 导航到工作目录

首先,打开一个终端窗口。终端是一个命令行界面,你可以在其中输入命令与系统进行交互。终端打开后,你需要导航到项目目录。这个目录将作为本次实验的工作区域。

要导航到项目目录,请使用 cd 命令。cd 命令代表“更改目录”。你需要运行以下命令:

cd /home/labex/project

2. 创建 Dockerfile

Dockerfile 是构建 Docker 镜像的关键部分。它是一个文本文件,包含一系列 Docker 用于构建镜像的命令。在这种情况下,我们将为基于 Nginx(一种流行的 Web 服务器软件)的简单 Web 服务器创建一个 Dockerfile。

要创建一个名为 Dockerfile 的新文件,我们将使用 nano 文本编辑器。nano 是一个简单且用户友好的文本编辑器,你可以直接在终端中使用。运行以下命令:

nano Dockerfile

运行此命令后,nano 编辑器将打开,你可以开始向 Dockerfile 中添加内容。在文件中添加以下行:

## Use the nginx image as the base
FROM nginx

## Expose port 80
EXPOSE 80

FROM 命令告诉 Docker 使用 nginx 镜像作为我们新镜像的基础。EXPOSE 命令表示容器将监听端口 80。

要保存文件,请按 Ctrl+O 然后按 Enter。要退出编辑器,请按 Ctrl+X

3. 构建 Docker 镜像

现在我们的 Dockerfile 已经准备好,我们可以构建 Docker 镜像了。镜像是一个蓝图,包含运行应用程序所需的所有必要文件和配置。

要构建镜像,请运行以下命令:

docker build -t cyber-seed-portal .

在这个命令中,-t 标志用于为镜像打标签。我们将我们的镜像标记为 "cyber - seed - portal"。命令末尾的 . 告诉 Docker 使用当前目录作为构建上下文。

当你运行此命令时,Docker 将开始构建过程,输出将类似于以下内容:

Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
latest: Pulling from library/nginx
a803e7c4b030: Pull complete
8b625c47d697: Pull complete
4d3239651a63: Pull complete
0f816efa513d: Pull complete
01d159b8db2f: Pull complete
5fb9a81470f3: Pull complete
Digest: sha256:32da30332506740a2f7c34d5dc70467b7dfe6c23451f6c66c84eeb3cdadab213
Status: Downloaded newer image for nginx:latest
 ---> 61395b4c586d
Step 2/2 : EXPOSE 80
 ---> Running in 1c2d5e2a8e7f
Removing intermediate container 1c2d5e2a8e7f
 ---> 7683abcf62b0
Successfully built 7683abcf62b0
Successfully tagged cyber-seed-portal:latest

4. 运行 Docker 容器

镜像构建完成后,我们可以从它创建并运行一个容器。容器是镜像的运行实例。

要运行容器,请使用以下命令:

docker run --name cyber-seed-server -d -p 8080:80 cyber-seed-portal

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

  • --name cyber-seed-server:这为容器命名为 "cyber - seed - server"。为容器命名便于管理和识别。
  • -d:这将容器以分离模式运行,这意味着容器将在后台运行,你可以继续使用终端进行其他任务。
  • -p 8080:80:这将你机器的端口 8080 映射到容器的端口 80。因此,当你访问你机器上的端口 8080 时,它将被重定向到容器内的端口 80。
  • cyber-seed-portal:这指定了容器所基于的镜像。

当你运行此命令时,输出将是一个容器 ID,类似于:

3a7b1a23c3c5d17b3e4b3e5e6f7g8h9i

你现在已经成功搭建了一个在 Docker 容器中运行的 Web 服务器。你可以通过 http://localhost:8080 访问这个服务器。这个服务器将是你后续步骤中 Nmap 扫描的目标。

使用 Nmap 发现开放端口

在这一步中,我们将使用 Nmap 来找出本地机器上哪些端口是开放的。了解开放端口是网络安全中一项基础但至关重要的技能。端口就像是网络中计算机的门。每个端口都可以被不同的服务使用,知道哪些端口是开放的有助于我们了解网络上哪些服务是可访问的。

了解 Nmap

Nmap 即网络映射器(Network Mapper),是一款免费的开源工具。它主要用于网络发现和安全审计。可以把它想象成你网络的侦探。系统和网络管理员经常使用 Nmap 来跟踪网络上的情况、规划服务升级时间,以及检查主机或服务是否正常运行。

扫描开放端口

现在,我们将使用 Nmap 扫描你的本地主机(IP 地址为 127.0.0.1)以查找开放端口。Nmap 中的 -p- 选项就像是告诉它检查你计算机上的每一扇可能的“门”(端口)。总共有 65535 个 TCP 端口,这个选项会让 Nmap 对它们全部进行检查。

在你的终端中运行以下命令:

nmap -p- localhost

这个命令需要一些时间才能完成,因为它要扫描大量的端口。完成后,输出结果大致如下:

Starting Nmap 7.80  at 2024-03-15 10:59 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).
Not shown: 65529 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
3000/tcp  open  ppp
3001/tcp  open  nessus
3002/tcp  open  exlm-agent
8080/tcp  open  http-proxy
36921/tcp open  unknown

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

解读扫描结果

扫描结果为我们提供了很多关于你机器的有用信息。让我们来分析一下各列的含义:

  • PORT:此列显示端口号和协议,在这种情况下是 TCP。端口号就像是你计算机上一扇特定门的地址,而 TCP 是数据通过这扇门传输的方式。
  • STATE:此列告诉我们端口是开放、关闭还是被过滤。开放端口意味着有服务正在该端口上监听并准备接受连接。关闭端口表示没有服务在监听。被过滤的端口可能被防火墙阻止了。
  • SERVICE:此列显示通常使用该端口的常见服务。

在扫描结果中,你应该会看到端口 8080/tcp 被列为开放状态。在上一步中,我们将这个端口映射到了我们的 Docker 容器。“http - proxy”服务表明这个端口通常用于 HTTP 代理服务,但在我们的场景中,它被 Nginx Web 服务器使用。

你可能会看到的其他开放端口包括:

  • 端口 22(SSH):这个端口用于安全的远程访问。它允许你从其他位置安全地连接到你的计算机。
  • 端口 3000 - 3002:这些端口被各种服务使用。它们可能与开发环境或你机器上运行的其他应用程序相关。
  • 端口 36921:这是一个未知服务。它可能是一个自定义服务,或者是 Nmap 无法立即识别的服务。

现在你已经找到了你机器上的开放端口,你已经成功完成了第一次 Nmap 扫描。在接下来的步骤中,我们将学习更高级的 Nmap 扫描技术。

使用 Nmap 进行服务版本检测

在这一步中,我们将探讨如何使用 Nmap 的服务版本检测功能。这是一项强大的功能,可帮助我们确定目标系统开放端口上运行的服务。了解服务及其版本对于安全评估和网络管理至关重要。

理解服务版本检测

仅仅知道某个端口是开放的,只能为我们提供一些基本信息。然而,识别具体的服务及其版本能提供更有价值的见解。不同版本的服务可能存在不同的安全漏洞。例如,较旧版本的 Web 服务器可能存在已知的安全缺陷,而这些缺陷在较新的版本中已得到修复。通过了解服务版本,我们可以检查是否存在已知的漏洞,并采取适当的措施来保护我们的网络。

执行服务版本扫描

Nmap 提供了 -sV 选项来启用服务版本检测。当你使用此选项时,Nmap 会向目标系统的开放端口发送特殊的探测包。这些探测包旨在收集运行在这些端口上的服务信息,例如服务名称及其版本。

让我们在你的本地主机上进行一次服务版本扫描。本地主机指的是你自己的计算机。为此,请在终端中执行以下命令:

nmap -sV localhost

此命令告诉 Nmap 对你的本地机器进行服务版本扫描。运行该命令后,Nmap 将开始向本地主机的开放端口发送探测包,并收集运行在这些端口上的服务信息。

命令的输出大致如下:

Starting Nmap 7.80 ( https://nmap.org ) at 2024-03-15 11:30 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).
Not shown: 994 closed ports
PORT     STATE SERVICE     VERSION
22/tcp   open  ssh         OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)
3000/tcp open  ppp?
3001/tcp open  nessus?
3002/tcp open  ssl/nessus?
8080/tcp open  http        nginx 1.23.4
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 11.94 seconds

解读服务版本扫描结果

服务版本扫描的输出提供了每个开放端口上运行的服务的详细信息。让我们来分析一下重要部分:

  • 端口 22:输出显示端口 22 是开放的,并且运行着 SSH(安全外壳)服务。具体版本是 OpenSSH 8.2p1,它运行在 Ubuntu 系统上。SSH 是一种用于安全远程访问计算机的协议。
  • 端口 8080:此端口是开放的,并且运行着 HTTP 服务,具体是 Nginx Web 服务器版本 1.23.4。Nginx 是一种用于提供网页服务的流行 Web 服务器。

对于端口 3000 - 3002,你会注意到服务名称旁边有问号。这意味着 Nmap 无法确定这些端口上确切运行的服务。在这种情况下,可能需要进一步调查。你可以使用其他工具或技术来收集有关这些服务的更多信息。

这些关于服务版本的详细信息对于安全评估非常有价值。你可以使用这些信息来检查特定服务版本是否存在已知的漏洞。例如,如果你发现自己运行的是较旧版本的 Nginx,你可以查询该版本是否存在安全问题,并考虑升级到更新、更安全的版本。

通过使用 Nmap 的服务版本检测功能,你已经不仅仅是识别开放端口了。你现在对系统上运行的网络服务有了更深入的了解,这对于维护一个安全且管理良好的网络至关重要。

使用 Nmap 进行操作系统检测

在这一步中,我们将学习如何使用 Nmap 的操作系统检测功能。不过,首先让我们了解一下为什么这很重要。对于网络管理员和安全专家来说,了解目标机器上运行的操作系统就像是掌握了关键信息。这有助于他们了解该机器可能存在的漏洞和安全风险。

理解操作系统检测

操作系统检测是 Nmap 的一项更高级的功能。当你使用此功能时,Nmap 会向目标机器发送特殊的数据包,并分析返回的响应。基于这些响应,Nmap 会对目标机器上运行的操作系统做出合理的推测。不同的操作系统处理网络请求的方式不同,Nmap 利用这些差异来判断另一端运行的是什么系统。这些信息对于安全评估至关重要,因为不同的操作系统存在不同的漏洞集。例如,较旧版本的 Windows 可能存在已知的安全漏洞,而较新的 Linux 发行版则可能没有。

执行操作系统检测扫描

要执行操作系统检测扫描,我们将使用 Nmap 中的 -O 选项。不过,此功能需要 root 权限,因为它涉及发送某些普通用户不被允许发送的网络数据包。因此,我们需要使用 sudo 以管理员权限运行该命令。

在你的终端中运行以下命令:

sudo nmap -O localhost

当你运行此命令时,可能会提示你输入 sudo 密码。这是一项安全措施,以确保只有授权用户才能执行具有管理员权限的操作。输入密码后,Nmap 将开始扫描。

输出结果将类似于以下内容:

Starting Nmap 7.80 ( https://nmap.org ) at 2024-03-15 12:00 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00013s latency).
Not shown: 994 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
3000/tcp open  ppp
3001/tcp open  nessus
3002/tcp open  ssl/nessus
8080/tcp open  http-proxy
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.6
Network Distance: 0 hops

OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 3.36 seconds

解读操作系统检测结果

操作系统检测结果为我们提供了很多关于目标操作系统的有用信息。让我们来分析一下结果的不同部分:

  • 设备类型:这告诉我们设备的大致类别。例如,它可能是通用计算机、路由器或打印机。在我们的例子中,显示为“通用”,这意味着它可能是一台普通的计算机。
  • 运行系统:这显示了检测到的操作系统家族和版本范围。这里显示为“Linux 4.X|5.X”,这意味着 Nmap 检测到该机器运行的是 Linux 操作系统,内核版本在 4.X 或 5.X 范围内。
  • OS CPE:即通用平台枚举(Common Platform Enumeration)。它为操作系统提供了标准化的标识符,可用于进一步的研究和漏洞分析。
  • 操作系统详细信息:这为我们提供了关于操作系统版本的更具体信息。在我们的示例中,显示为“Linux 4.15 - 5.6”,这意味着内核版本在 4.15 到 5.6 之间。
  • 网络距离:这表示目标距离我们有多少个网络跳数。由于我们正在扫描 localhost(即本地机器本身),所以网络距离为 0 跳。

在这种情况下,Nmap 正确识别出该机器运行的是 Linux,具体来说是内核版本在 4.15 到 5.6 之间的系统。

这些信息在安全评估中非常有用。通过了解操作系统版本,安全专家可以查找与该版本相关的已知漏洞,并采取适当的措施来保护系统。这对于网络资产盘点和管理也很有价值,因为它有助于跟踪网络中不同机器上运行的操作系统。

通过使用 Nmap 的操作系统检测功能,你对目标系统的了解已经不仅仅局限于知道哪些端口是开放的以及运行着哪些服务。你现在对底层操作系统有了更清晰的认识,这对于网络安全和管理来说是至关重要的信息。

使用 Nmap 进行脚本扫描

在这最后一步,我们将探索 Nmap 的脚本引擎(NSE)。NSE 是 Nmap 非常重要的一部分,它让 Nmap 变得更加实用。它允许用户编写和共享脚本来自动化不同的网络任务。这意味着你可以使用脚本来更快、更高效地完成任务,而不是手动操作。

理解 Nmap 脚本引擎(NSE)

Nmap 脚本引擎(NSE)是 Nmap 最强大、最灵活的功能之一。你可以把它想象成一个工具箱,为你提供了处理网络的额外工具。你可以使用 Lua 编程语言编写脚本。Lua 是一种简单易学的语言,非常适合编写这类脚本。

这些脚本可以用于多种不同的目的:

  • 网络发现:帮助你找出网络上有哪些设备。
  • 版本检测:你可以确定设备上运行的软件版本。
  • 漏洞检测:可以发现系统中的安全弱点。
  • 后门检测:帮助你找出攻击者可能用来访问系统的隐藏途径。
  • 漏洞利用:虽然这应该在合法和符合道德规范的测试环境中进行,但它可以展示攻击者可能如何利用漏洞。

Nmap 自带了许多预编写的脚本。这些脚本根据其功能被组织成库。所以,如果你想完成某项特定任务,你可以在相关库中轻松找到合适的脚本。

执行基本脚本扫描

要开始进行基本的脚本扫描,我们将使用 -sC 选项。这个选项告诉 Nmap 运行一组默认脚本。这些默认脚本被设计为安全且非侵入性的。这意味着它们在执行任务时不会对目标系统造成任何损害。

让我们运行以下命令:

nmap -sC localhost

当你运行这个命令时,Nmap 将开始扫描你的本地机器。它将使用默认脚本来收集有关开放端口和运行在这些端口上的服务的信息。输出大致如下:

Starting Nmap 7.80 ( https://nmap.org ) at 2024-03-15 12:30 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00010s latency).
Not shown: 994 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
| ssh-hostkey:
|   3072 01:23:45:67:89:ab:cd:ef:01:23:45:67:89:ab:cd:ef (RSA)
|   256 fe:dc:ba:98:76:54:32:10:fe:dc:ba:98:76:54:32:10 (ECDSA)
|_  256 01:23:45:67:89:ab:cd:ef:01:23:45:67:89:ab:cd:ef (ED25519)
3000/tcp open  ppp
3001/tcp open  nessus
3002/tcp open  ssl/nessus
8080/tcp open  http-proxy
|_http-title: Welcome to nginx!

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

运行特定脚本

如果你想运行某个特定的脚本,可以使用 --script 选项。在这个选项之后,你需要指定脚本的名称或它所属的类别。

例如,假设你想获取网页的标题。有一个名为 http - title 的脚本可以帮你完成这个任务。要运行这个脚本,请使用以下命令:

nmap --script=http-title -p 8080 localhost

这个命令告诉 Nmap 在你本地机器的 8080 端口上运行 http - title 脚本。输出将如下所示:

Starting Nmap 7.80 ( https://nmap.org ) at 2024-03-15 12:35 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).

PORT     STATE SERVICE
8080/tcp open  http-proxy
|_http-title: Welcome to nginx!

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

解读脚本扫描结果

脚本扫描的结果为你提供了关于开放端口上运行的服务的更详细信息。

  • 对于 22 端口上的 SSH 服务,ssh - hostkey 脚本获取了主机密钥。这些密钥对于通过 SSH 进行安全通信非常重要。
  • 对于 8080 端口上的 HTTP 服务,http - title 脚本获取了网页的标题,即“Welcome to nginx!”。

这类信息对于安全评估非常有用。它帮助你了解目标系统上的服务是如何配置的以及它们的行为方式。

通过使用 Nmap 的脚本引擎,你探索了它最强大的功能之一。在进行网络发现和安全评估任务时,这个功能可以为你节省大量的时间和精力。

清理工作

现在你已经完成了所有的扫描步骤,是时候进行清理了。在实验的前面部分,你创建了一个 Docker 容器。我们需要停止并移除这个容器,以保持系统的整洁。

运行以下命令:

docker stop cyber-seed-server && docker rm cyber-seed-server

这个命令首先停止名为 cyber - seed - server 的正在运行的 Docker 容器,然后将该容器从你的系统中移除。

恭喜你!你已经成功完成了本实验的所有步骤。你已经获得了使用不同 Nmap 扫描技术的宝贵实践经验。

总结

在本次实验中,你学习了使用 Nmap 进行网络扫描的基础知识。Nmap 是一款广受欢迎且功能强大的网络安全工具。你搭建了一个 Docker 容器作为扫描目标,创建了一个实践环境来应用你所学的新技能。

你逐步掌握了一系列高级 Nmap 扫描技术,从对本地机器进行基本的端口扫描开始。接着,你学习了服务版本检测、操作系统检测,并使用 Nmap 的脚本引擎来自动化任务和收集更多目标信息。这些技能是网络安全评估的基础,对网络管理员和安全专家来说至关重要。掌握这些 Nmap 技术能让你在实际场景中拥有强大的工具,无论是进行网络资产盘点还是安全评估。