学习 Nmap 基础知识和扫描技术

NmapNmapBeginner
立即练习

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

简介

在本次实验中,你将学习 Nmap 的基础知识。Nmap 是一款强大的网络扫描工具,常用于网络安全领域的网络发现和安全审计。你将探索如何使用 Nmap 扫描网络、发现开放端口并识别正在运行的服务。

通过掌握这些技术,你将获得网络管理和安全评估所需的重要技能。这种实践经验将为你提供适用于现实场景的实用知识,帮助你了解网络基础设施和安全注意事项。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"]) nmap/NmapGroup -.-> nmap/installation("Installation and Setup") nmap/NmapGroup -.-> nmap/port_scanning("Port Scanning Methods") nmap/NmapGroup -.-> nmap/timing_performance("Timing and Performance") nmap/NmapGroup -.-> nmap/stealth_scanning("Stealth and Covert Scanning") subgraph Lab Skills nmap/installation -.-> lab-415937{{"学习 Nmap 基础知识和扫描技术"}} nmap/port_scanning -.-> lab-415937{{"学习 Nmap 基础知识和扫描技术"}} nmap/timing_performance -.-> lab-415937{{"学习 Nmap 基础知识和扫描技术"}} nmap/stealth_scanning -.-> lab-415937{{"学习 Nmap 基础知识和扫描技术"}} end

理解 Nmap 基础

Nmap 是 Network Mapper 的缩写,它是一款开源工具,在网络发现和安全审计中起着至关重要的作用。在网络安全领域,它就像一名侦探,利用原始 IP 数据包来收集信息。借助 Nmap,你可以确定网络上存在哪些主机、这些主机提供哪些服务、它们运行的操作系统以及其他重要特征。

让我们从 Nmap 的基础知识开始我们的学习之旅。首先,你需要打开一个终端。终端就像是一个指挥中心,你可以在其中输入命令与系统进行交互。你可以通过点击任务栏中的终端图标或按下 Ctrl+Alt+T 来打开它。

终端打开后,你需要确保自己位于项目目录中。项目目录是一个特定的文件夹,本次实验的所有相关文件和操作都将在此进行。要导航到项目目录,请使用以下命令:

cd /home/labex/project

现在你已经处于正确的位置,让我们来检查一下系统上安装的 Nmap 版本。了解版本信息很重要,因为不同版本可能具有不同的功能和行为。要检查版本,请运行以下命令:

nmap --version

运行该命令后,你应该会看到类似以下的输出。此输出显示了系统上安装的 Nmap 版本,以及一些关于它所使用的编译库和可用的 nsock 引擎的信息。

Nmap version 7.80 ( https://nmap.org )
Platform: x86_64-pc-linux-gnu
Compiled with: liblua-5.3.3 openssl-1.1.1f libpcre-8.39 libpcap-1.9.1 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: epoll poll select

现在,让我们进行第一次基本的 Nmap 扫描。我们将扫描本地主机(localhost),这就像是对自己的系统进行一次自检。这次扫描将帮助我们了解系统上哪些端口是开放的。端口就像建筑物中的门,不同的服务使用不同的端口进行通信。运行以下命令:

nmap localhost

此命令将扫描本地主机上最常见的 1000 个端口。运行该命令后,你应该会看到类似以下的输出。输出会告诉我们系统上哪些端口是开放的。例如,端口 22 通常用于 SSH(安全外壳协议),这是一种用于安全访问远程计算机的协议,而端口 80 用于 HTTP(Web 服务)。请记住,根据你系统上运行的服务,你的输出可能会显示不同的开放端口。

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 15:45 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

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

在接下来的练习中,我们需要一个服务来进行扫描。我们将使用 netcat 创建一个简单的服务,netcat 是一个多功能的网络实用工具。这个服务将监听端口 8888。运行以下命令:

nc -lk 8888 &

让我们来分析一下这个命令。-l 选项告诉 netcat 监听传入的连接。-k 选项使 netcat 即使在客户端断开连接后也能继续监听。末尾的 & 符号将命令放在后台运行,这样你就可以继续使用终端执行其他任务。

为了验证服务是否正在运行,我们可以使用以下命令:

netstat -tuln | grep 8888

此命令会列出所有网络连接,并过滤输出以仅显示与端口 8888 相关的信息。如果服务正在运行,你应该会看到类似以下的输出:

tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN

此输出确认我们的模拟服务正在运行并监听端口 8888。

探索 Nmap 端口扫描技术

Nmap 是网络安全领域的强大工具,尤其在端口扫描方面表现出色。端口扫描是一种用于发现目标系统上哪些端口处于开放状态,以及这些端口上可能运行着哪些服务的方法。存在不同类型的端口扫描技术,每种技术都有其独特的优势和特定的使用场景。在这一步中,我们将通过扫描我们的模拟服务来探索其中一些技术。

首先,让我们针对端口 8888 进行一次基本的 TCP 连接扫描。TCP 连接扫描是检查端口是否开放的一种直接方法。它通过尝试与目标端口建立完整的 TCP 连接来工作。如果连接成功,则认为该端口是开放的。

nmap -p 8888 localhost

在这个命令中,-p 选项用于指定我们要扫描的端口。这里,我们告诉 Nmap 扫描 localhost(即当前机器)上的端口 8888。运行此命令后,你应该会看到类似以下的输出:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 15:50 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).

