学习 Nmap 扫描和输出分析

NmapNmapBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 Nmap,这是一款强大的网络扫描工具,被安全专业人员广泛用于发现计算机网络上的主机和服务。你将探索 Nmap 提供的各种输出格式,这些格式对于解读扫描结果和进行进一步分析至关重要。

Nmap 是 Network Mapper 的缩写,是一款用于网络发现和安全审计的免费开源工具。它使用原始 IP 数据包来收集有关网络主机的信息,例如可用服务和操作系统。本实验将指导你设置一个测试服务,并使用不同的 Nmap 输出选项对其进行扫描,这对于有效的网络分析和文档记录至关重要。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"]) nmap/NmapGroup -.-> nmap/installation("Installation and Setup") 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/scripting_basics("Scripting Engine Basics") subgraph Lab Skills nmap/installation -.-> lab-415926{{"学习 Nmap 扫描和输出分析"}} nmap/output_formats -.-> lab-415926{{"学习 Nmap 扫描和输出分析"}} nmap/save_output -.-> lab-415926{{"学习 Nmap 扫描和输出分析"}} nmap/port_scanning -.-> lab-415926{{"学习 Nmap 扫描和输出分析"}} nmap/scripting_basics -.-> lab-415926{{"学习 Nmap 扫描和输出分析"}} end

为 Nmap 扫描设置测试环境

在这一步中,我们将创建一个简单的环境,让你可以练习使用 Nmap 进行扫描。Nmap 是一款用于网络探测和安全审计的强大工具。通过在本地机器上设置一个基本的 Web 服务器,然后使用 Nmap 对其进行扫描,你可以在一个安全且可控的环境中学习网络扫描。这样,你可以在不影响真实网络的情况下进行实验。

设置本地 Web 服务器

首先,我们需要设置一个简单的 Web 服务器,以便使用 Nmap 对其进行扫描。Python 提供了一种简单的方法来创建基本的 HTTP 服务器。HTTP 服务器是一种可以向客户端(如浏览器)提供网页的软件。

  1. 打开终端并导航到你的项目目录:

    cd /home/labex/project

    cd 命令代表“更改目录”。它允许你在文件系统中移动。在这种情况下,我们将移动到 /home/labex/project 目录,在那里我们将设置 Web 服务器。

  2. 创建一个简单的 HTML 文件以供服务:

    echo "Welcome to Nmap Testing Environment" > index.html

    echo 命令将文本打印到终端。> 符号将输出重定向到一个文件。因此,我们正在创建一个名为 index.html 的文件,其中包含文本“Welcome to Nmap Testing Environment”。这将是我们服务器提供的网页。

  3. 在端口 8080 上启动 Python HTTP 服务器:

    python3 -m http.server 8080 &

    python3 -m http.server 命令使用 Python 启动一个简单的 HTTP 服务器。8080 指定服务器将监听的端口号。端口就像网络流量进出计算机的门。命令末尾的 & 符号将服务器置于后台运行,允许你继续使用终端执行其他命令。

  4. 通过访问服务器来验证其是否正在运行:

    curl http://localhost:8080

    curl 命令用于从服务器传输数据或向服务器传输数据。在这里,我们尝试访问刚刚在 http://localhost:8080 设置的 Web 服务器。localhost 指的是当前计算机。

    你应该会看到以下输出:

    Welcome to Nmap Testing Environment

    如果你看到此输出,则意味着你的 Web 服务器正在正确运行。

基本 Nmap 扫描

