使用 Nmap 扫描漏洞

Beginner
立即练习

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

简介

在这个实验中,你将学习如何使用 Nmap 进行网络漏洞扫描。你将安装 Nmap,利用 Nmap 脚本引擎(NSE)进行高级扫描,并分析结果以识别安全漏洞。

通过实际操作练习,你将执行基本扫描和脚本增强扫描,同时学习解读和保存你的发现。本实验将让你亲身体验 Nmap 的核心功能,以进行有效的网络安全评估。


Skills Graph

安装 Nmap

在这一步中,你将安装 Nmap(网络映射器),它是一款强大的开源工具,用于网络发现和安全审计。Nmap 被广泛用于扫描网络,以识别主机、服务和漏洞。你可以把它想象成一个数字地图绘制者,帮助安全专业人员了解哪些设备连接到网络以及它们正在运行哪些服务。

LabEx 虚拟机环境已经安装了必要的依赖项,因此我们可以专注于安装 Nmap 本身。请仔细按照以下步骤操作:

  1. 首先,我们需要更新软件包列表,以确保获取到 Nmap 的最新版本。这就像在开始旅程之前检查最新的地图更新一样:

    sudo apt update
  2. 现在使用以下命令安装 Nmap。-y 标志会自动确认安装,为我们节省时间:

    sudo apt install -y nmap
  3. 安装完成后,让我们通过检查其版本来验证 Nmap 是否正确安装。这可以确认我们已经准备好使用该工具:

    nmap --version

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

    Nmap version 7.92 ( https://nmap.org )
  4. 为了进行更实际的验证,我们将对本地主机(你自己的机器)运行一个简单的扫描。这有助于你在扫描其他系统之前了解 Nmap 的工作原理:

    nmap localhost

    此命令将显示你系统上开放端口的基本信息,让你了解本地正在运行哪些服务。这就像在检查别人家之前先看看自己家哪些门窗是开着的。

加载 Nmap 脚本引擎

在这一步中,我们将探索强大的 Nmap 脚本引擎(NSE),它就像一个工具箱,扩展了 Nmap 的基本扫描功能。可以把 NSE 想象成给你的网络扫描器添加了专业工具——它包含数百个预编写的脚本,这些脚本可以检测漏洞、收集详细的服务信息并执行高级网络发现任务。

在开始之前,了解这些脚本已经随 Nmap 安装在你的系统上是很重要的。让我们先看看有哪些可用的脚本:

  1. 首先,我们将列出所有已安装的 NSE 脚本。此命令会显示你 Nmap 安装中完整的脚本集合:

    ls /usr/share/nmap/scripts/
  2. 每个脚本都有文档说明其功能。让我们以 http-title 脚本为例进行查看——这个脚本用于获取网页的标题。以下命令会显示其用途和用法:

    nmap --script-help http-title
  3. 现在,让我们使用 NSE 进行第一次实际扫描。此命令使用两个重要选项扫描你的本地机器(localhost):

    • -sC:运行默认的 NSE 脚本集(对大多数扫描来说既安全又实用)
    • -sV:尝试确定服务版本(这对于识别过时软件至关重要)
    nmap -sC -sV localhost
  4. 为了针对特定脚本进行扫描,我们将仅使用 http-title 脚本扫描 scanme.nmap.org(Nmap 提供的一个测试站点)。这展示了如何聚焦于特定信息:

    nmap --script http-title scanme.nmap.org
  5. 最后,你可以组合多个脚本进行更全面的扫描。此示例针对 scanme.nmap.org 同时运行 http-titlehttp-headers 脚本:

    nmap --script "http-title and http-headers" scanme.nmap.org

请记住,不同的脚本有不同的用途——有些用于收集信息,而有些则用于测试漏洞。在生产系统上使用脚本之前,一定要查看其文档。

运行漏洞扫描

在这一步中,你将学习如何使用 Nmap 的脚本引擎来检测安全漏洞。漏洞扫描有助于在攻击者利用系统弱点之前识别这些弱点。我们将使用 scanme.nmap.org 作为目标——这是一个安全的、故意设置了漏洞的服务器,由 Nmap 开发者维护,用于测试目的。

  1. 首先,让我们查看可用的漏洞扫描脚本。Nmap 在 /usr/share/nmap/scripts/ 目录中预装了数百个脚本。grep 命令可帮助我们仅筛选出与漏洞相关的脚本:

    ls /usr/share/nmap/scripts/ | grep vuln
  2. 现在,我们将运行一个基本的漏洞扫描。-sV 标志启用服务版本检测,而 --script vuln 加载所有漏洞检测脚本。这能让我们大致了解潜在的问题:

    nmap -sV --script vuln scanme.nmap.org
  3. 为了进行更有针对性的扫描,我们可以专注于特定的漏洞类别。此示例仅检查与 HTTP 相关的漏洞(这在 Web 服务器中很常见)。星号 (*) 作为通配符,用于包含所有 http-vuln 脚本:

    nmap -sV --script http-vuln-* scanme.nmap.org
  4. 全面扫描会检查所有漏洞,同时避免进行有侵入性的测试(标记为“安全”)。这会花费更长时间,但能提供全面的结果,且不会影响系统稳定性:

    nmap -sV --script "vuln and safe" scanme.nmap.org
  5. 将扫描结果保存下来用于文档记录和进一步分析是个好习惯。-oN 标志以普通格式将输出保存到文本文件中。我们将在后续步骤中使用这些结果:

    nmap -sV --script vuln -oN vuln_scan_results.txt scanme.nmap.org

扫描结果将显示重要的安全信息,包括:

  • 开放端口和正在运行的服务(潜在的入口点)
  • 检测到的特定漏洞(安全弱点)
  • CVE 参考编号(标准的漏洞标识符)
  • 风险级别(有助于确定修复的优先级)

分析脚本输出

在这一步中,我们将仔细检查上一步中 Nmap 生成的漏洞扫描结果。作为初学者,要明白扫描只是第一步,真正的安全分析始于对结果的正确解读。vuln_scan_results.txt 文件包含了我们识别潜在安全弱点所需的所有原始数据。

  1. 首先,让我们查看完整的扫描结果。这能让我们全面了解 Nmap 的发现:

    cat vuln_scan_results.txt
  2. 由于手动阅读整个文件可能会让人应接不暇,我们将搜索特定的漏洞指示词。Nmap 输出中的“VULNERABLE”一词通常标志着已确认的安全问题:

    grep -i "vulnerable" vuln_scan_results.txt
  3. 接下来,我们将查找标准化的漏洞参考信息。CVE(通用漏洞披露)是已知安全漏洞的唯一标识符:

    grep -i "CVE-" vuln_scan_results.txt
  4. 端口状态在漏洞评估中至关重要。开放端口通常代表攻击者的潜在入口点:

    grep -E "open|filtered|closed" vuln_scan_results.txt
  5. 为了快速了解我们的发现,我们将统计 Nmap 检测到的漏洞数量。这有助于我们确定分析的优先级:

    echo "Total vulnerabilities found: $(grep -c -i "vulnerable" vuln_scan_results.txt)"
  6. 当你发现一个感兴趣的 CVE 时,对其进行研究是必不可少的。此示例展示了如何获取特定漏洞的详细信息(根据需要替换 CVE ID):

    curl -s https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228 | grep -A10 "Description"

在分析 Nmap 输出时,请特别关注以下关键要素:

  • 标记为“open”的端口——这些代表活跃的服务
  • 服务版本——过时的软件通常包含已知的漏洞
  • “VULNERABLE”指示词——已确认的安全问题
  • CVE 参考信息——标准化的漏洞标识符
  • 风险评分(如果有)——有助于确定修复的优先级

保存扫描结果

在这最后一步,你将学习如何正确记录并保存漏洞扫描结果。保存报告对于安全分析、文档记录以及与团队成员分享发现至关重要。Nmap 提供了多种输出格式以满足不同需求。

  1. 首先,创建一个专用目录来整理所有扫描报告。这有助于保持工作空间整洁,也便于日后查找结果:

    mkdir -p ~/project/reports
  2. 现在,我们再次运行漏洞扫描,同时将结果保存为两种标准格式。-oN 标志用于保存普通文本输出,而 -oX 则用于创建可被其他工具处理的 XML 文件:

    nmap -sV --script vuln -oN ~/project/reports/scan_results.txt scanme.nmap.org
    nmap -sV --script vuln -oX ~/project/reports/scan_results.xml scanme.nmap.org
  3. XML 文件直接阅读并不方便,因此我们使用 xsltproc 将其转换为更直观的 HTML 报告。这将为你的扫描结果创建一个格式精美的网页:

    xsltproc ~/project/reports/scan_results.xml -o ~/project/reports/scan_results.html
  4. 为了快速参考,我们使用 grep 提取关键的漏洞发现。这将创建一个精简的摘要,仅显示包含漏洞指示词的行:

    grep -iE "vulnerable|CVE-" ~/project/reports/scan_results.txt > ~/project/reports/summary.txt
  5. 让我们验证所有报告文件是否成功创建。-lh 标志以人类可读的格式显示文件大小:

    ls -lh ~/project/reports/
  6. (可选)如果你需要与他人分享这些报告,可以将它们压缩成一个存档文件:

    tar -czvf ~/project/reports.tar.gz ~/project/reports/

关键输出格式说明:

  • .txt:简单的文本格式,可在任何文本编辑器中轻松阅读
  • .xml:结构化数据格式,可被其他安全工具处理
  • .html:直观的报告,非常适合用于演示和文档记录
  • 摘要文件:快速参考,仅包含最重要的漏洞发现

总结

在本次实验中,你学习了如何使用 Nmap 进行漏洞扫描,从在 Linux 系统上安装 Nmap,到执行基本扫描并验证其功能。这些练习介绍了 Nmap 脚本引擎(Nmap Scripting Engine,NSE)等关键特性,展示了如何运行默认和自定义脚本以进行全面的网络分析。

你练习了包括服务版本检测(-sV)和脚本执行(-sC)在内的基本扫描技术,同时学习了如何解读和保存扫描结果。这些技能为你利用 Nmap 强大的扫描功能进行网络安全评估奠定了坚实的基础。