PORT     STATE SERVICE
8888/tcp open  sun-answerbook

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

此输出确认我们的端口 8888 是开放的。Nmap 还根据其内部数据库识别出了与该端口关联的服务名称。

现在,让我们尝试进行一次 SYN 扫描。与 TCP 连接扫描相比,SYN 扫描是一种更隐蔽的方法。它不会完成完整的 TCP 连接,因此更不容易被入侵检测系统发现。

sudo nmap -sS -p 8888 localhost

-sS 选项指定我们要执行 SYN 扫描。这种类型的扫描需要 root 权限,因为它涉及发送原始网络数据包,这是一种底层操作。这就是我们使用 sudo 命令的原因。输出应该与之前的扫描类似:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 15:55 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).

PORT     STATE SERVICE
8888/tcp open  sun-answerbook

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

接下来,让我们尝试进行一次 UDP 扫描。UDP(用户数据报协议)与 TCP 是不同类型的网络协议。TCP 提供可靠的、面向连接的服务,而 UDP 是无连接协议。我们将使用 UDP 扫描来检查端口 8888 是否对 UDP 流量开放。

sudo nmap -sU -p 8888 localhost

-sU 选项指定进行 UDP 扫描。UDP 扫描可能比 TCP 扫描更耗时,因为 UDP 没有像 TCP 那样内置的确认机制,所以 Nmap 必须等待更长时间才能确定端口是开放还是关闭。输出可能如下所示:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 16:00 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).

PORT     STATE  SERVICE
8888/udp closed sun-answerbook

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

注意,UDP 端口显示为关闭。这是预期的,因为我们的 netcat 服务正在监听 TCP 连接,而不是 UDP。

最后,让我们进行一次服务版本检测扫描。这种类型的扫描有助于我们识别特定端口上运行的具体服务及其版本。

nmap -sV -p 8888 localhost

-sV 选项告诉 Nmap 执行服务/版本检测。它会尝试向开放端口发送特定的探测包,并分析响应以确定服务及其版本。输出可能如下所示:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 16:05 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).

PORT     STATE SERVICE VERSION
8888/tcp open  http    Apache httpd
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

版本检测可能无法准确地将我们的 netcat 服务识别为真正的应用程序,但它展示了 Nmap 如何尝试确定开放端口上运行的内容。

让我们将我们的发现保存到一个文件中,以备将来参考。保存扫描结果使我们能够稍后查看它们、与他人共享或用于进一步分析。

nmap -p 8888 localhost > /home/labex/project/nmap_scan_results.txt

在这个命令中,> 符号用于将 Nmap 扫描的输出重定向到位于 /home/labex/project 目录下名为 nmap_scan_results.txt 的文件中。

你可以使用以下命令查看保存的结果:

cat /home/labex/project/nmap_scan_results.txt

cat 命令用于显示文件的内容。

至此,我们对不同的 Nmap 端口扫描技术的探索就结束了。

理解扫描时间和性能模板

在使用 Nmap 进行扫描时,扫描时间起着至关重要的作用。如果扫描过于激进,可能会被入侵检测系统(Intrusion Detection System,简称 IDS)察觉。IDS 是一种安全工具,用于监控网络流量中的可疑活动。激进的扫描还可能使目标系统不堪重负,导致其出现故障或无响应。另一方面,如果扫描速度过慢,完成扫描可能需要花费大量时间,这效率极低,尤其是在需要扫描大量目标时。

Nmap 提供了扫描时间模板,让你能够控制扫描的速度和激进程度。这些模板从 T0(偏执模式)到 T5(疯狂模式)不等。数字越大,扫描速度越快,也越激进。

