使用 Nmap 扫描漏洞

NmapBeginner
立即练习

介绍

在本实验中,你将学习使用 Nmap(网络映射器)进行网络扫描的基础知识。Nmap 是一款功能强大的开源工具,用于网络发现和安全审计。你将从基础的端口扫描开始,进而学习服务和版本检测,然后探索 Nmap 脚本引擎(NSE)以执行漏洞检查。最后,你将学习如何分析扫描结果并将其保存为各种格式以便生成报告。本实验通过循序渐进的手动操作,向你介绍 Nmap 的核心功能,帮助你进行有效的网络安全评估。

执行基础网络扫描

在第一步中,你将通过执行基础扫描来熟悉 Nmap。基础扫描用于发现目标机器上哪些端口是开放的。开放的端口表示某个服务(如 Web 服务器或 SSH)正在运行并监听连接。

实验环境已预先配置了多个运行在 localhost(你自己的虚拟机)上的服务供你练习。nmap 工具也已经安装完毕。

  1. 首先,让我们验证 Nmap 是否已安装并检查其版本。打开终端并运行以下命令:

    nmap --version
    

    你应该会看到确认 Nmap 版本的输出,类似于:

    Nmap version 7.80 ( https://nmap.org )
    Platform: x86_64-pc-linux-gnu
    Compiled with: liblua-5.3.3 openssl-1.1.1f libssh2-1.8.0 libz-1.2.11 libpcre-8.39 nmap-libpcap-1.9.1
    Compiled without:
    Available nsock engines: epoll poll select
    
  2. 现在,对 localhost 执行你的第一次扫描。此命令告诉 Nmap 检查本地机器上最常见的开放端口。

    nmap localhost
    
  3. 检查输出结果。Nmap 会列出它发现的开放端口,以及该端口的状态和关联的常见服务。输出结果如下所示,展示了为本实验准备的服务:

    Starting Nmap 7.80 ( https://nmap.org ) at ...
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.000092s latency).
    Not shown: 995 closed ports
    PORT     STATE SERVICE
    22/tcp   open  ssh
    2121/tcp open  ccproxy-ftp
    2222/tcp open  EtherNetIP-1
    3001/tcp open  nessus
    8080/tcp open  http-proxy
    
    Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
    

这次初始扫描为你提供了运行服务的地图,这是任何网络安全评估的第一步。

检测服务版本

了解哪些端口开放很有用,但对于安全分析师来说,了解这些端口上运行的确切软件和版本则更为强大。过时的软件是漏洞的主要来源。在这一步中,你将使用 Nmap 进行服务和版本检测。

我们将使用 -sV 标志,它指示 Nmap 探测开放端口以确定详细的服务和版本信息。

  1. localhost 运行版本检测扫描。为了提高扫描效率,我们将针对在步骤 1 中发现的特定端口(22, 2121, 2222, 3001, 8080),而不是扫描所有端口。

    nmap -sV -p 22,8080 localhost
    

    专业提示:针对特定端口可以显著缩短扫描时间。使用 -sV 进行全端口范围扫描可能需要几分钟,而这种针对性方法通常在几秒钟内即可完成。

  2. 将输出结果与步骤 1 的基础扫描进行比较。你现在会看到一个额外的列 VERSION,它提供了每个端口上运行软件的详细信息。

    输出会更加详细,类似于:

    Starting Nmap 7.80 ( https://nmap.org ) at ...
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.00011s latency).
    Not shown: 995 closed ports
    PORT     STATE SERVICE VERSION
    22/tcp   open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
    8080/tcp open  http    nginx 1.18.0 (Ubuntu)
    Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
    
    Nmap done: 1 IP address (1 host up) scanned in 2.15 seconds
    

这些信息至关重要。例如,如果扫描显示某个旧版本的 nginx 存在已知的严重漏洞,你就能准确知道应该把修复工作的重点放在哪里。

使用 Nmap 脚本引擎 (NSE)

Nmap 脚本引擎(NSE)是 Nmap 最强大的功能之一。它允许你使用脚本库自动化执行各种网络任务。这些脚本可用于更高级的发现、漏洞检测,甚至漏洞利用。

在这一步中,你将使用 -sC 标志,它会运行一组被认为安全且对发现有用的默认脚本。

  1. localhost 运行启用了默认脚本的 Nmap 扫描。-sC 标志是在不指定单个脚本的情况下获取更多信息的便捷方式。

    nmap -sC localhost
    
  2. 查看输出。你会看到在每个端口下缩进显示的额外信息。这就是 NSE 脚本的输出。例如,http-title 脚本可能会抓取 8080 端口上网页的标题,而 SSL 脚本可能会报告证书详情。

    输出会更加冗长:

    Starting Nmap 7.80 ( https://nmap.org ) at ...
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.000099s latency).
    Other addresses for localhost (not scanned): ::1
    Not shown: 995 closed ports
    PORT     STATE SERVICE
    22/tcp   open  ssh
    2121/tcp open  ccproxy-ftp
    2222/tcp open  EtherNetIP-1
    3001/tcp open  nessus
    | ssl-cert: Subject: commonName=localhost
    | Subject Alternative Name: DNS:localhost
    | Not valid before: 2024-07-18T03:37:05
    |_Not valid after:  2034-07-16T03:37:05
    8080/tcp open  http-proxy
    |_http-open-proxy: Proxy might be redirecting requests
    |_http-title: Site doesn't have a title (text/html).
    
    Nmap done: 1 IP address (1 host up) scanned in 0.62 seconds
    

如你所见,默认脚本发现 2121 端口允许匿名 FTP 登录,并获取了 8080 端口网页的标题。这些都是自动收集到的宝贵情报。

运行漏洞扫描

现在是寻找漏洞的时候了。NSE 包含一类专门设计用于检查已知安全缺陷的脚本。你可以运行 vuln 类别中的所有脚本来执行广泛的漏洞扫描。

最佳实践是始终将耗时或重要的扫描输出保存到文件中。我们将使用 -oN 标志将输出保存为 Nmap 的普通文本格式。

  1. 首先,让我们结合你所学的知识。运行一个包含服务检测(-sV)并执行所有漏洞脚本(--script vuln)的扫描。将输出保存到名为 vuln_scan.txt 的文件中。

    nmap -sV --script vuln -oN vuln_scan.txt localhost
    

    由于扫描会对每个开放端口运行许多脚本,因此可能需要几分钟时间。

  2. 扫描完成后,当前目录(/home/labex/project)下将创建一个名为 vuln_scan.txt 的文件。你可以使用 cat 命令查看其内容:

    cat vuln_scan.txt
    
  3. 输出文件很长,因此搜索关键词会更有效率。使用 grep 查找指示漏洞的行。单词「VULNERABLE」是一个强有力的指标。

    grep "VULNERABLE" vuln_scan.txt
    

    你应该会看到显示所发现漏洞的输出。在这个实验环境中,你可能会看到一个与 Apache 的字节范围过滤器相关的漏洞:

    |   VULNERABLE:
    |     State: VULNERABLE
    

    要查看完整的漏洞详情,你可以搜索特定的 CVE 编号或查看完整的扫描输出。例如,你可能会在 8080 端口上发现一个 Apache 拒绝服务漏洞(CVE-2011-3192)。请注意,你可能还会看到一些脚本错误(如 clamav-exec: ERROR),这是正常现象,可以忽略——当某些漏洞脚本无法在实验环境中正常执行时,就会发生这种情况。

这一步演示了如何主动探测弱点,从简单的发现转向有针对性的安全审计。

保存并格式化扫描结果

妥善记录和报告你的发现是任何安全专业人员的关键技能。Nmap 支持多种适用于不同用途的输出格式。在最后一步中,你将学习如何以多种格式保存结果并创建用户友好的 HTML 报告。

  1. 首先,创建一个专用目录以保持报告井然有序。

    mkdir -p ~/project/reports
    
  2. 现在,再次运行扫描,但这次同时以两种格式保存输出:普通文本(-oN)和 XML(-oX)。XML 是一种结构化格式,非常适合使用其他工具进行处理。

    nmap -sV -p 8080 --script vuln -oN ~/project/reports/scan_report.txt -oX ~/project/reports/scan_report.xml localhost
    
  3. XML 格式对人类来说不太易读。Nmap 提供了一个名为 xsltproc 的工具,可以将 XML 文件转换为整洁的 HTML 报告。运行以下命令生成 scan_report.html

    xsltproc ~/project/reports/scan_report.xml -o ~/project/reports/scan_report.html
    
  4. 让我们验证所有的报告文件是否已在 ~/project/reports 目录中创建。使用 ls -l 命令列出文件及其详细信息。

    ls -l ~/project/reports
    

    你应该会看到三个报告文件:

    total 40
    -rw-rw-r-- 1 labex labex 14276 Aug 28 15:12 scan_report.html
    -rw-rw-r-- 1 labex labex  5686 Aug 28 15:11 scan_report.txt
    -rw-rw-r-- 1 labex labex 14924 Aug 28 15:11 scan_report.xml
    

你现在拥有了一个用于快速查看的纯文本文件、一个用于机器处理的 XML 文件,以及一个便于分享和展示的 HTML 文件。

总结

在本实验中,你获得了使用 Nmap 的实践经验,这是网络安全领域的一项基础工具。你从执行基础端口扫描开始,以识别网络主机上的开放服务。接着,你进阶到了更高级的技术,包括使用服务版本检测(-sV)来识别特定软件及其版本。你还通过运行默认脚本(-sC)和完整的漏洞扫描(--script vuln)探索了 Nmap 脚本引擎(NSE)的强大功能。最后,你学习了将扫描结果保存为多种格式(-oN, -oX)并将其转换为易读的 HTML 报告的专业实践,以便进行分析和记录。这些技能为你将 Nmap 应用于现实世界的网络安全评估打下了坚实的基础。