现在你已经有一个正在运行的 Web 服务器,你可以使用 Nmap 对其进行扫描。扫描服务器有助于你找出哪些端口是开放的,以及这些端口上可能运行着哪些服务。

  1. 对本地 Web 服务器进行基本的 Nmap 扫描:

    nmap -p 8080 localhost

    nmap 命令中的 -p 选项指定要扫描的端口。在这种情况下,我们告诉 Nmap 仅扫描 localhost(即 IP 地址 127.0.0.1)上的 8080 端口。

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

    Starting Nmap 7.80 ( https://nmap.org ) at 2023-11-08 12:34 UTC
    Nmap scan report for localhost (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.05 seconds

    此输出采用 Nmap 的默认格式,该格式易于阅读,并显示了有关扫描的基本信息。

理解 Nmap 默认输出

让我们来理解默认输出显示的内容:

  • Starting Nmap:这一行显示了你正在使用的 Nmap 版本以及扫描开始的时间。它有助于你跟踪扫描的启动时间。
  • Nmap scan report:这表明扫描的目标。在我们的例子中,目标是 localhost
  • Host is up:这确认目标处于在线状态。延迟时间显示了 Nmap 从目标获取响应所需的时间。
  • PORT:这显示了被扫描的端口号。在我们的扫描中,我们扫描了 8080 端口。
  • STATE:这表明端口是开放、关闭还是被过滤。开放的端口意味着有服务正在该端口上监听并接受连接。
  • SERVICE:Nmap 会尝试猜测该端口上可能运行的服务。在这里,它猜测为 http - proxy
  • Nmap done:这是扫描的总结。它告诉你扫描了多少个 IP 地址以及扫描花费了多长时间。

现在你已经成功设置了一个测试环境并进行了基本的 Nmap 扫描。在下一步中,你将探索 Nmap 提供的不同输出格式。

探索不同的 Nmap 输出格式

在这一步中,我们将了解 Nmap 提供的各种输出格式。输出格式在网络安全领域至关重要,因为它们能让我们根据自身需求以不同方式呈现扫描结果。例如,有些格式便于人类阅读,而有些则是为机器解析设计的,这在与其他工具集成时非常有用。

Nmap 输出格式概述

Nmap 支持多种输出格式,每种格式都有其独特的特点和适用场景:

  1. 普通输出(默认):这是一种人类可读的格式。它以一种让我们一目了然的方式呈现扫描结果,非常适合快速手动分析。
  2. XML 输出 (-oX):XML 即可扩展标记语言(Extensible Markup Language)。它是一种结构化格式,意味着数据以层次结构组织。这使得程序和脚本易于解析数据,常用于将 Nmap 与其他安全工具集成。
  3. 可 grep 输出 (-oG):这是一种基于行的格式。它设计用于方便地使用 Unix 工具(如 grep、awk 和 cut)进行处理。当你想从扫描结果中快速提取特定信息时,这种格式很有用。
  4. 脚本小子输出 (-oS):这种格式类似于普通输出,但包含 ASCII 艺术。不过,它在实际场景中很少使用。
  5. 所有格式 (-oA):此选项允许你同时将扫描结果保存为普通、XML 和可 grep 格式。这是一种一次性获取所有类型输出的便捷方式。

让我们通过再次扫描本地 Web 服务器来探索这些格式。

XML 输出格式

XML(可扩展标记语言)是一种广泛用于数据存储和交换的结构化格式。其层次结构使程序易于解析数据,这就是为什么它常用于与其他安全工具集成的原因。

  1. 运行 Nmap 扫描并将输出保存为 XML 格式:

    nmap -p 8080 localhost -oX /home/labex/project/scan_results.xml

    在这个命令中,-p 8080 指定我们要扫描 8080 端口,localhost 是我们要扫描的目标(本地机器),-oX 告诉 Nmap 将输出以 XML 格式保存到指定的文件路径。

  2. 查看 XML 输出:

    cat /home/labex/project/scan_results.xml

    cat 命令用于显示文件内容。运行此命令时,你会看到类似以下的 XML 格式输出(缩写形式):

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE nmaprun>
    <nmaprun scanner="nmap" args="nmap -p 8080 localhost -oX /home/labex/project/scan_results.xml" ...>
      <scaninfo type="connect" protocol="tcp" .../>
      <verbose level="0"/>
      <debugging level="0"/>
      <host>
        <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="8080">
            <state state="open" reason="syn - ack" reason_ttl="0"/>
            <service name="http - proxy" method="table" conf="3"/>
          </port>
        </ports>
        <times srtt="97" rttvar="5000" to="100000"/>
      </host>
      <runstats>...</runstats>
    </nmaprun>
  3. XML 格式包含以层次结构组织的详细信息。让我们提取特定的端口信息:

    grep -A5 "<port " /home/labex/project/scan_results.xml > /home/labex/project/port_details.txt

    grep 命令用于在文件中搜索特定模式。-A5 表示显示匹配模式的行之后的 5 行。我们在 XML 文件中搜索包含 <port 的行,并将结果保存到一个名为 port_details.txt 的新文件中。

  4. 查看提取的端口详细信息:

    cat /home/labex/project/port_details.txt

    运行此命令将显示 XML 中的端口信息部分。

可 grep 输出格式

可 grep 输出专门设计用于方便地使用 grep、awk 和 cut 等工具进行处理。这些 Unix 工具在文本处理方面非常强大,可以帮助我们从扫描结果中快速提取所需信息。

  1. 运行 Nmap 扫描并将输出保存为可 grep 格式:

    nmap -p 8080 localhost -oG /home/labex/project/scan_results.grep

    这里,-oG 告诉 Nmap 将输出以可 grep 格式保存到指定文件。

  2. 查看可 grep 输出:

    cat /home/labex/project/scan_results.grep

    输出将类似于以下内容:

    ## Nmap 7.80 scan initiated Wed Nov 8 12:40:00 2023 as: nmap -p 8080 localhost -oG /home/labex/project/scan_results.grep
    Host: 127.0.0.1 (localhost)   Status: Up
    Host: 127.0.0.1 (localhost)   Ports: 8080/open/tcp//http - proxy///
    ## Nmap done at Wed Nov 8 12:40:00 2023 -- 1 IP address (1 host up) scanned in 0.05 seconds
  3. 可 grep 格式将所有主机信息放在一行上,便于与文本处理工具一起使用。例如,你可以仅提取包含端口信息的行:

    grep "Ports:" /home/labex/project/scan_results.grep > /home/labex/project/ports_info.txt

    此命令在可 grep 输出文件中搜索包含“Ports:”的行,并将匹配的行保存到一个名为 ports_info.txt 的新文件中。

  4. 查看提取的端口信息:

    cat /home/labex/project/ports_info.txt

同时保存为所有格式

Nmap 提供了一个便捷的选项 -oA,可同时将输出保存为多种格式。如果你需要不同类型的输出用于不同目的,这可以节省你的时间。

  1. 运行 Nmap 扫描并将输出保存为所有格式:

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

    此命令扫描本地机器上的 8080 端口,并将结果保存为普通、XML 和可 grep 格式。

  2. 检查创建的文件:

    ls -la /home/labex/project/all_formats.*

    ls -la 命令列出目录中的所有文件并显示详细信息。运行此命令时,你应该会看到三个文件:

    • all_formats.nmap(普通输出)
    • all_formats.xml(XML 输出)
    • all_formats.gnmap(可 grep 输出)

现在你已经了解了 Nmap 提供的不同输出格式以及如何使用它们。每种格式都有其自身的优势:

  • 普通输出便于人类阅读
  • XML 输出结构适合机器解析和与其他工具集成
  • 可 grep 输出设计用于使用 Unix 文本处理工具进行快速分析

在下一步中,你将学习如何更详细地分析这些输出。

分析 Nmap 输出并提取有用信息

在这一步中,你将学习如何从 Nmap 扫描结果中提取和分析特定信息。这对于网络管理员和安全专业人员来说是一项至关重要的技能。在处理网络扫描时,你通常会得到大量的数据。能够高效地提取相关部分有助于你了解网络的安全状态并识别潜在问题。

分析 XML 输出

XML 输出对于详细分析非常有用,并且可以轻松地与其他工具集成。XML 是一种结构化格式,它以层次结构组织数据,使定位和提取特定信息变得更加容易。让我们来探索如何从 XML 输出中提取特定信息。

  1. 首先,让我们查看 XML 输出的结构,以了解有哪些可用信息。我们将使用 grep 命令在 XML 文件中查找主机部分的起始位置。grep 命令用于在文件中搜索指定的模式。

    grep "<host" -A2 /home/labex/project/scan_results.xml

    此命令在 scan_results.xml 文件中搜索 <host> 标签,并显示匹配项之后的接下来两行。这有助于我们查看 XML 文件中主机部分的开头。

  2. 现在,让我们提取有关端口状态的信息。我们将再次使用 grep 来查找所有包含 <state 标签的行,并将结果保存到一个新文件中。

    grep "<state " /home/labex/project/scan_results.xml > /home/labex/project/port_state.txt
  3. 查看提取的端口状态。我们将使用 cat 命令,该命令用于显示文件的内容。

    cat /home/labex/project/port_state.txt

    你应该会看到类似以下的内容:

    <state state="open" reason="syn-ack" reason_ttl="0"/>

    这告诉我们该端口是开放的。Nmap 之所以确定这一点,是因为它在发送 SYN 数据包后收到了 SYN - ACK 数据包。这是 TCP 三次握手的一部分,TCP 三次握手是网络中两个设备之间建立 TCP 连接的方式。

使用正则表达式进行更复杂的提取

对于更复杂的数据提取,你可以将正则表达式与 grepsedawk 等工具结合使用。正则表达式是一种强大的文本搜索和匹配模式的方法。它们允许你定义复杂的搜索条件。

  1. 让我们同时提取端口号及其状态。我们将使用带有正则表达式的 grep 在 XML 文件中查找相关信息,并将其保存到一个新文件中。

    grep -o 'portid="[0-9]*".*state="[^"]*"' /home/labex/project/scan_results.xml > /home/labex/project/port_and_state.txt
  2. 使用 cat 命令查看提取的信息。

    cat /home/labex/project/port_and_state.txt

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

    portid="8080" state="open"

分析可 grep 输出

可 grep 输出格式旨在便于使用标准 Unix 工具进行处理。它是一种基于文本的格式,使用 grep 等命令搜索特定信息非常直接。

  1. 让我们从可 grep 输出中仅提取开放端口。我们将使用 grep 查找所有包含 "open" 一词的行,并将结果保存到一个新文件中。

    grep "open" /home/labex/project/scan_results.grep > /home/labex/project/open_ports.txt
  2. 使用 cat 命令查看提取的信息。

    cat /home/labex/project/open_ports.txt

    这应该会显示包含所有开放端口的行。

  3. 你可以进一步处理此信息以仅提取端口号。我们将结合使用 grepcut 命令。cut 命令用于根据分隔符提取行的特定部分。

    grep "open" /home/labex/project/scan_results.grep | grep -o "8080/open" | cut -d "/" -f1 > /home/labex/project/port_numbers.txt
  4. 使用 cat 命令查看提取的端口号。

    cat /home/labex/project/port_numbers.txt

    你应该会看到:

    8080

创建简单的摘要报告

现在,让我们创建一个简单的摘要报告,该报告结合了扫描不同部分的信息。摘要报告有助于你快速了解扫描的关键发现。

  1. 创建摘要报告。我们将使用 echo 命令将文本写入文件。>> 运算符将文本追加到文件末尾。

    echo "Nmap Scan Summary" > /home/labex/project/scan_summary.txt
    echo "----------------" >> /home/labex/project/scan_summary.txt
    echo "Target: localhost (127.0.0.1)" >> /home/labex/project/scan_summary.txt
    echo "Open ports:" >> /home/labex/project/scan_summary.txt
    grep "open" /home/labex/project/scan_results.grep | grep -o "[0-9]*/open/tcp//[^/]*" >> /home/labex/project/scan_summary.txt
  2. 使用 cat 命令查看摘要报告。

    cat /home/labex/project/scan_summary.txt

    输出应该如下所示:

    Nmap Scan Summary
    ----------------
    Target: localhost (127.0.0.1)
    Open ports:
    8080/open/tcp//http - proxy

通过学习如何从 Nmap 扫描结果中提取和分析特定信息,你可以高效地处理和解释网络侦察数据。当扫描包含众多主机和服务的大型网络时,这项技能尤其有价值。

在下一步中,你将学习更高级的 Nmap 扫描技术。

高级 Nmap 扫描技术

在这一步中,我们将探索更高级的 Nmap 扫描技术。这些技术至关重要,因为它们可以提供有关网络服务的额外详细信息。具体来说,我们将重点关注服务版本检测和脚本扫描。了解这些技术将帮助你更深入地了解正在扫描的网络服务,这对于安全评估、网络资产盘点和故障排除至关重要。

服务版本检测

Nmap 有一个强大的功能,允许它尝试确定运行在端口上的服务的具体版本。这可以通过 -sV 选项来实现。了解服务版本非常有用,因为不同版本可能存在不同的安全漏洞或功能。

  1. 运行带有服务版本检测的 Nmap 扫描:

    nmap -p 8080 -sV localhost -oN /home/labex/project/version_scan.txt

    在这个命令中,-sV 选项告诉 Nmap 对开放端口进行探测。通过这样做,Nmap 可以收集有关这些端口上运行的服务的信息,包括它们的版本。-oN 选项用于将扫描输出以普通格式保存到指定文件 /home/labex/project/version_scan.txt 中。将输出保存到文件中,你可以在以后查看结果。

  2. 查看扫描结果:

    cat /home/labex/project/version_scan.txt

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

    Starting Nmap 7.80 ( https://nmap.org ) at 2023-11-08 13:20:00 UTC
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.000097s latency).
    
    PORT     STATE SERVICE VERSION
    8080/tcp open  http    Python/3.10 aiohttp/3.8.1 (Python httpd)
    
    Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
    Nmap done: 1 IP address (1 host up) scanned in 6.52 seconds

    注意,Nmap 现在不仅显示了服务名称,还显示了版本信息。在这种情况下,它检测到 HTTP 服务器正在使用 Python 3.10 运行。这些详细信息可用于识别潜在的安全风险或了解服务的功能。

使用 Nmap 脚本(NSE)

Nmap 脚本引擎(Nmap Script Engine,NSE)是一个强大的工具,允许你运行脚本来执行各种任务。这些任务范围从服务检测到漏洞扫描。通过使用 NSE 脚本,你可以扩展 Nmap 的功能并收集有关目标网络的更多信息。

  1. 在你的 Web 服务器上运行一个基本的 HTTP 信息脚本:

    nmap -p 8080 --script=http-title localhost -oN /home/labex/project/script_scan.txt

    http-title 脚本用于获取 HTTP 网页的标题。这对于快速识别网页的内容或用途很有用。-oN 选项将脚本扫描的输出以普通格式保存到指定文件 /home/labex/project/script_scan.txt 中。

  2. 查看脚本扫描结果:

    cat /home/labex/project/script_scan.txt

    输出应该包含类似以下的内容:

    Starting Nmap 7.80 ( https://nmap.org ) at 2023-11-08 13:25:00 UTC
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.000097s latency).
    
    PORT     STATE SERVICE
    8080/tcp open  http-proxy
    |_http-title: Directory listing for /
    
    Nmap done: 1 IP address (1 host up) scanned in 0.42 seconds

    http-title 脚本获取了网页的标题,在这种情况下是一个目录列表。这些信息可以帮助你了解 Web 服务器的结构和内容。

  3. 让我们尝试另一个提供更多关于 HTTP 服务器信息的脚本:

    nmap -p 8080 --script=http-server-header localhost -oN /home/labex/project/server_header_scan.txt

    http-server-header 脚本用于获取 HTTP 服务器头。服务器头通常包含有关服务器软件的信息,如版本和类型。这些信息对于安全评估和网络资产盘点很有价值。-oN 选项将扫描输出以普通格式保存到指定文件 /home/labex/project/server_header_scan.txt 中。

  4. 查看服务器头扫描结果:

    cat /home/labex/project/server_header_scan.txt

    输出应该包含有关服务器软件的信息:

    Starting Nmap 7.80 ( https://nmap.org ) at 2023-11-08 13:30:00 UTC
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.000097s latency).
    
    PORT     STATE SERVICE
    8080/tcp open  http-proxy
    |_http-server-header: SimpleHTTP/0.6 Python/3.10.12
    
    Nmap done: 1 IP address (1 host up) scanned in 0.13 seconds

组合多种技术

你可以在单个 Nmap 命令中组合多种扫描技术,以进行更全面的扫描。这使你能够一次性收集有关目标网络的广泛信息。

  1. 运行一个全面的扫描,包括端口扫描、服务版本检测和脚本扫描:

    nmap -p 8080 -sV --script=http-title,http-server-header localhost -oA /home/labex/project/comprehensive_scan

    这个命令可以完成以下几件事:

    • 它扫描 8080 端口 (-p 8080),这意味着它会检查目标主机上的这个端口是否开放。
    • 它检测服务版本 (-sV),提供有关端口上运行的服务的具体版本信息。
    • 它运行 http-titlehttp-server-header 脚本 (--script=http-title,http-server-header),分别获取网页标题和服务器头信息。
    • 它将结果保存为所有格式 (-oA)。保存为所有格式可确保你拥有不同形式的扫描结果,以用于不同的目的。
  2. 查看全面扫描结果:

    cat /home/labex/project/comprehensive_scan.nmap

    输出将包含之前扫描的所有信息。这让你对运行在 8080 端口上的目标网络服务有一个全面的了解。

  3. 创建一个最终分析报告,总结你所有的发现:

    echo "Final Nmap Analysis Report" > /home/labex/project/final_report.txt
    echo "------------------------" >> /home/labex/project/final_report.txt
    echo "Target: localhost (127.0.0.1)" >> /home/labex/project/final_report.txt
    echo "Port: 8080/tcp (open)" >> /home/labex/project/final_report.txt
    echo "Service:" >> /home/labex/project/final_report.txt
    grep "SERVICE VERSION" -A1 /home/labex/project/version_scan.txt | tail -1 >> /home/labex/project/final_report.txt
    echo "HTTP Server Header:" >> /home/labex/project/final_report.txt
    grep "http-server-header:" /home/labex/project/server_header_scan.txt >> /home/labex/project/final_report.txt
    echo "HTTP Page Title:" >> /home/labex/project/final_report.txt
    grep "http-title:" /home/labex/project/script_scan.txt >> /home/labex/project/final_report.txt

    这组命令创建了一个名为 final_report.txt 的文本文件,并将之前扫描收集的所有信息的摘要填充到其中。它包括有关目标、端口、服务版本、服务器头和网页标题的详细信息。

  4. 查看你的最终报告:

    cat /home/labex/project/final_report.txt

    你的最终报告应该包含你收集的有关运行在 8080 端口上的 Web 服务器的所有信息的全面摘要。这份报告可用于进一步分析、安全评估或文档记录。

通过学习这些高级 Nmap 扫描技术,你可以收集有关网络服务的详细信息,这些信息对于安全评估、网络资产盘点和故障排除非常有价值。

总结

在本次实验中,你学习了如何使用 Nmap——一款用于网络发现和安全审计的强大网络扫描工具。你在各种 Nmap 操作中积累了实践经验,包括使用本地 Web 服务器搭建测试环境、执行基本的端口扫描、探索不同的输出格式、提取和分析扫描结果,以及运用服务版本检测和脚本扫描等高级技术。

这些技能对于网络管理员、安全分析师和渗透测试人员来说至关重要。它们使你能够发现网络主机和服务、记录网络基础设施、识别安全问题,并实现扫描和报告的自动化。掌握 Nmap 及其输出格式,有助于进行有效的网络侦察、与其他安全工具集成,以及构建全面的网络资产清单。你所练习的命令行技能也可迁移到其他系统管理和安全任务中。