以下是对这些扫描时间模板的详细介绍:

  • -T0(偏执模式):这是一种极其缓慢的扫描时间模板。主要用于躲避入侵检测系统。通过非常缓慢地发送请求,触发 IDS 警报的可能性较小。
  • -T1(隐秘模式):与偏执模式类似,也是慢速扫描,用于躲避 IDS。它发送请求的速度比偏执模式稍快,但仍足够慢以避免被检测到。
  • -T2(礼貌模式):此模板会减慢扫描速度,以减少对目标机器带宽和资源的占用。当你不想对目标系统造成任何干扰时,这是一个不错的选择。
  • -T3(正常模式):这是 Nmap 的默认扫描时间模板。它在速度和可靠性之间取得了平衡,适用于大多数通用扫描。
  • -T4(激进模式):该模板会加快扫描速度,前提是你使用的是相当快速且可靠的网络。它能更快地发送请求,从而减少整体扫描时间。
  • -T5(疯狂模式):这是一种非常激进的扫描时间模板。它假设你拥有极快的网络。它以非常高的速率发送请求,可显著缩短扫描时间,但被检测到的风险也会增加。

让我们先尝试使用默认的扫描时间模板(T3)进行扫描。我们将使用 time 命令来测量扫描所需的时间。time 命令是一个实用工具,它能显示一个命令执行所需的实际时间、用户时间和系统时间。

time nmap -T3 -p 8888 localhost

运行此命令后,你应该会看到类似以下的输出:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 16:10 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).

PORT     STATE SERVICE
8888/tcp open  sun-answerbook

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

real    0m0.115s
user    0m0.033s
sys     0m0.015s

现在,让我们尝试使用更激进的扫描时间模板(T4)。同样使用 time 命令来测量扫描时间。

time nmap -T4 -p 8888 localhost

你可能会注意到扫描完成的速度略有加快。以下是输出可能的示例:

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 16:15 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000097s latency).

PORT     STATE SERVICE
8888/tcp open  sun-answerbook

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

real    0m0.105s
user    0m0.032s
sys     0m0.014s

为了更明显地看出扫描时间的差异,让我们尝试使用 T3 和 T4 模板扫描所有端口。

time nmap -T3 -p- --max-retries 0 localhost | grep "open" > /dev/null

-p- 选项告诉 Nmap 扫描目标系统上的所有 65535 个端口。--max - retries 0 选项减少了每个端口扫描的重试次数,有助于加快扫描速度。我们将输出重定向到 grep 以过滤出仅包含 "open" 一词的行,然后将结果重定向到 /dev/null,这样我们就可以专注于扫描的时间。

time nmap -T4 -p- --max-retries 0 localhost | grep "open" > /dev/null

你应该会注意到,在这些全面扫描中,扫描时间有更显著的差异。

现在,按照原实验的要求,让我们将一次隐秘扫描的结果保存到一个文件中。我们将使用 T4 扫描时间模板来平衡速度和可靠性。

nmap -T4 -p 8888 localhost > /home/labex/project/nmap_stealthy_scan.txt

你可以使用 cat 命令查看保存的结果:

cat /home/labex/project/nmap_stealthy_scan.txt

T4 扫描时间模板在大多数情况下是一个不错的选择,因为它在速度和可靠性之间取得了平衡。在进行安全评估时,根据你的具体需求和限制(如网络速度、目标系统的敏感性以及被检测到的风险)来调整扫描时间模板非常重要。

输出格式与扫描结果分析

Nmap 提供了多种输出格式,这些格式在不同场景下非常有用。例如,可用于记录扫描结果的文档编写、进行更深入的分析,或者与其他安全工具集成。在这一步中,我们将详细了解这些输出格式,并学习如何有效地分析扫描结果。

Nmap 主要支持以下几种输出格式:

  1. 普通输出(默认):这是一种人类可读的文本格式。它以一种易于直观理解的方式呈现扫描结果,类似于一份报告。
  2. XML 输出(-oX):XML 是一种结构化格式。它以层次化和有组织的方式排列数据,非常便于程序解析和处理。
  3. 可 grep 输出(-oG):这种格式设计为便于使用 grep 等工具和其他文本处理实用程序进行解析。它具有特定的结构,使得提取相关信息变得简单直接。
  4. 所有格式(-oA):当你使用此选项时,Nmap 会同时以普通、XML 和可 grep 格式保存扫描结果。当你需要各种类型的输出以满足不同需求时,这非常有用。

让我们逐个尝试这些格式:

首先,我们将以普通格式保存一次扫描结果。以下命令将扫描 localhost 上的 8888 端口,并将结果保存到一个文本文件中:

nmap -p 8888 localhost -oN /home/labex/project/normal_output.txt

现在,让我们以 XML 格式保存一次扫描结果。此命令将对 localhost 的 8888 端口执行相同的扫描,并将结果保存到一个 XML 文件中:

nmap -p 8888 localhost -oX /home/labex/project/xml_output.xml

接下来,我们将以可 grep 格式保存一次扫描结果。下面的命令将扫描 localhost 上的 8888 端口,并将结果保存到一个可由 grep 轻松解析的文件中:

nmap -p 8888 localhost -oG /home/labex/project/grep_output.txt

最后,让我们以所有格式保存一次扫描结果。以下命令将为 localhost 的 8888 端口的同一次扫描创建三个不同格式的文件:

nmap -p 8888 localhost -oA /home/labex/project/all_formats

这将创建三个文件:all_formats.nmapall_formats.xmlall_formats.gnmap

现在,让我们检查这些文件,以了解它们格式上的差异。

要查看普通输出,我们使用 cat 命令:

cat /home/labex/project/normal_output.txt

你应该会看到标准的 Nmap 输出,这种输出人类易于阅读。以下是可能的输出示例:

## Nmap 7.80 scan initiated Mon Oct 30 16:45:00 2023 as: nmap -p 8888 -oN /home/labex/project/normal_output.txt localhost
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00010s latency).

PORT     STATE SERVICE
8888/tcp open  sun-answerbook

## Nmap done at Mon Oct 30 16:45:00 2023 -- 1 IP address (1 host up) scanned in 0.04 seconds

要查看 XML 输出,我们同样使用 cat 命令:

cat /home/labex/project/xml_output.xml

这种格式是为便于程序解析而设计的。以下是 XML 输出的示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nmaprun>
<nmaprun scanner="nmap" args="nmap -p 8888 -oX /home/labex/project/xml_output.xml localhost" start="1698684307" startstr="Mon Oct 30 16:45:07 2023" version="7.80" xmloutputversion="1.04">
<scaninfo type="connect" protocol="tcp" numservices="1" services="8888"/>
<verbose level="0"/>
<debugging level="0"/>
<host starttime="1698684307" endtime="1698684307"><status state="up" reason="conn-refused" reason_ttl="0"/>
<address addr="127.0.0.1" addrtype="ipv4"/>
<hostnames>
<hostname name="localhost" type="user"/>
<hostname name="localhost" type="PTR"/>
</hostnames>
<ports><port protocol="tcp" portid="8888"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="sun-answerbook" method="table" conf="3"/></port>
</ports>
<times srtt="100" rttvar="5000" to="100000"/>
</host>
<runstats><finished time="1698684307" timestr="Mon Oct 30 16:45:07 2023" elapsed="0.04" summary="Nmap done at Mon Oct 30 16:45:07 2023; 1 IP address (1 host up) scanned in 0.04 seconds" exit="success"/><hosts up="1" down="0" total="1"/>
</runstats>
</nmaprun>

要查看可 grep 输出,我们再次使用 cat 命令:

cat /home/labex/project/grep_output.txt

这种格式设计为便于使用 grep 等工具进行解析。以下是可 grep 输出的示例:

## Nmap 7.80 scan initiated Mon Oct 30 16:45:15 2023 as: nmap -p 8888 -oG /home/labex/project/grep_output.txt localhost
Host: 127.0.0.1 (localhost)	Status: Up
Host: 127.0.0.1 (localhost)	Ports: 8888/open/tcp//sun-answerbook///
## Nmap done at Mon Oct 30 16:45:15 2023 -- 1 IP address (1 host up) scanned in 0.04 seconds

让我们练习使用 grep 从可 grep 输出中提取特定信息。以下命令将显示所有包含开放端口的行:

grep "open" /home/labex/project/grep_output.txt

输出应该是:

Host: 127.0.0.1 (localhost)	Ports: 8888/open/tcp//sun-answerbook///

你还可以使用更复杂的过滤器。以下命令仅提取开放端口的端口号:

grep -E "Ports:.*open" /home/labex/project/grep_output.txt | cut -d':' -f3 | cut -d'/' -f1

输出将是:

 8888

这些不同的输出格式使你能够将 Nmap 扫描结果与其他工具和工作流程集成,使其成为你安全工具包中多功能的一部分。

总结

在本次实验中,你学习了强大的网络扫描和安全评估工具 Nmap 的基础知识。你首先掌握了 Nmap 的基本用法,例如扫描主机和识别开放端口。随后,你探索了各种端口扫描技术,如 TCP 连接扫描、SYN 扫描和 UDP 扫描,每种技术都有独特的优势和适用场景。

你还练习了使用扫描时间模板来平衡扫描速度和隐蔽性。最后,你学会了以不同格式保存扫描结果,并使用文本处理工具对其进行分析。这些技能为网络发现、安全评估和漏洞识别奠定了基础。Nmap 对于网络管理员、安全专业人员和道德黑客来说至关重要。请记住,要负责任且合乎道德地使用这些工具,在扫描陌生网络或系统之前,务必获得适当的授权。