NMAP-基础知识(全)

NMAP 基础知识(全)

原文:annas-archive.org/md5/8853B5DC875C56E73960020A880DBE25

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

本书旨在教读者如何运行 Nmap,这是有史以来最强大的网络安全工具之一。我很高兴能带领您学习这个工具,以及与之相关的各种不同元素,例如 Nmap 脚本引擎和其他工具,如 Ncat 和 Ncrack。在本书中,我们将学习各种技术、技巧和窍门,以帮助您快速高效地学习 Nmap 的基础知识!

本书涵盖的内容

第一章,Nmap 简介,回顾了 Nmap 的历史,工具的功能,何时使用它,产品的演变以及如何在 Windows、Linux 和 OS X 上安装 Nmap。

第二章,网络基础,介绍了网络的工作原理以及端口扫描的重要性。概述了 TCP、UDP、端口扫描、常见端口和服务横幅。

第三章,Nmap 基础,介绍了如何运行基本或普通的 Nmap 扫描,而不需要复杂的标志。

第四章,高级 Nmap 扫描,介绍了 Nmap 中可以指定不同类型扫描的高级标志。

第五章,性能优化,介绍了如何优化 Nmap 中的时间、并行等,以便高效完成扫描。

第六章,Nmap 脚本引擎简介,介绍了 Nmap 脚本引擎——它是什么,它是如何工作的,它使用的编程语言是什么,以及常用的 Nmap 脚本。

第七章,编写 Nmap 脚本,教读者如何在 Lua 中创建基本的 Nmap 脚本。

第八章,其他 Nmap 工具,介绍了 Nmap 套件中的其他工具——Nrack、Nping 和 Ncat。

第九章,漏洞评估和工具,解释了 Nmap 与专业漏洞评估中常用的其他工具之间的关系。

第十章,使用 Metasploit 进行渗透测试,介绍了 Nmap 与 Metasploit 等渗透测试工具的交互。

本书所需内容

为了跟上本书的内容,您需要一台运行 Windows、Linux 或 Mac OS X 的工作计算机。我们将安装 Nmap 和 VirtualBox 作为本书的一部分;这是两个可以帮助我们运行网络扫描的免费软件。此外,互联网或本地网络连接对于尝试扫描是有价值的。

本书的读者

本书面向有系统管理员或网络工程经验的初学者,并希望开始使用 Nmap。高级用户可以将本书用作参考,或者了解何时应该使用软件的某些关键方面。

本书的风格和方法就像是一个易于遵循的指南,充满了展示何时以及如何使用 Nmap 套件不同方面的真实示例。清晰简洁的写作使得这本入门级书籍成为一个理想的起点指南。每个主题都涵盖了来自现实世界的例子,使读者能够轻松从 Nmap 初学者进步到高级用户。

约定

在本书中,您会发现一些文本样式,用于区分不同类型的信息。以下是一些样式的示例,以及它们的含义解释。

文本中的代码词,数据库表名,文件夹名,文件名,文件扩展名,路径名,虚拟 URL,用户输入和 Twitter 句柄显示如下:“如果您想使 Nmap 比正常情况下更少冗长,还可以使用--reduce-verbosity标志。”

代码块设置如下:

  action = function(host, port)
  local robots = http.get(host, port, "/robots.txt")

  if robots.status == 200 then
    return "robots.txt status 200"
  else
    return "robots.txt status: " .. robots.status
  end
  end

新术语重要词汇 以粗体显示。例如,屏幕上看到的单词,比如菜单或对话框中的单词,会以这样的形式出现在文本中:"一旦扫描完成,点击 漏洞 将显示在目标范围上检测到的当前漏洞列表。"

注意

警告或重要提示会以这样的形式出现在框中。

提示

提示和技巧会显示在这样的形式下。

第一章:Nmap 简介

在我们开始探讨掌握 Nmap 的技术复杂性之前,了解 Nmap 本身是如何开始并作为一个项目发展的是个好主意。这个工具已经存在了近二十年,是许多技术行业中备受喜爱和经常使用的组件。

在本章中,我们将涵盖:

  • Nmap 项目的开始。

  • 工具本身的演变

  • Nmap 套件的新附加组件

  • 如何在 Windows、OS X 和 Linux 上安装 Nmap

Nmap 的谦逊起步

Nmap 起步谦卑。与今天发布的商业安全工具不同,第一个 Nmap 只有大约 2000 行代码-并且是在 1997 年在 Phrack 的第 51 期中发布的,Phrack 是一个始于 1985 年的黑客“zine”。Nmap 的时间轴是一个迷人的故事,它的成长是惊人的。Nmap 开发的一般时间轴如下:

  • 在发布时,Nmap 并没有很多功能;事实上,它只是一个基本的工具。这个版本的 Nmap 没有附加版本号,因为开发人员并没有计划发布任何未来的版本。Nmap 只是设计用来扫描目标机器上的开放端口,并且只能在 Linux 主机上运行并使用 gcc 编译。

  • 然而,在 Nmap 首次发布后仅四天,稍有改进的版本就发布了(也是通过 Phrack)-版本 1.25。即使在这个现在著名的工具的初期,就已经非常清楚,对高性能端口扫描器有极高的需求。尽管以前已经有方法来检测开放端口,但 Nmap 使得在互联网上或本地网络上评估第三方主机变得简单。黑客社区对此很感兴趣。

  • 1998 年 3 月,即 Nmap 首次发布约六个月后,该扫描器已成为地下黑客社区和蓬勃发展的信息安全行业的事实上的端口扫描器。Renaud Deraison 请求使用扫描器代码来创建一个新的漏洞评估引擎,并在获得许可后,Nmap 扫描技术成为 Nessus 的第一个版本的一部分。

  • 到 2003 年 9 月,Nmap 3.45 发布时,该项目已经发生了许多重大变化。主要开发人员 Fyodor 现在全职维护 Nmap。该工具具有许多新功能,例如服务检测、OS 检测、时间配置和优化标志(这些将在本书后面介绍),并真正达到了成熟的状态。

  • 2006 年 12 月,Nmap 项目中最重要的一个方面被整合到了所有 Nmap 构建中:Nmap 脚本引擎(NSE)。NSE 允许 Nmap 的用户编写自己的模块(使用一种叫做 Lua 的编程语言)来触发某些端口的开放,或者发现正在监听的某些服务-甚至是特定版本的服务。这个版本使得 Nmap 从一个简单的网络工具提升为一个完全强大和可定制的漏洞评估引擎,适用于各种任务。

Nmap 的许多用途

尽管端口扫描显然对安全专业人员非常重要-毕竟,如果不了解哪些网络端口是开放的,就不可能评估系统的安全性-Nmap 对其他类型的信息技术专业人员也非常有价值。

系统管理员使用 Nmap 来确定他们的系统中有哪些是在线的,以便他们了解网络上是否存在问题或不一致。同样,使用 OS 检测和服务检测,这些管理员能够轻松验证所有系统是否运行相同(希望是当前的)操作系统和网络启用软件的版本。

由于它能够改变时间,以及在不同数据包上设置特定标志(例如圣诞树扫描),开发人员可以求助于 Nmap 来测试嵌入式网络堆栈,以验证侵略性网络流量不会产生可能会导致系统崩溃的意外结果。

最后,也许最重要的是,网络和计算机工程的学生是 Nmap 的主要用户。因为它是免费和开源软件,没有障碍可以立即获取并运行该软件。即使是扫描自己的小型家庭网络的业余用户也可以通过查看哪些服务在线来学习关于他们的计算机和网络如何工作和配置的大量知识。尽管有 Windows 和 OS X 端口,Nmap 也是在 Linux 命令行上运行简单(但高级)工具的绝佳入门。

安装 Nmap

在大多数现代操作系统(Windows、OS X 和大多数 Linux 发行版)上,安装 Nmap 是一项非常简单的任务。官方的 Nmap 网站(insecure.org/)提供了 Windows 和 Mac OS X 的可下载安装程序,非常容易运行。

对于 Windows,可以在nmap.org/book/inst-windows.html找到完整的安装过程。

对于 Mac OS X,可以在nmap.org/book/inst-macosx.html找到完整的安装过程。

要在 Linux 上安装 Nmap,有几种选择。最新的“最新版本”构建始终可以从源代码安装(请参见下一段)。可以从insecure.org/网站下载 RPM 包,但大多数 Linux 发行版已经在它们的标准软件包存储库中包含了 Nmap。

在 Debian/Ubuntu 上从存储库安装非常简单。首先,运行sudo apt-get update来验证所有'apt 源'列表是否是最新的。然后,只需运行sudo apt-get install Nmap就可以下载并安装一个可用的 Nmap 版本!

提示

下载示例代码

您可以从www.packtpub.com的帐户中为您购买的所有 Packt Publishing 图书下载示例代码文件。如果您在其他地方购买了这本书,可以访问www.packtpub.com/support并注册,文件将直接通过电子邮件发送给您。

从源代码构建 Nmap

要从源代码安装 Nmap,需要执行三个步骤:

  1. 下载源代码。

  2. 编译代码。

  3. 安装编译后的工具。

使用诸如wget之类的工具下载代码非常简单;我们只需要输入wget http://nmap.org/dist/nmap-6.47.tar.bz2(或者是当前版本的 Nmap)。

一旦工具被下载,必须将其从 tarball 或压缩状态中移除。这可以通过使用tar命令,输入tar xvf nmap-6.47.tar.bz2来完成。

在这个阶段,我们现在有一个充满 Nmap 源代码的新目录。如果我们通过输入cd nmap-6.47来改变目录,我们就能够编译这段代码。对于那些熟悉在 Linux 上安装工具的用户来说,下一步将会很熟悉。我们需要./configure make 和sudo make install来安装 Nmap 到我们的系统上。

从源代码构建 Nmap

"Nmap 龙"是一幅著名的 ASCII 艺术作品,在 Nmap 源代码编译的./configure步骤中显示。

一旦 Nmap 成功安装,可以通过输入nmap -V来验证它是否工作,并查看它是用哪些选项编译的。我们将在后续章节中介绍可以传递给 Nmap 的不同标志。

从源代码构建 Nmap

摘要

阅读完本章后,您应该对 Nmap 为信息安全世界带来的精彩背景有了扎实的理解。作为一个小型项目开始,Nmap 项目现在已经成为几个行业的支柱之一。

如果您已经按照安装说明进行了安装,现在应该已经拥有一个完全功能的 Nmap 副本,可以在接下来的章节中使用。如果还没有安装,现在是一个很好的时机去安装这个工具,这样您就可以准备开始扫描、审计和评估了!

在下一章中,我们将学习 TCP/IP 网络的基础知识,以更好地理解 Nmap 如何能够评估开放端口,并找出正在运行的服务和操作系统。

第二章:网络基础知识

在我们能够将 Nmap 作为工具使用之前,我们首先需要了解它的基本工作原理。为了扫描网络(包括互联网),我们必须首先了解构建所有网络的概念。尽管本书不会深入描述网络概念 - 通过学习使用 Nmap,你不会成为数据包忍者 - 但我们确实需要确保我们能够解释标准和高级 Nmap 扫描的扫描结果。没有网络基础,我们将无法进行扫描!

本章将涵盖以下主题:

  • 网络如何工作

  • TCP 和 UDP 的区别

  • 端口简介

  • 端口扫描的工作原理

  • 服务版本检测和横幅抓取的工作原理

互联网的结构

在我们深入了解网络软件的一些复杂性之前,了解互联网本身的设计是很重要的。在许多方面,互联网的功能与您家或办公室可能拥有的大型网络相同 - 当然,不同之处在于,互联网具有面向互联网的服务,而不是工作站。例如,大多数家庭在同一个局域网LAN)上有许多计算机,但在互联网上只有一个 IP 地址。如果有人从他们的互联网连接设备扫描这个网络,他们只会看到面向互联网的服务 - 而不是每个家庭成员的个人计算机。这一点很重要,因为在互联网上,只有转发到某台机器的端口才能在给定的 IP 地址上访问。我们将在稍后看到一些例外情况。

然而,在您的局域网上扫描计算机时,通常可以看到所有打开的端口。这是因为当数据包在本地网络上传输时,而不是通过互联网传输时,您可以直接访问目标机器 - 您不必经过会阻止所有这些端口的路由器或交换机。这就是为什么,例如,在局域网聚会上托管服务器时,没有人需要在第三方设备中转发任何端口。

在本书的其余部分进行扫描时,请记住,有几个不同的因素可能有助于或阻止扫描检测到每个正在监听的服务。我们将在后面的章节中介绍一些问题,并在可能的情况下提供有用的解决方法。

OSI 模型

要理解数据包(即从一台机器传输到另一台机器的信息位)如何运行网络,最好先对开放系统互连OSI)模型有一个基本的了解。这是一种概念上的方式,可以理解网络在不同层上的工作方式。从物理上来说,网络只是带有电信号的硬件部件;实际上,理解开发人员和网络运营人员(以及计算机)使用的逻辑网络要困难得多。

最简单的解释是,不同的协议和信息位在模型的不同层上工作,并相互配合。下图简要解释了每个层次执行哪些角色,以便我们能够理解本章后面将介绍的服务横幅和端口的工作原理。

OSI 模型

要有效地使用 Nmap 并解释准确的扫描结果,并不需要完全理解 OSI 模型或低级网络,但需要意识到并非所有的网络信息都是平等的 - 有些信息在某些时候是容易获得的,而在其他时候则更难获得。如果您有兴趣从深入的角度了解更多关于网络的知识,值得查看一些可以捕获数据包或在传输中查看数据包的工具,比如 Wireshark。

端口扫描

Nmap 是一个端口扫描器,但我们还没有涵盖端口实际上是什么。顾名思义,端口是访问计算机上的网络服务的一种方式。每台计算机有 65535 个端口,可以随时打开或关闭。一些服务,如 HTTP(用于提供网页)或 FTP(允许文件传输),有默认关联的端口。HTTP 运行在端口 80 上,FTP 运行在端口 21 上,依此类推。我们可以稍后参考常用端口的大型列表,幸运的是,Nmap 已经将这些列表包含在其分发包中。

概念化端口的一种方式是想象一栋公寓楼。在这个类比中,一栋公寓楼就是一个 IP 地址,楼内的每个公寓就是一个不同的端口。在这种情况下,这栋楼将有 65535 个公寓,是一个相当大的物业!

当您访问一个 IP 地址时,就像给公寓楼送披萨一样;您知道它在世界上的位置,但不知道确切的位置。这就是端口的作用!端口类似于公寓号码;使用端口号,我们将知道我们要去 5505 Internet St,公寓 443,以传送 HTTPS 流量!

端口通常通过在 IP 地址后加冒号来识别。如果您看到类似 127.0.0.1:22 的地址,那么您可以安全地假设您被指向 IP 地址 127.0.0.1 和端口 22。

TCP 和 UDP

关于网络的一个重要概念是网络服务可以使用的两种主要协议:TCP 和 UDP。服务可以使用这些端口监听任一协议,而且经常这样做。TCP(经常显示为 TCP/IP)用于需要特定顺序的连接,例如加载网页。然而,UDP 是一种无连接的协议;无连接意味着 UDP 连接就像从一个 IP 地址(源地址)到另一个 IP 地址(目标地址)的数据高压水枪。由于互联网的工作方式,它是一个大型分组交换网络,这些数据包并不总是按顺序到达。对于像加载网页这样的事情,这将是一个巨大的问题。然而,对于其他用途,让数据以任何顺序到达是完全合理的。

例如,VoIP(语音 IP)通话通常使用 UDP 协议。对于数据到达其源的重要性更大,即使数据包丢失或顺序错乱。这样,虽然连接可能会出现轻微的听觉中断,但不会因等待数据加载而出现滞后。我们将在本书中研究的大多数服务都是基于 TCP 的,但是使用 Nmap 扫描 UDP 服务也是可能的(使用-sU标志)。然而,UDP 在成功传输数据包后不会收到回复;因此,要找出服务是否实际上正在监听给定的 UDP 端口,或者根本没有回复,可能需要花费很长时间。

服务横幅

现在我们了解了网络、端口、TCP 和 UDP 的基础知识,我们可以开始学习 Nmap 的复杂性——这是一个强大的工具,利用计算机和网络通信的各种不同元素,帮助我们获取有关各种不同计算机正在运行的服务的有用信息。

Nmap 最常见的用途,也是它最初的设计,是一个简单的端口扫描器。端口扫描器只是一种尝试连接到每个特定目标端口并查看该端口是否打开的软件,以确定是否可以建立 TCP 三次握手。

TCP 三次握手是在应用程序开始相互通信之前建立网络连接的简单方法。结构非常简单,如果现在这些标志对你来说意义不大也不用担心。正如你所期望的,三次握手是在两个通信方(我们称他们为 Alice 和 Bob)之间进行的三个步骤。握手的过程如下:

  • Alice 正在请求与 Bob 建立连接。Alice 向指定端口发送SYN给 Bob。

  • 如果 Bob 想要建立这个连接,Bob 会向 Alice 发送SYN/ACK的响应。

  • Alice 接收到SYN/ACK,并通过发送ACK给 Bob 来验证连接是否建立。

你可以通过参考以下图表来直观地理解这是如何工作的:

服务横幅

一旦你理解了如何在特定端口上建立连接,就相对容易理解最基本的 Nmap 端口扫描——即 SYN 扫描是如何工作的。Nmap 向范围内的每个端口(通常是最常见的 1000 个端口,或者主机上的全部 65535 个端口)发送一个SYN请求,并等待SYN/ACK响应。如果收到了SYN/ACK响应,那么该开放端口上有一个服务在监听。恭喜!我们现在已经介绍了基本端口扫描的工作原理。不仅仅是 SYN 扫描,还有许多不同类型的扫描,但请求/响应模型的基本思想现在应该相当清晰了。

然而,当我们扫描端口时,通常我们感兴趣的不仅仅是端口是否在线。虽然大多数 Web 服务器监听在端口 80 上(这是 HTTP 分配的端口),但有人也可以将 Web 服务器放在端口 12345 或 1337 上。重要的不仅仅是了解端口是否开放,还要了解实际监听的是什么服务。

幸运的是,Nmap 自带了一个内置的服务版本检测模块。这个功能通过创建到实际监听服务的连接,并寻找服务横幅来实现。几乎每个基于网络的服务都可以通过其初始服务横幅来识别;即使不能,协议检测也允许 Nmap 识别正在运行的协议,即使不是确切的服务器版本。我们将在下一章学习如何进行基本扫描,包括服务版本检测。

总结

阅读完本章后,你应该对计算机网络的工作原理有了基本的了解。具体来说,了解 TCP 和 UDP 的区别以及端口扫描本身的功能是很重要的。现在你知道互联网是一个非常庞大的计算机网络,你也可以在本地局域网上扫描机器,你应该有了一个坚实的基础,继续学习 Nmap 的工作原理以及你可以在各种情况下使用的高级功能。

在下一章中,我们将学习如何进行基本的 Nmap 扫描,以便在最常见的情况下获得结果。下一章将让你开始扫描不同类型的端口和服务!

第三章:Nmap 基础知识

现在我们了解了网络是如何工作的,是时候真正开始使用 Nmap 来扫描计算机和网络了。本章旨在涵盖几个主题,让您能够真正开始扫描其中的一些内容。

在本章中,我们将涵盖:

  • 如何选择目标

  • 如何运行默认扫描

  • 如何检查服务版本

  • 如何记录扫描(以及不同的日志类型意味着什么)

  • 如何指定特殊的扫描范围

  • 如何了解 Nmap 结果的推理

如何选择目标

尽管普遍认为在互联网上扫描计算机不是犯罪,但系统管理员也不欣赏。每秒都有成千上万次的扫描,涵盖互联网的各个领域,但这并不意味着如果您扫描了错误的机器就不会收到滥用投诉(或更糟)。确保您选择的任何目标都知道(并同意)您可能决定进行的任何扫描。有几种方法可以创建自己的目标,一些读者可能会发现这比在网上使用免费目标更容易。

最简单的目标,也是最容易设置的,就是在本地局域网上使用另一台计算机。您可以使用路由器(家用路由器通常位于 192.168.1.1),网络上的另一台机器(我们将讨论如何找到),甚至购买一台便宜的笔记本电脑作为测试实验室。

如果您没有其他机器可以进行扫描,或者不愿意(或未经授权)扫描其他机器,您可以通过虚拟化一台机器来创建自己的机器。虽然您需要对安装 Linux 有一定了解,但有免费软件解决方案(如 VirtualBox)和商业软件解决方案(如 VMWare 或 Parallels)可以为您虚拟化机器。如果您决定采用这种方式来扫描本书中的目标,我建议您安装 Ubuntu 或 Debian - 您也可以从这些机器上进行扫描!除了创建自己的虚拟服务器,还可以在不花太多钱的情况下从云托管提供商那里购买虚拟专用服务器VPS)。常见的提供商包括 Linode、DigitalOcean(在撰写本文时,每月只需 5 美元就可以获得 VPS)、亚马逊网络服务AWS)、Rackspace 等。在这些基于云的服务器上运行的优势是,您还可以获得运行完整的 Linux 服务器的经验。如果您愿意,甚至可以在该服务器上托管网站、电子邮件、FTP 或任何其他服务!

最后,如果您不想托管自己的虚拟机,家庭网络中没有其他机器,也不想为虚拟专用服务器付费;您可以扫描自己的机器(这并不是很令人兴奋),或者使用 Nmap 团队在scanme.nmap.org/提供的免费服务。

该网站允许您进行全面的扫描,因此您不必担心对任何网络管理员不礼貌或讨厌。另一方面,实际上无法更改此主机上正在侦听的任何服务,因此您实际上永远无法更改您获得的结果。有时使用自己的计算机(“localhost”或 127.0.0.1)可能是更好的选择,因为您可以运行服务并查看检测到的不同端口。

为了在本书中的扫描示例中使用,我们将使用scanme.nmap.org/和其他为了被扫描而设置的虚拟机。记住:未经允许不要进行扫描!

运行默认扫描

一旦安装了 Nmap 并选择了目标,使用默认设置运行扫描就相对简单了。命令就像nmap scanme.nmap.org一样简单(假设scanme.nmap.org/是这次特定扫描的目标)。

运行默认扫描

正如您在前面的屏幕截图中所看到的,运行默认扫描非常容易。通常,Nmap 使用 SYN 扫描作为默认扫描类型;但因为我们没有通过sudo以 root 权限运行扫描,Nmap 会转而使用“连接”扫描。我们将在第四章高级 Nmap 扫描中详细讨论特定扫描类型的区别。

目前,您可以看到我们已经检测到三个开放的服务。最左边的列显示了端口号和协议(在本例中为22/tcp80/tcp9929/tcp),该端口是开放的以及服务是什么。当我们运行 Nmap 而没有额外指定任何内容(比如刚刚运行的扫描),SERVICE列是根据/etc/services中的端口规范填写的(在 Linux 上),而不是实际分析协议。如果我们想要检查实际的服务版本(通过检查横幅),我们需要指定不同类型的扫描:服务版本扫描。

服务版本扫描

运行服务版本扫描非常简单;我们只需要添加一个额外的标志-sV。这意味着我们正在进行服务版本扫描,可以展示每个软件的版本。如果有人在非默认端口上运行服务(与/etc/services不匹配),这将特别有用——在这种情况下,能够准确地弄清楚正在运行的是什么更加重要。

服务版本扫描

当我们运行这个后续扫描时,您会看到结果略有不同:

您可以在前面的屏幕截图中看到,现在扫描结果中放入了更多的信息;在本例中,我们可以看到OpenSSHHTTPNping echo服务的实际补丁版本。

在安全评估的背景下,您可以看到这是多么有用!如果您正在寻找特定软件版本的漏洞,能够准确地告诉正在运行的版本是至关重要的。漏洞通常只存在于特定版本的软件中(比如 1.0.1 和 1.0.4 之间),因此我们在这里看到的细节非常重要。然而,需要注意的是,如果系统管理员限制了服务版本,则无法准确地知道正在运行的是什么。从防御的角度来看,这非常重要!

您可能还注意到在扫描结果之前,顶部显示了文本未显示:997 个被过滤的端口。Nmap 不会显示所有扫描中关闭的端口,因为那样会使扫描结果变得混乱。通过增加扫描的详细程度,可以看到这些端口(以及它们是关闭还是被过滤),我们将在第四章高级 Nmap 扫描中讨论。然而,更重要的是,您应该记住每台机器上可以打开或关闭的端口有 65,535 个。如果我们将 997 个添加到我们已经看到的三个开放的端口中,我们只得到了 1,000 个——只是总端口数量的一小部分!

默认情况下,Nmap 只会扫描通常开放的前 1,000 个端口。这不对应于前 1,000 个端口,而是通常开放的端口。您可以通过使用--top-ports 1000标志或指定不同的数字(例如--top-ports 200)来获得相同的结果。

记录扫描

尽管逐个案例地查看扫描结果在短期内非常有帮助;对于更长的评估时间(或者对于会滚动屏幕的更大的扫描),将扫描记录到文件中是一个好主意。

Nmap 支持三种不同类型的日志记录。每种类型都有一个不同的标志来记录特定的日志类型,并且有不同的目的。幸运的是,对于我们来说,Nmap 开发团队足够聪明,他们使用-oA(输出全部)标志,可以输出所有三个日志文件。这个标志的第二个参数只是日志的基本名称。它们将自动具有自己独特的文件扩展名。

记录扫描

正如你在前面的截图中看到的,Nmap 自动保存了所有三个日志文件扩展名(.xml.nmap.gnmap),并使用了在-oA标志中指定的基本文件名。

正如你所看到的,在使用-oA logbase标志运行扫描后,当前目录中现在有三个文件。现在我们有一个.xml文件,其中以 XML 格式包含了扫描的结果(以及时间详细信息),还有一个.nmap文件,它是扫描的人类可读输出。换句话说,基本上就是在运行扫描时在屏幕上看到的相同输出——也许最有趣的是.gnmap文件。.gnmap文件代表可搜索的 nmap输出,它被设计为 Linux 命令行工具grep轻松使用。换句话说,它非常容易搜索。

记录扫描

你可以很容易地看到在前面的例子中,当搜索“open”时,我们得到了包含打开端口的.gnmap文件的行。由于我们只扫描了一个主机,返回的主机必须是我们扫描的那个——scanme.nmap.org——但在更大的扫描中,找出哪些主机有任何打开的端口(以及我们可以安全忽略哪些)是非常有用的。

其次,我们对443/open进行了grep。这个grep没有返回任何结果(因为在这次扫描中端口443没有打开),但你可以看到,使用这样的可搜索输出可以快速有效地确定哪些主机有特定端口在线。当我们谈论通过 Nmap 进行主动利用时,我们将能够更好地理解这样的有价值信息。

指定的扫描范围

我们之前了解到,默认情况下,Nmap 只扫描前 1000 个端口。然而,服务可以在线上的 65,535 个端口中的任何一个,而不仅仅是最常见的端口。许多系统管理员和网络工程师在非常高的端口上运行服务,比如 65,001,这样它们就不会被普通扫描检测到。然而,通过模糊性来保护安全从来都不是真正有效的!

可以使用-p标志指定特定的端口范围。因此,如果你只想扫描scanme.nmap.org的端口80,你可以输入nmap -p 80 scanme.nmap.org。端口规范标志也适用于范围——因此,在另一个例子中,nmap -p1-1024 scanme.nmap.org将扫描目标主机上的端口11024(所有特权端口)。

此外,还有一个有用的技巧可以扫描机器上的所有 65,535 个端口:不必输入-p1-65535,你可以简单地使用快捷方式-p-。Nmap 的开发人员很友善和有远见,他们意识到频繁输入数字“65,535”会很累人!

尽管我们目前只扫描了一个主机,但值得注意的是,还有几种指定多个 IP 地址或主机名的方法。CIDR 表示法(192.168.1.0/24)、IP 地址列表(1.2.3.4,1.2.3.5,1.2.3.6)和目标文件(-iL targets.txt)都是指定要扫描的主机的有效方法。它们将以相同的扫描类型进行扫描,并且 Nmap 本身会优化所涉及的时间。我们将在第五章性能优化中更多地讨论优化这个过程。

理解原因标志

由于我们已经涵盖了基本的网络知识,包括 TCP 三次握手,在第二章网络基础中,您已经知道端口“打开”的含义,以及通常如何确定。然而,在某些边缘情况下(特别是对于filtered端口),了解 Nmap 在打开、关闭和过滤端口背后的逻辑可以极其有用。

您可以使用--reason标志来确定 Nmap 是如何得出结论的。

理解原因标志

如前面的屏幕截图所示,在调用--reason标志后,扫描后现在添加了第四列。在这种情况下,我们可以清楚地看到,被识别为在线的三个服务是因为 syn-ack,表明对 syn 请求的 syn/ack 响应——一旦我们看到给定端口上的服务正在尝试完成 TCP 三次握手,我们就知道有东西在监听。

总结

阅读完本章后,您应该能够进行许多不同和有趣的扫描类型。您还应该知道如何更改正在扫描的端口,以及如何一次扫描多个主机。您已经了解到获取服务横幅可以帮助您查看正在运行的软件版本,以及如何输出各种不同类型的日志文件。最后,您现在应该能够理解 Nmap 标记结果的网络原因。要成为真正的 Nmap 大师还有很长的路要走,但您已经掌握了进行扫描的基础知识。在下一章中,我们将学习如何进行高级 Nmap 扫描,以便在更复杂的情况下获得结果。这一章将使您能够在甚至奇怪或敌对的环境中进行扫描,这是安全专业人员在参与过程中经常遇到的情况。

第四章:高级 Nmap 扫描

现在你完全能够对各种主机运行 Nmap 扫描了。太棒了!知道如何运行基本扫描将帮助你解决许多情况,但有一些值得注意的例外情况——以及不同的扫描类型——对于成为高级用户是至关重要的。

我们现在将具体介绍不同的主机检测方法(以便你知道要扫描什么),如何对试图隐藏自己的设备进行扫描,扫描 UDP,不同的详细程度选项等等。

在本章中,我们将涵盖:

  • 运行 ping 扫描

  • 运行 ping 不可知扫描

  • 扫描 UDP 服务

  • 在扫描中运行不同的 TCP 标志——比如圣诞树扫描

  • 操作系统检测

  • 增加 Nmap 输出的详细程度

  • 显示扫描中的数据包跟踪

主机检测方法

为了有效地扫描主机,首先了解如何检测“活着”或在线的主机是很重要的。因为许多系统管理员试图将他们的系统隐藏在互联网上,某些主机在进一步探测之前会显得离线。幸运的是,Nmap 有几种方法来检测哪些主机是在线的。

检测主机的最直接方法是运行 ping 扫描。ping 或 ICMP 回显请求是机器设计用来响应的简单的“你在那里吗?”的问题和答案对话。

Ping 是以声纳命名的——潜艇发送的水下“ping”,用于探测该区域内的其他船只和潜艇——并且对计算机起着类似的作用。虽然你可以通过简单地输入ping google.com来轻松测试 ping 命令,但使用 Nmap 进行 ping 扫描可以在更大的目标网络范围内实现显著的效率提升。

使用-sn标志在 Nmap 中运行ping only扫描非常容易。这确保只运行 ping 扫描,而不是完整的端口扫描——这非常适合找出哪些主机在线。

主机检测方法

在前面的屏幕截图中,作为-sn(ping 扫描)扫描运行,你可以清楚地看到在扫描的 256 个 IP 地址中,有 18 个是“up”,或者对 ping 做出响应的。

然而,有时你需要进一步地采用这种扫描方法。为了从扫描中“隐藏”,系统管理员经常会让他们的系统忽略 ping 请求。这通常是一个有效的方式来隐藏网络扫描!

运行 ping 不可知扫描

当系统从 ping 扫描中隐藏时,很难知道什么是在线的。幸运的是,Nmap 提供了一种 ping 不可知的扫描方法,可以非常有益地解决一些这些问题。

当 Nmap 运行“正常”扫描时,它将首先运行 ping 扫描,然后进行实际的端口扫描(扫描指定的端口范围)。如果主机不响应 ping,它们将不会被完全扫描——这意味着即使它们有在线服务,这些服务也不会被检测到。在运行端口扫描时,丢失服务或主机是一个非常严重的问题!

通过使用-Pn标志运行扫描,Nmap 将完全跳过运行初始的 ping 扫描,并扫描指定目标范围内的所有主机。虽然这通常需要更长的时间来运行——因为扫描真正离线的主机是一个很大的时间浪费——但它非常有用,可以找到可能被忽略的主机。

运行 ping 不可知扫描

你可以在前面的屏幕截图中清楚地看到dshaw.net——我的个人网页,在这次扫描的目的是配置为不响应 ping——仍然在这次 ping 不可知扫描中被扫描到。在扫描大范围——比如一个 B 类网络——能够检测到试图隐藏的主机对于安全专业人员来说是非常宝贵的。

虽然它不是一种特定类型的扫描,但使用 Nmap 的-sL标志—或者进行简单的列表扫描的能力—来 ping 或扫描目标范围也是有用的。这对于获取反向 DNS 查找以及了解指定范围内有多少主机在线非常有用。

通过这种扫描—或者说不扫描—的方式,可以获得出色的结果。

运行无视 ping 的扫描

在前面的屏幕截图中,您可以看到 Nmap“列出扫描”的范围指向由 Google 拥有的1e100.net域。这被称为零数据包侦察,因为实际上没有向任何相关域发送探测,但实现了完整的 DNS PTR 记录查找。

在主机检测和发现方面,最后一个伟大的 Nmap 功能是 TCP SYN ping 扫描。与发送 ICMP ping 请求(许多管理员禁用响应)不同,TCP SYN 扫描可以在给定端口对 SYN 请求做出响应的主机上处理在线主机。例如,如果您正在扫描通常运行 SSL Web 服务器的一组 IP 地址,调用-PS 443标志将在端口 443 上尝试连接时对在线主机进行处理。这非常有用,是 Nmap 主机检测工具中最有价值的功能之一。

扫描 UDP 服务

到目前为止,我们已经提到了 UDP 服务,但还没有讨论如何实际扫描它们。UDP 服务是无连接的,这使得扫描它们比传统端口扫描更加困难—有时需要基于协议的连接才能收到任何响应,即使大多数服务收到实际响应,也可能需要大量时间—换句话说,扫描 UDP 服务通常比它们的 TCP 对应物更慢且不太可靠。

尽管如此,重要的是能够扫描仅监听 UDP 的服务。例如,许多 VPN 的监听端口仅为 UDP。同样,NTP 和 DNS 通常仅监听 UDP 端口。因此,了解如何扫描它们非常重要。

这里的警告是,通常最好先进行 TCP 扫描,然后再进行 UDP 扫描。这很重要,因为让整个扫描等待 UDP 响应可能会使原本应该在五分钟内完成的扫描花费超过五个小时!

扫描 UDP 服务的标志只需调用-sU。确保在等待扫描时要有足够的时间。

注意

另外,UDP 扫描需要 root 权限才能运行。

扫描 UDP 服务

对于tick.ucla.edu的扫描显示,端口123网络时间协议NTP)—可以从互联网的任何地方接受连接。

特殊的 TCP 扫描

我们已经介绍了 Nmap 建议的两种基本扫描类型—TCP 连接扫描(-sT)和 SYN 隐蔽扫描(-sS)。这些“全”和“半”连接扫描几乎可以应对任何情况,并且绝对是几乎每个安全专业人员、系统管理员、网络工程师和爱好者的“首选”扫描类型。

然而,尽管这些类型的扫描可以产生灵活性,但有时也有理由尝试在数据包上使用不同的标志。对于这些扫描,我们将介绍三种新的扫描类型:FINXmas TreeNull扫描。

运行这些扫描的驱动概念是,关闭的端口将尝试通过发出 RST(复位)数据包来重置连接,而打开的端口将完全放弃连接。这很有用,因为许多入侵检测系统IDS)都在寻找 SYN 扫描—而隐秘的渗透测试人员绝对不想被发现!

特殊的 TCP 扫描

这三个新选项中的第一个,FIN 扫描,是通过向每个端口发送 FIN 数据包开始的。

如前面的示例扫描所示,当对我的网页服务器运行 FIN 扫描(-sF)时,对 FIN 请求没有响应——这是有道理的,因为dshaw.net的 80 端口上有一个活动服务运行。

下一个扫描类型被称为 Xmas Tree 扫描,因为它就像一个数据包被点亮像圣诞树一样! Xmas Tree 扫描(-sX)通过在数据包头上标记 FIN、URG 和 PUSH 标志来工作。

这三种扫描类型中的最后一种是空扫描,它在发送到目标端口的数据包头上不设置任何标志。可以使用-sN选项启动此扫描。确保如果要启动空扫描,您要大写N——否则,您将意外地运行一个 ping swing(我们在主机检测方法部分中介绍过)。

尽管这些扫描类型通常非常有用,但值得注意的是,FIN、Xmas 和 NULL 扫描已知在 Microsoft Windows 主机上不起作用。

操作系统检测

尽管扫描端口并使用不同的数据包头以产生最佳、最准确的结果非常有用,但简单的端口扫描并不总是能够可靠地实现一些事情。其中最重要的一个元素是操作系统检测。

在尝试识别和攻击目标时,最有用的信息之一是该机器正在运行的操作系统。因为许多软件可以在多个操作系统上运行,这在传统上是一个“难”解决的问题。然而,Nmap 的开发人员——在整个信息安全社区的帮助下——已经能够编制出一个数据库,其中包含最常见(甚至一些非常罕见)的操作系统指纹,这些指纹可以始终帮助识别目标正在运行的操作系统。这是一个容易记住的标志——您只需使用-O标志调用扫描即可。

操作系统检测

正如您所看到的,这次对思科安全设备的扫描很容易识别出了关键信息的几个部分。首先,我们可以看到 MAC 地址——以及谁创建了该设备。请记住,正如我们在第二章中所学到的那样,网络基础,我们只能在局域网上扫描到 MAC 地址——而不能在互联网上扫描到。其次,我们可以看到 OS CPE——甚至是 OS 的详细信息:思科 SA520 防火墙,运行 Linux 2.6 内核。这绝对是我们可以从端口扫描中提取出的最有价值的信息之一。

尽管如果操作系统检测总是像本例中那样简单明了就好了,但事实并非如此。不过,好消息是,一旦开始操作系统扫描,Nmap 将尝试评估其对给出的结果的信心程度。在下面的示例中,您可以看到,尽管 Nmap 并不完全确定我的机器正在运行什么操作系统(考虑到补丁经常改变底层操作系统的工作方式,这是有道理的),但它仍然可以给我们一个相当好的想法!

操作系统检测

增加扫描的详细程度

正如您可能在整本书中已经注意到的那样,运行扫描时几乎总是获得更多信息更好。幸运的是,Nmap 的开发人员允许我们通过增加详细程度来快速轻松地在扫描时检索信息。

详细程度允许在扫描运行时直接在控制台上显示时间、并行性和内部调试信息。这对于找出何时需要尝试通过几种方式优化扫描非常有用(我们将在下一章中了解)。在增加详细程度的扫描中,您还可以按Enter键查看扫描的进度和完成当前目标文件之前还有多远。有几种不同级别的详细程度,但我通常使用第三级。

冗长度的第一级提供了关于扫描进度的基本信息,并可以通过使用-v标志来调用。第二级冗长度提供了更多信息,包括一些网络和数据包信息,并可以通过使用-vv作为标志来调用。最后,三重冗长度提供了扫描的最多信息,可以通过使用-vvv标志来调用。如果您希望使 Nmap 比正常情况下更少冗长,您也可以使用--reduce-verbosity标志。

增加扫描的冗长度

您可以在上述截图中看到,在这个单端口扫描中,显示了更多的时间和数据包信息。这可能非常有用,特别是在长时间扫描中,比如包括超过 1000 个主机的扫描,以更好地了解 Nmap 在进行时正在做什么。更重要的是,这些信息可以用来确定是否需要进行时间、并行性或其他性能调整。例如,如果扫描正常进行,但每次只完成了少数主机,我们就知道要增加并行性以使整体扫描更快。然而,如果我们收到网络超时错误,我们就知道我们扫描得太快了,这种情况下,我们会想要使用一个更慢的timing标志。

数据包跟踪

与增加扫描的冗长度类似,了解主机之间发生的网络跳数以及实际经过的网络流量是非常宝贵的。虽然可以使用系统工具如traceroutetcpdump来找出目标服务器在网络上的位置,但对许多主机同时进行这样的操作可能是一个痛苦(且耗时)的过程。

Nmap 允许对每次扫描进行数据包跟踪,而不是使用外部工具,这显示了我们需要的确切信息。不要把这看作是一个安全功能(尽管它确实有与安全相关的用途),最好把它看作是系统管理员和网络工程师的工具。

数据包跟踪

这个数据包跟踪示例显示了 Nmap 到目标机器的 tcpdump 风格输出。虽然在这个简单的单端口扫描中它并没有提供过多的价值,但这些信息对于理解网络拥塞、数据包丢失、离线主机等在更大的扫描中是非常有用的。

摘要

在本章中,我们介绍了如何选择目标,运行默认扫描,检查服务版本,记录扫描(以及不同日志类型的含义),指定特殊扫描范围,并了解 Nmap 结果的原因。

在下一章中,我们将讨论如何确保您的扫描运行在最佳性能。Nmap 具有几个功能可以帮助扫描快速运行,并尽可能准确地提供结果。这些时间、并行性和性能改进将在下一章中进行分类和解释。

第五章:性能优化

我们现在完全能够扫描许多不同类型的主机,并克服系统管理员和网络工程师用来保护或隐藏他们的机器的各种方法。太棒了!在这一点上,我们将开始研究 Nmap 可以解决的一些更广泛的问题:特别是,如果我们尝试扫描可能会导致性能中断的大量 IP 地址。

不幸的是,使用我们在上一章学到的高级 Nmap 选项可能会使扫描花费比我们预期的时间更长。性能优化技术是一些最少使用但最有用的 Nmap 标志,因此值得好好学习它们—并在需要时使用它们。

在本章中,我们将涵盖:

  • 基本的 Nmap 时间优化

  • 自定义主机组大小

  • 如何增加或减少 Nmap 的并行性

  • 如何处理卡住的主机

  • 如何延迟(或增加)单个数据包的速率

Nmap 时间优化

使扫描运行更快的最简单方法是使用内置的timing标志。这些标志使用-T和数字从 1(最慢)到 5(最快)来调用。默认的扫描速度是-T3,正好在中间。

使用显著更快的扫描存在一些风险,因为它会在扫描中产生某些不可靠的方面。特别是,如果您的网络接口被认为是可靠的,这些选项应该谨慎使用!

默认的时间标志改变了六个不同的元素—其中许多我们稍后会详细介绍。具体来说,时间标志改变了initial_rtt_timeoutmin_rtt_timeoutmax_rtt_timeoutmax_parallelismscan_delaymax_scan_delay的各个值。如果这些标志对您听起来很奇怪,不要担心—我们将详细介绍您需要了解的不同标志,以便您能够调试各种网络和性能问题。

Nmap 时间优化

前面的截图是从www.professormesser.com/下载的,显示了-T标志在各种不同方式上的优化。最重要的区别是在-T3-T2之间的并行到串行转换(意味着主机不再同时扫描),以及整体上显著的超时差异。

系统管理员也通过增加响应时间来减少目标的脆弱性,因为大部分时间主机信息可以从 TTL 值中读取。

运行“疯狂”扫描显然可以使大型网络块更快,但有趣的是,另一端的“隐秘”和“偏执”扫描(-T1-T0)在“隐藏”端口扫描方面非常有效。

如果我们在进行渗透测试时,入侵检测系统和入侵预防系统正在运行,运行这些慢速扫描可能非常有益。

Nmap 时间优化

正如您在前面的截图中所看到的,对scanme.nmap.org进行的-T5扫描(包括所有端口)只花了一分钟(一秒),这在time命令的输出和 Nmap 自己的时间计算器中都可以看到。另一方面,运行一个“隐秘”的-T1扫描花费的时间要长得多。

为了展示长期慢速扫描的真实效果,我们对同一台主机运行了一个-T1扫描—您可以在这里看到,经过十六个小时,扫描仍然只完成了 2.75%—这是一个非常慢的扫描!很容易看出,我们不希望这些扫描选项通过大量的 IP 地址,但是在客户参与中额外隐蔽(比如运行 IDS 或 IPS 的客户)可能非常宝贵。

Nmap 时间优化

自定义主机组大小

为了有效地扫描主机,Nmap 使用同时扫描的主机组。假设你的互联网连接(和计算机处理能力)足够,通常最好增加主机组的大小以快速完成大型扫描。例如,如果你正在扫描 1000 个主机,主机组大小为 250,那么只需要四次“扫描”就可以并行完成整个扫描。

然而,一个人应该仔细权衡他们通过改变主机组大小所希望实现的目标。一次扫描许多主机的好处是明显的,但坏处可能并不明显——如果你正在扫描一个大组,你必须等待整个主机组完成扫描,然后才能看到任何结果并继续下一个组。如果你想快速看到结果,一个较小的主机组对于你的特定扫描会更好。

默认情况下,Nmap 会尝试采取动态的中间路线来处理主机组大小:它会动态改变主机组以适应详细扫描(这样我们可以看到发生了什么)和效率(这样完整扫描会很快完成)。Nmap 从 4 或 5 开始主机组,并将它们自动增加到 1024。

然而,如果你正在寻求精细调控,有两个主机组标志你应该记住:--min-hostgroup--max-hostgroup。例如,如果你计划扫描一个完整的 C 类网络,指定一个大小为 256 的组将在一个大的并行通道中完成这次运行,大大提高了扫描引擎的效率。

值得注意的是,主机组规范对主机发现扫描并不起作用,包括 ping 扫描——Nmap 将自动使用非常大(通常为 4096)的主机组,以便使这些扫描运行高效。

增加和减少并行性

尽管我们刚刚学到的主机组大小定制可以帮助增加或减少完整扫描的并行性,但它并不处理同时发送的探测数量。然而,实际的并行性标志可以帮助我们处理这个问题!

和许多事情一样,Nmap 会尝试自动创建最有效的扫描组,这对几乎所有情况都很好。根据我的经验,在没有进行严肃的网络教育的情况下,改变同时发送的探测数量可能会导致灾难,但并非总是如此。

通过增加--min-parallelism的值,比如增加到 10 或 12,你可以强制 Nmap 至少以这样的速度进行扫描。Nmap 仍然会使扫描运行得更快,如果需要的话,这样可以减少一些风险。

另一方面,将--max-parallelism的值设置得低至 1 是非常有用的;这样可以强制 Nmap 一次只发送一个探测,但也会使工具运行得非常慢(正如你所想象的那样)。我们可以利用这样的技巧来愚弄安全系统,或者确保我们的扫描可靠性永远不会受到网络相关问题的影响。

如果你看到主机似乎无法完成,或者你非常关心当前组中扫描的主机数量,调整并行性可能非常有用。

处理卡住的主机

不幸的是,当处理大量 IP 地址块时——如果你正在扫描一个大型企业,无论是出于内部安全目的还是作为客户参与,这是一个非常常见的情况——遇到卡住的主机并不罕见。

当一个主机卡住时,意味着有些东西阻止了扫描以正常速度完成。这可能是由于一些无害的原因,比如连接的任一端出现了网络故障,也可能是更有意图的原因,比如一个安全软件故意使目标主机响应非常缓慢或不一致——有效地破坏了扫描。

为了演示目的,我将开始对我的网络上不存在的主机进行一个 ping 不可知(-Pn)扫描。你无法从中获得结果,但扫描可能需要很长时间。

处理卡住的主机

您可以在上面的截图中看到,扫描这个不存在的主机花了 1,051 秒,或者十七分钟。Nmap 尽其所能改变 RTT 变量,试图补偿任何网络问题,但最终花了很长时间才意识到那里什么都没有。想象一下,如果您正在扫描一个 B 类网络会发生什么!我们将等待几天、几周或几年才能完成扫描。没有人想看一个无响应的 Nmap 屏幕!

处理卡住的主机

在对一个不存在的主机进行第二次扫描时,我们保持了相同的标志,但将--host-timeout更改为 1 分钟。如您所见,60 秒后,Nmap 放弃了对主机的扫描,并完成了扫描——这比完成扫描所需的时间少了十七分之一!

--host-timeout标志非常有用,特别是在大型扫描中,但要确保不要将时间设置得太低——否则 Nmap 会放弃仍在积极扫描的主机!在许多评估中,我的团队会将--host-timeout设置为 10 分钟,这通常足够多个端口扫描在每个主机上完成而没有任何错误。结合并行性和主机组定制,设置主机超时标志可以节省大型目标主机的大量时间。

延迟和增加探测速率

最后一个重要的定时改进标志是直接延迟和增加速率。这可能是性能优化中最精细调整的部分,通常只有在您试图解决特定问题或创建特定情况时才会使用。

其中一个标志--scan-delay指定了 Nmap 在探测之间等待不做任何事情的时间。这在减慢扫描速度(有时候加快扫描速度,使用较低的 scan-delay)方面非常有用。再次强调,减慢扫描的最常见用途是为了避免目标管理员或安全系统的检测,或者尝试避免网络限速问题。由于许多系统使用请求速率来确定机器是否受到攻击,这可以是一种非常隐秘的技术,而测试人员几乎不需要付出太多努力。还值得注意的是,--max-scan-delay可以与其他定时标志一起使用,以取代它们,并确保扫描延迟永远不会慢于某个时间。

延迟和增加探测速率

您可以在上面的截图中看到,将--scan-delay增加到 5 秒使得四个端口扫描(加上 ping 扫描)花了 41 秒。效率不高,但完美地掩盖了发生的事情!

最后,也可以使用--min-rate--max-rate的组合来直接控制 Nmap 的速率,从而控制发送到网络上的每秒数据包数量。值得注意的是,Nmap 对这些设置的内部控制非常好,但偶尔需要更精细的控制。通过设置诸如--min-rate 1--max-rate 100的标志,我们可以允许 Nmap 的内置定时引擎控制效率,但永远不会发送超过 100 个数据包或少于 1 个数据包。与许多这些标志一样,重要的是永远不要将最小值设置得太高或最大值设置得太低!

总结

本章教会了我们一些非常有价值的定时标志——Nmap 足够灵活,包括许多选项,可以帮助我们确保完全控制定时,以最大限度地提高效率并克服潜在的问题。

在本章中,我们涵盖了基本的 Nmap 定时优化、定制主机组大小、如何增加或减少 Nmap 的并行性、如何处理卡住的主机,以及如何延迟(或增加)单个数据包的速率。

在下一章中,我们将讨论 Nmap 最有趣和强大的功能之一:Nmap 脚本引擎(NSE)。我们将讨论 NSE 是什么,它能做什么,以及如何使用它调用有趣的脚本。

第六章:介绍 Nmap 脚本引擎

尽管进行端口扫描是使用 Nmap 工具套件的一个重要部分,但 Nmap 的开发者创建了一个非常强大的引擎,内置在工具中:Nmap 脚本引擎NSE)。本章介绍了 NSE,并涵盖了使用可靠编写的脚本在 Nmap 脚本存储库中进行侦察扫描所需的所有主题,以包括远不止开放了哪些端口和哪些服务正在监听。

在这一章中,我们将涵盖:

  • NSE 的历史

  • NSE 的工作原理

  • 如何找到现有的脚本来使用

  • 如何使用 NSE 运行脚本

NSE 的历史

到了 21 世纪中期,Nmap 已经确立自己作为端口扫描工具和安全工具的领导者,无论是开源还是非开源的。尽管不断创新和优化是一场持续不断的战斗,但 Nmap 只能被认为是一个非常成功的项目。

由于其受欢迎程度,以及它是一个具有相对高知名度的开源项目,Nmap 被选中多次参加 Google Summer of Code。Google Summer of Code 是一个软件开发实习/协会项目,期间学生们被选中并加入开源软件团队,为现有项目构建新功能。

2006 年 5 月,当时发布的 Nmap 版本只有 4.0 时,Nmap 被选为其第二个夏季代码。在 2005 年的前一年,学生们为 Nmap 项目编写了一种当代的 Netcat 实现(称为 Ncat),将 Nmap 的 OS 检测升级到了第二代(更好的一代),并创建了一个小型、简化的 GUI,后来成为 Zenmap。

在第二次运行中,经过第一个夏季的极其成功之后,参与开发的开发者们变得更加雄心勃勃。由于 Nmap 显然拥有出色的功能集,为什么不让这些功能可以被更广泛的社区扩展呢?新的漏洞和扫描技术正在被频繁地开发,而完整的 Nmap 版本无法跟上安全专业人员需要评估的事物。每当出现新的漏洞时,安全专业人员(以及恶意黑客!)会使用 Nmap 扫描易受攻击的服务,但只能通过手动分析来测试软件版本是否易受攻击:显然,这不是一个非常有效的时间利用。

由于 Google Summer of Code 开发者提供的新资源,创建了一个任意的脚本框架,允许用户基于特定的开放端口或服务触发额外的检查。这意味着,例如,如果你想在所有 Web 服务器上查找特定文件,比如robots.txt,你可以轻松地创建一个脚本,在所有 HTTP 和 HTTPS 服务上进行检查。NSE(以及在 Nmap 的默认安装中包含 Nmap 脚本)真正改变了工具套件的多功能性。

经过数月的辛勤工作,NSE 于 2006 年 12 月发布,与 Nmap 4.21ALPHA1 版本一起打包发布。随着 NSE 打包的脚本在复杂性和可用性上不断增长,它们成为了将 Nmap 转变为一个功能齐全的安全工具套件的绝佳资源。

NSE 的内部工作

NSE 是一个运行使用 Lua 编写的代码的框架,具有引擎可以解析的特定标志。Lua 是一种轻量级、快速、解释性的编程语言,最著名的用途是为《魔兽世界》等电脑游戏编写用户界面的脚本语言,它具有与其他当代解释性语言类似的语法。

如果你曾经见过用 Python 或 Ruby 编写的代码,Lua 对你来说就不会太陌生。

NSE 的内部工作

前面的截图显示了一个 Nmap 脚本,用于识别有关比特币的信息(由 Patrik Karlsson 编写)。如果你还不理解,不要担心,我们将在第七章《编写 Nmap 脚本》中进行讲解,但你可以看到用于生成相对复杂的 Nmap 脚本的代码看起来非常简单。这就是 NSE 的全部意义所在!安全工程师和系统管理员过去需要导出 Nmap 结果,查找他们正在寻找的信息,然后使用第三方工具来帮助他们;现在他们可以找到一个符合他们目的的脚本,或者自己编写一个简单的脚本。许多渗透测试人员可以利用 Nmap 脚本语言甚至将该工具武装化以进行安全漏洞利用,我们将在第十章《使用 Metasploit 进行渗透测试》中详细介绍。

查找 Nmap 脚本

许多 Nmap 脚本已经随 Nmap 一起打包在您的系统上。然而,确定您想要为每个特定的扫描或评估运行哪些脚本可能会很困难。幸运的是,NSE 文档门户是整个 Nmap 项目中最深入和文档最完备的方面之一。

注意

通过访问nmap.org/nsedoc/,您可以查看所有包含在官方 Nmap 脚本存储库中的脚本。

查找 Nmap 脚本

前面的截图显示了Nmap 脚本引擎文档NSEDoc)参考门户网页,以及撰写本书时的所有官方 Nmap 脚本。每个脚本旁边都有一个小段落,简要描述了它的设计目的。撰写本书时,官方文档中有 490 个和 113 个 Nmap 脚本,这是您可以使用 NSE 做的很多事情!

这些脚本分为几个类别,每个类别都有自己特定的用例。值得注意的是,有时这些脚本可以属于几个类别,具体取决于脚本的完整功能。这些类别及其定义如下:

  • 认证:这些脚本尝试对服务进行身份验证,并可以验证找到的凭据

  • 广播:这些脚本广播某些协议,以了解它们是否正在监听

  • 暴力:这些脚本尝试对网络服务进行暴力或基于字典的攻击

  • 默认:这是扫描启动时可能运行的脚本的默认类别

  • 发现:这些脚本尝试从主机和网络服务中枚举敏感信息

  • 拒绝服务(DoS):这些脚本可能会对正在扫描的服务造成破坏

  • 利用:这些脚本尝试执行利用给定漏洞的攻击

  • 外部:这些脚本查询第三方数据库,如 DNS 黑名单,以收集有关目标的额外信息

  • 模糊器:这些脚本向服务发送随机的“垃圾”信息,以尝试找到软件中的缺陷

  • 侵入式:这些脚本是可能对服务本身造成损害或具有侵入性的脚本的总类别

  • 恶意软件:这些脚本尝试查找已知恶意软件的实例

  • 安全:这些脚本已经验证不会对服务器造成伤害

  • 版本:这些脚本尝试以比普通服务版本检测更深入的方式识别特定版本以及信息泄露的特定服务

  • 漏洞:这些脚本识别服务中已知的漏洞

重要的是要知道要运行哪些类别,因为其中几个类别(特别是 DoS、exploit 和 intrusive)可能对弱系统或生产系统造成危险。在安全评估中包含这些 Nmap 脚本可以极大地增加 Nmap 的效用。

运行 Nmap 脚本

运行 Nmap 脚本很容易——有些脚本,例如“默认”类别,甚至会作为正常扫描的一部分自行运行。有些脚本旨在简单地提供有关目标的附加信息,而其他脚本则会积极利用它(“exploit”类别)甚至使其脱机(“DoS”类别)。

运行 Nmap 脚本的第一步是验证脚本是否存储在本地。与 Nmap 工具本身不同,Nmap 脚本存储库经常更新,因此最好始终验证是否有最新版本。您可以通过运行带有 --script-updatedb 标志的 Nmap 来更新 NSE 脚本,该标志会更新脚本数据库。

运行 Nmap 脚本

更新脚本数据库后,可以使用 --script 标签选择脚本。您可以选择特定目的的特定脚本,也可以选择广泛的脚本类别。幸运的是,Nmap 开发人员允许一次选择多个脚本类别。例如,假设我们想运行所有默认脚本,但也想运行所有侵入性脚本;我们可以使用 --script defaultintrusive 标志运行扫描:

运行 Nmap 脚本

您可以在上述截图中看到,在此处运行 default 脚本明显立即标记了几个发现。如果您使用 -vv 运行相同的扫描以启用双重详细模式,您还可以看到加载到给定目标的脚本数量(在本例中为 93)。在这种特定情况下,http-title 脚本在扫描结果中显示了 HTML 标题(Go ahead and ScanMe!)。

如果按类别或多个类别选择扫描太多,您还可以按其特定名称选择扫描,或使用通配符。例如,如果我想扫描 Web 服务器并加载默认扫描存储库中的所有 HTTP 模块,我将使用 --script "http-*" 标志进行扫描:

运行 Nmap 脚本

您可以看到,使用 "http-*" 通配符脚本名称启动扫描可以加载每个脚本,但会出现一些错误。某些脚本需要参数,因此如果加载了许多脚本,了解正在加载的脚本非常重要。可以准确在 HTTP 端口触发的脚本仍将启动,但需要额外信息的脚本将失败(并且不会返回任何有用信息)。要向 Nmap 脚本提供额外信息,可以使用 --script-args 标志提供参数。

最后,可以通过在括号中包含不同标签来组合不同选项以启动脚本。例如,如果要启动符合默认、安全或侵入性类别的脚本,但明确不想启动针对 Web 服务器的任何脚本,可以使用 --script(default、safe 或 intrusive)标志,而不是 "http-*"。始终记住,or 标志不是排他性或——意味着两个类别中的脚本仍将运行——但两个部分都必须有 and

尽管 Nmap 脚本存储库非常全面,但如果您认为某个特定脚本可能有用而未发布,还是值得在互联网上寻找其他地方。许多安全研究人员的博客会有特定目的的 NSE 脚本,在尝试编写自己的脚本之前,最好先在搜索引擎上查找!

总结

本章介绍了 NSE,它可以是 Nmap 工具套件中最有用、多功能和引人入胜的功能之一。我们现在应该能够启动扫描,不仅仅是端口和服务版本,Nmap 脚本实际上可以与正在监听的服务进行交互,并且在某些情况下甚至可以利用漏洞!

在本章中,我们涵盖了 NSE 的历史,NSE 的工作原理,如何找到现有的脚本并使用它们,以及如何使用 NSE 运行脚本。

在下一章中,我们将学习如何使用 Lua 编写基本的 Nmap 脚本。尽管已经存在许多脚本用于各种各样的任务,但自定义的内部使用可能需要编写我们自己的脚本。

第七章:编写 Nmap 脚本

现在我们已经了解了 NSE 的工作原理,是时候学习如何编写我们的第一个 Nmap 脚本了。由于编写 Nmap 脚本的多功能和极其定制化的特性,有几种不同的方法可以编写执行各种功能的脚本,编写自己的脚本也有许多利弊。

虽然从头开始创建 Nmap 脚本可能并不总是最快的方式(因为几乎总会有一个已经存在的脚本来满足你可能需要的任何目的),但在某些情况下,利用 Nmap 脚本引擎的强大内置功能会导致创建自己的脚本正好具备正确的条件。

在本章中,我们将涵盖以下主题:

  • Nmap 脚本的解剖

  • 编写 Nmap 脚本的头部

  • 创建规则

  • 定义脚本的动作

  • 调试 Nmap 脚本

Nmap 脚本的解剖

Nmap 脚本由几个独特的部分组成,每个部分定义了脚本执行的不同区域,或者 Nmap 解释预期输出的方式。我们必须始终在创建的任何脚本中包含几个主要区域,以确保脚本能够有效运行(并且 Nmap 能够理解如何解释数据)。

尽管 Nmap 脚本是用 Lua 编写的,这是一种解释性编程语言,但重要的是要记住这些脚本不是可以独立运行的可执行文件。与其将 Nmap 脚本作为要求运行的脚本,不如将 Nmap 脚本视为一种独特的 Nmap 编程语言的一套指令。

Nmap 脚本由三个独特的部分组成:

  • 头部:Nmap 脚本的这一部分包括脚本的文档和分类,以便 Nmap 和 NSE 数据库可以成功地将脚本分类到适当的领域。

  • 规则:脚本的这一部分准确地定义了 Nmap 脚本在何处以及如何执行。因为脚本在运行时利用了 Nmap 扫描的数据,某些元素可以触发脚本的运行。这实际上是一个触发器,用于评估脚本是否应该执行。

  • 动作:最后,脚本的这一部分就是(你猜对了!)动作发生的地方。这是脚本的一部分,它在头部定义了脚本,规则触发了动作之后进行了大量的处理。

现在我们已经学会了 Nmap 脚本是如何组成的,是时候开始动手写一个了。因为每个 Nmap 脚本都是如此独特,我们将重新创建一个已经存在的脚本,但这个脚本展示了 NSE 的强大之处。

我们这个脚本的案例研究将是编写一个简单、易于遵循的 Nmap 脚本,利用 Nmap 的内置功能(结合 NSE 的强大功能)来确定 Web 服务器是否有robots.txt文件。robots.txt文件指示网站的哪些区域应该(和不应该)被网络爬虫和搜索引擎索引,并且通常列出了不应该被索引的敏感目录。因此,它们对于安全专业人员和渗透测试人员来说非常有趣,因为正是这些敏感文件和目录是我们正在寻找的!

定义 Nmap 脚本 - 脚本头部

每个 Nmap 脚本必须在脚本开头定义了某些必需的变量。脚本执行所需的任何 Nmap 先决条件、脚本分类的定义(例如是否具有侵入性、安全性、包含漏洞等),以及许可证也是头部中必需的内容。

定义 Nmap 脚本 - 脚本头部

前面的屏幕截图说明了 Nmap 脚本所需的各个部分,这些部分对程序的成功执行至关重要。让我们按顺序走过这些元素,以确定脚本的作者在做什么。

首先,定义了几个变量(由本地前缀定义)。为了确保每个 Nmap 元素都被适当地包含,做出了几项要求。

接下来,创建了一个更长的变量 - 描述。这是一个多行 Lua 变量,它被封装在[[]]括号中。这个区域应该包括 Nmap 脚本的基本描述,以便在以编程方式运行时,可以选择正确的脚本。

在描述变量下面是一个完全注释的文本块,定义了脚本的用法。在 Lua 中,--前缀注释掉了该行代码,使其在执行脚本时不运行。您可以轻松地看到@usage块的格式 - 简单地显示脚本应该如何运行,以及它可能接受的任何参数 - 以及下面的@output块的格式。这些块显示了如何正确运行脚本,如何在命令行上传递参数(如果需要),以及你应该期望从所讨论的脚本中得到什么输出。

在注释块下面是 Nmap 解析的几个其他变量定义。具体来说,author块(这是您希望为脚本获得的署名方式),license块(通常列为与 Nmap 相同以进行分发,但如果您想保护脚本的某些元素,可以以特定方式指定),以及categories数组(列出脚本应该属于的类别)。您要确保,例如,如果您的脚本是侵入式的,您要将其标记为这样。

对于我们的脚本,我们只需要一些必需的includes,这使得我们的头部相对较短。让我们创建我们的头部部分,看起来像下面这样(当然,随时随地修改您的脚本!):

  local http = require "http"
  local nmap = require "nmap"

  description = [[
  Checks to see if robots.txt exists on a web server.
  ]]

  author = "Nmap Essentials readers"
  license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
  categories = {"default", "discovery", "safe"}

非常简单!我们需要 HTTP 模块,以便对问题中的robots.txt执行 HTTP GET 请求(在开放的端口 80 上),当然我们还需要 Nmap 包含以利用 Nmap 脚本引擎。您可以看到我们的描述非常简单明了,我们定义了作者、许可和类别,以帮助我们的用户确定脚本何时是安全和有效的运行。

现在我们的脚本头部已经完成,让我们转向规则。

触发函数 - 规则

Nmap 脚本的规则或 portrule 部分确定了何时应该执行操作(我们将在下一节中介绍)。明确定义这一点非常重要,这样我们就可以确信我们的脚本将在需要时每次都运行(基于端口号和版本)。有两种方法可以实现这种类型的规则:标准 portrule 文档和 NSE 中内置的名为shortport的辅助库。

定义规则实际上非常简单,取决于我们要寻找什么。在我们的robots.txt检测脚本(名为robots.nse)的情况下,我们只想在端口 80 上触发,以查看robots.txt是否存在。

如果我们要编写一个生产脚本,而不是一个概念验证,最好使用 shortport 的端口或服务功能来触发端口 80,或者 Nmap 通过其底层功能检测到的任何 Web 服务器。然而,在我们的情况下,我们可以简单地定义一些更容易理解的东西:

  portrule = function(host, port)
    return port.state == "open"
  end

正如你所看到的,这是一个非常简单的 portrule,当port.stateopen时将返回true。这些都是内置的 Nmap 功能,在脚本运行时,每个端口都会根据 portrule 进行检查。

虽然我们的端口规则故意非常容易理解,但许多生产脚本都有非常复杂的端口规则,旨在根据特定版本和配置设置触发不同的分析元素。要了解更多关于高级端口规则和 shortport 库的信息,您可以阅读Nmap 脚本引擎文档NSEDoc)门户的完整概述。

定义脚本的操作

在定义端口规则之后,唯一剩下的步骤就是定义当端口规则返回true时执行的操作。在我们的情况下,我们想要检查我们正在扫描的 Web 服务器上是否存在robots.txt

为了确定服务器是否存在,我们需要了解一些关于超文本传输协议HTTP)的知识。首先,请求页面的方式是通过 HTTP GET 请求。例如,如果我们想要访问google.com/images,我们的浏览器会向Google.com服务器发送包含GET /images的请求。

如果 GET 请求的状态是OK,Web 服务器将返回状态码200。如果有服务器端错误,将返回500错误。如果页面被移动,将返回300范围内的错误。最后(对于我们的目的),如果有授权错误或文件未找到错误,服务器将分别返回403404

为了定义我们的操作函数,我们需要执行以下步骤:

  1. 请求robots.txt页面。

  2. 找出它是否存在。

以下操作部分定义了这个请求:

  action = function(host, port)
  local robots = http.get(host, port, "/robots.txt")

  if robots.status == 200 then
    return "robots.txt status 200"
  else
    return "robots.txt status: " .. robots.status
  end
  end

如前面的代码片段所示,这是一个非常简单的操作部分。让我们一步一步地走过这个过程:

  1. 首先,我们定义接受参数主机和端口的操作函数。一旦端口规则触发,这些参数会自动传递给操作块。

  2. 接下来,我们定义一个本地变量(称为 robots),它是 NSE 的http.get请求的 HTTP 结果。在这种情况下,我们正在对我们当前扫描的主机和端口执行 GET,并向/robots.txt发出请求。

  3. 一旦我们收到 HTTP 数据,我们可以很容易地使用if语句来确定状态是否为200 OK响应或其他状态。我们本可以将其与更短的if语句结合在一起(而不是 if/else),但是看到如何有多种可能性的输出是很有用的。

  4. 如果输出不是200,我们转到else语句并查看状态是什么。例如,如果状态是404,我们知道它根本不存在;然而,如果我们得到500服务器错误或403 未授权,可能值得更深入地研究一下:定义脚本的操作

如您所见,运行此脚本(以及任何自定义的 Nmap 脚本)非常简单。当扫描scanme.nmap.org时,您可以清楚地看到没有robots.txt - 我们只收到了404错误。如果我们扫描一个确实有robots.txt页面的服务 - 我在dshaw.net/上创建了一个测试用例 - 我们会看到不同的结果。

在这种情况下,我们可以清楚地看到200状态 - HTTP OK - 意味着robots.txt确实存在:

定义脚本的操作

如果这是一个生产 Nmap 脚本,可能值得将与200 OK响应相关联的返回更改为显示更多信息,例如不允许的文件和目录。但是,不要在这个特定的脚本上花费时间!官方 Nmap 存储库中已经有一个很棒的 HTTP robots.txt脚本(以及许多其他脚本)。

最后,还有一组非常有用的标志,可以很好地编写、理解和调试 Nmap 脚本,那就是--script-trace-d(调试)标志。--script-trace标志显示有关脚本自己所做的所有不同请求的线上信息,这对于确定到底发生了什么非常有用:

定义脚本的操作

在前面的截图中,你可以看到可能有一点信息过载,但是你可以通过使用--script-trace标志来准确地看到 Nmap 脚本在做什么。-d标志,用于调试,工作原理类似:如果你在编写脚本时遇到错误,尝试使用-d标志进行调试。你会惊讶地发现你可以学到很多东西!

总结

本章向我们展示了如何编写我们自己的 Nmap 脚本!NSE 是一个强大(有时复杂)的工具,可以帮助 Nmap 用户完成各种有趣和自动化的任务。我们编写的脚本作为概念验证可以轻松地检测服务器上是否存在robots.txt文件,但编写 Nmap 脚本的可能性——无论是用于内部使用还是检测特定漏洞——几乎是无限的!

在下一章中,我们将学习如何使用与 Nmap 工具套件捆绑在一起的工具,以及一些有用的技巧和窍门,以充分利用它们。

第八章:其他 Nmap 工具

我们现在已经成功编写了我们的第一个 Nmap 脚本,并对各种不同类型的目标(和防御)进行了各种扫描。然而,扫描主机只是 Nmap 套件的全部功能的一小部分。

除了创建强大的扫描工具和 NSE 之外,Nmap 开发人员还包括了几个其他工具——包括 Ncrack、Nping、Ncat 和 Ndiff——在 Nmap 的默认安装包中。这些工具可以帮助分析现有的扫描结果,转向其他主机,传输文件,或者随时间比较扫描结果。

在本章中,我们将涵盖以下主题:

  • 使用 Ncrack 攻击服务

  • 使用 Nping 进行主机检测

  • 使用 Ncat 进行文件传输和后门

  • 使用 Ndiff 比较 Nmap 结果

使用 Ncrack 攻击服务

Nmap 套件中包含的最具侵略性的工具之一是 Ncrack——一种用于积极暴力破解(或“破解”)网络服务的工具。虽然它的功能并不独特(因为有许多软件工具可以暴力破解网络帐户),但易于(和本地)与 Nmap 集成(和 Nmap 结果)使其成为扫描后的理想选择。

在使用 Ncrack 之前,我们需要确保它已安装。虽然大多数 Nmap 工具都随 Nmap 套件包安装,但由于 Ncrack 在技术上(在撰写本文时)是一个 alpha 版本,因此它并未包含在许多安装中。

注意

文档和最新的下载链接可在nmap.org/ncrack/找到。

像许多 Nmap 工具一样,安装非常简单;执行以下步骤:

  1. wget http://nmap.org/ncrack/dist/ncrack-0.4ALPHA.tar.gz

  2. tar -xzf ncrack-0.4ALPHA.tar.gz

  3. cd ncrack-0.4ALPHA

  4. ./configure

  5. make ; sudo make install

您将能够看到前面步骤的输出,如下面的屏幕截图所示:

使用 Ncrack 攻击服务

配置完成后,您可能会注意到一个蝎子的 ASCII 艺术(如前面的屏幕截图所示)。这个艺术是向您致敬 Nmap 龙,您可能还记得我们几章前第一次安装 Nmap 时的情景!

安装了 Ncrack 之后,我们可以以几种有用和有趣的方式来调用它来为我们服务。

使用 Ncrack 攻击服务

运行 Ncrack 最直接的方法非常简单;如前面的屏幕截图所示,可以简单地运行ncrack,然后跟上目标服务的协议 URI 和主机名(或 IP 地址)。以这种方式使用,我们可以通过运行ncrack ssh://TARGET来攻击服务(如 SSH)。

当使用已知用户名时,Ncrack 最有效。例如,如果我们知道某个系统有一个允许密码认证的 root 登录,我们将运行ncrack --user root ssh://TARGET来对该用户名进行暴力破解。

尽管这个功能非常有用,但它并不是唯一的;许多工具,如HydraMedusa都可以进行暴力破解攻击。当 Ncrack 基于 Nmap 扫描的结果运行时,Ncrack 的真正优势就显现出来了。

假设我们正在对一个 C 类(/24)网络中的一系列主机进行渗透测试或安全评估。例如,如果有 200 台主机在线,每台主机有五到十个服务在监听,那么您需要在命令行上执行大量不同的暴力破解尝试。然而,Ncrack 可以为您完成这些工作。

就像 Nmap 可以导出不同的日志类型一样,Ncrack 可以将它们作为输入读取,并自动攻击相关服务。例如,如果我们从 Nmap 扫描中有一个-oX标志(XML 输出),Ncrack 可以使用-iX将相同的列表作为目标文件输入:

使用 Ncrack 攻击服务

我们可以轻松地看到,通过扫描nmap.scanme.org并导出 XML 文件,我们可以轻松地将其导入到 Ncrack 中。虽然这只是一个主机,但您可以想象如果我们用于大型网络时会节省多少时间!值得注意的是,不支持登录的服务,或者 Ncrack 不知道如何使用的服务,默认情况下会从扫描中排除。在这种情况下,由于没有登录提示,nping-echo被排除在外。

除了指定目标文件之外,运行 Ncrack 所需的一些标志是绝对必要的。对于 Ncrack 来说,最重要的两个标志是-U-P标志,它们分别指向包含用户名和密码的文本文件。

有大量其他标志、配置设置和 Ncrack 的用途,所有这些都可以在非常有用的主页上找到。

在使用 Ncrack 之前,需要注意:虽然使用 Nmap 进行端口扫描可能会让许多系统管理员感到恼火(实际上在某些地区是非法的),但使用 Ncrack 尝试破解服务是非法的,只能在系统所有者明确许可的情况下进行。如果您试图对自己的资产进行安全评估,或者您有签署的同意书(比如渗透测试的情况),那么您是可以的-但不要试图破解互联网上的任意主机!

使用 Nping 进行主机检测

与 Ncrack 一样,Nping 是最近才被添加到 Nmap 套件中的-它的第一个版本是在 2009 年 8 月创建的(与 Ncrack 一起),并且在 2010 年 3 月首次包含在实际的 Nmap 套件中。

尽管从其名称中您可能不会期望到,但 Nping 的功能远不止于 ICMP 回显请求(我们通常称之为 ping)-主要是它还可以执行 ARP 探测和对给定端口的 TCP 或 UDP 请求,以便根据响应来判断这些主机是否在线。例如,如果我们想要调试某些网络连接,我们可以轻松地使用 Nping 来确定在网络上发生了什么。以下屏幕截图显示了一个基本的 Nping 命令:

使用 Nping 进行主机检测

在前面的屏幕截图中,我们使用 Nping 对每个端口进行了两次检查(-c 2,其中"c"代表"count"),并扫描了dshaw.net上的端口-80。在这种情况下,80 是一个开放的端口(它正在运行我的 Web 服务器),我们可以清楚地看到我们期望的响应。正如我们在前面的章节中记得的那样,现在我们可以看到在尝试进行 TCP 握手时通过网络连接信息(发送和接收的数据包)发生了什么。如果我们正在调试网络连接,我们还会指定-v来查看更多的数据包信息。

Nping 最独特的功能之一是其内置的回显模式。回显模式允许 Nping 作为服务器和客户端工作,并来回发送数据包。通过显示整个网络连接(客户端发送的数据包,以其原始状态,以及服务器接收到的数据包),非常容易检测网络地址转换、干扰入侵防御系统、数据包整形等等。

注意

有关 Nping 回显命令的完整列表,以及各种预期用途,请查看 Nmap 文档门户网站(NSEDoc),其中有一个位于nmap.org/book/nping-man-echo-mode.html的全面教程。

使用 Ncat 进行文件传输和后门

对于那些可能不熟悉的人来说,一个很棒的网络管理工具在 1995 年推出,它被称为 Netcat。它有各种用途,从文件传输到网络监视,到聊天服务器,甚至可以创建后门,通过将其输入镜像到用户选择的指定网络地址。Netcat 在很多方面都是一个非常轻量级的端口扫描程序-通过使用一个快速的 shell 脚本,非常容易检查给定主机上是否响应了某些端口。

Netcat 今天仍然被广泛使用,但 Nmap 开发团队看到了软件在稳定性和可用性方面的一些非常严重的改进。因此,2009 年,Ncat 作为 Nmap 套件的一部分发布了。

与 Netcat 不同,Ncat 具有 SSL 支持(本地支持)、良好的连接重定向可靠性,以及其他几个内置功能,使其成为安全管理员工具箱中的一款好工具。

Ncat 有两种模式:“监听”模式,它在提供的端口上监听传入的连接,“连接”模式,通过它发送命令并接收反馈。在连接模式下,我们可以使用 Ncat 连接到各种服务,包括基于 HTTP 的 Web 服务器。

通过在调用ncat nmap.org 80后发送GET / HTTP/1.0请求,得到以下输出:

使用 Ncat 进行文件传输和后门操作

尽管它显然不像 Chrome 或 Firefox 等网页浏览器那样渲染得好,但你可以很清楚地看到来自 Web 服务器的 HTTP/HTML 响应。Ncat 的这种功能也可以用于连接到许多不同类型的服务,包括 SMTP、FTP、POP3 等等。当尝试向不同的协议发送不同的输入时,Ncat 可以非常有价值!

在进行渗透测试或安全评估时,Ncat 也非常有用,因为它既可以用作数据外泄的方法,也可以用作对受损系统的持久后门。

通过 Ncat 发送文件的能力使用了工具的“监听”和“连接”功能。以下截图显示了一个非常基本的 Ncat 命令:

使用 Ncat 进行文件传输和后门操作

首先,我们使用-llisten标志设置了一个 Ncat 监听器。由于我们期望接收一个文件,我们可以将输出导向received.txt。我们始终要确保输出的文件类型与我们期望的文件类型相匹配,这样我们就不必在以后处理更改文件类型的问题。在设置监听器时,我们还可以设置一个特定的端口(在渗透测试中很有用);但在这种情况下,我们保留了默认端口 31337。

使用 Ncat 进行文件传输和后门操作

如前面的截图所示,在其他地方(不在监听器中)我们有一个名为send.txt的文件,其中包含这是我们要发送的文件!的内容。发送文件很容易!我们只需要调用 Ncat,将其指向本地主机(同样,我们使用默认端口 31337,因此不需要指定端口),并将输入从send.txt管道传输。以下截图演示了打开接收到的文本文件:

使用 Ncat 进行文件传输和后门操作

正如我们在前面的截图中看到的,一旦接收到文件,Ncat 将自动关闭。一旦我们实际接收到文件,只需简单地使用“cat”命令查看我们接收到的文件,就可以看到它实际上与我们发送的内容相同。

最后,Ncat 还可以用作后门,以创建对受损系统的持久访问。以下截图显示了这个基本功能:

使用 Ncat 进行文件传输和后门操作

如前面的截图所示,通过 Ncat 建立 shell 连接非常简单。我们使用ncat -l -e /bin/bash在默认端口上监听,并在客户端连接时执行/bin/bash(我们的 shell)。值得注意的是,在这种形式下,后门不是持久的,意味着在客户端断开连接后不会保持监听。以下截图演示了通过 Ncat 在远程系统上运行 Linux 命令的能力:

使用 Ncat 进行文件传输和后门操作

为了连接到 shell,如前面的屏幕截图所示,我们可以简单地调用ncat localhost(因为端口仍然是默认的),并让一个 bash shell 生成我们的提示符。在这种情况下,我们运行了whoami,收到了dshaw,然后执行了ls命令,并收到了远程目录的目录列表。虽然其他后门访问方法可能更可靠或更复杂,但很难想象有更简单的方法!

使用 Ndiff 比较 Nmap 结果

Nmap 套件中附带的最后一个工具是 Ndiff。对于那些不熟悉传统的* NIX 工具“diff”的人来说,它旨在直观地显示两个单独的文本文件之间的差异。换句话说,如果您(例如)想要查看在应用补丁时哪些代码行发生了变化,您可以“diff”新补丁和旧代码,并直观地看到差异。以下屏幕截图显示了一个基本的 Nmap 命令:

使用 Ndiff 比较 Nmap 结果

在前面的屏幕截图中,我们针对我的 Web 服务器dshaw.net的 80 和 81 端口启动了一次扫描。我们命名了我们的第一次扫描为scan1.xml,并对同一主机进行了另一次扫描——我们称之为scan2.xml。唯一的区别是我使用了 Ncat(我们在本章前面学到的)来将端口 81 打开到互联网。

为了比较结果,我们只需调用ndiff scan1.xml scan2.xml——非常简单。以下屏幕截图演示了这个命令:

使用 Ndiff 比较 Nmap 结果

正如您在前面的屏幕截图中清楚地看到的那样,Ndiff 输出使用与传统“diff”工具相同的格式,显示+-表示哪些行是新的或旧的。由于它解析实际的 XML 文件,而不仅仅是文本输出,因此 Ndiff 可以成功确定何时完全添加了新的主机,而不仅仅是在输出中的不同位置。在这种情况下,很明显端口 81(只有一个默认的“service”标签,而不是实际的版本扫描)在第二次扫描中是打开的,而在第一次扫描中不是。这个工具对于想要随时间查看其网络状态的系统管理员非常有用。

总结

本章概述了 Nmap 套件附带的其他工具,以及我们可以使用这些工具完成的各种任务。虽然 Nmap 本身很棒,但为了充分发挥 Nmap 的用途,我们需要使用一些打包的工具。

在下一章中,我们将学习如何将 Nmap 与 Nmap 套件之外的其他工具结合使用,以进行完全功能的安全评估或渗透测试。

第九章:漏洞评估和工具

在学习了 Nmap 套件附带的所有附加工具之后,我们最好看一看一些第三方工具,这些工具可以帮助进行漏洞评估。漏洞评估不仅仅是简单的端口扫描,它是详细报告,详细说明了可能存在于给定目标范围上的所有漏洞。

本章中我们将学习的一些工具与 Nmap 非常配合,而其他一些工具则是在初始 Nmap 扫描之后使用的后续工具。

在本章中,我们将涵盖以下主题:

  • 使用 Nessus 进行漏洞扫描

  • 使用 Nikto 评估 Web 服务器问题

  • 使用 DirBuster 识别敏感的 Web 目录

  • 开始使用拦截代理

使用 Nessus 进行漏洞扫描

与端口扫描器一起使用的最常见的软件之一是漏洞扫描器。这个扫描器将端口扫描提升到一个更高的级别;它不仅识别开放的端口和服务,还将这些版本与(通常是专有的)漏洞数据库进行交叉引用,以显示给定服务是否容易受到攻击。

这些扫描器是漏洞评估中的关键元素,因为它们减轻了安全工程师的负担;扫描器(经常更新)可以做大部分工作,而不必手动识别弱点。

尽管 Nessus 最初(1998 年)是作为免费安全扫描器启动的,但由于 Tenable(Nessus 的创始人创建的公司)出售许可证,它现在已经对公众关闭。虽然许多安全公司为这些许可证付费,但你可以免费尝试 Nessus 项目的一个分支(OpenVAS)。

使用 Nessus 相当简单。虽然许多安全工具在命令行上运行(包括我们将在本章后面审查的一些工具),但 Nessus 使用基于 Web 的用户界面,非常直观易用。基本用法包括:

  • 选择目标列表(Nmap 可以帮助完成这一步)

  • 选择扫描类型

  • 运行扫描

  • 解释结果

以下屏幕截图显示了 Nessus 的“模板”页面:

使用 Nessus 进行漏洞扫描

正如我们在前面的屏幕截图中所看到的,登录 Nessus 并选择新扫描允许我们选择各种预定义的扫描类型,同时也允许我们选择策略以进行自定义扫描类型。为了进行这次扫描,我创建了一个特殊的扫描类型,它将扫描所有端口(就像 Nmap 一样!),然后交叉引用它检测到的任何漏洞。

为了启动扫描,我们必须选择要扫描的目标。就像在我们的 Nmap 测试扫描期间一样,我们将扫描scanme.nmap.org。请注意,在不愿意接受扫描的目标上进行漏洞扫描可能会让系统管理员非常沮丧,并且在世界上许多地方是非法的:

使用 Nessus 进行漏洞扫描

Nessus 图形用户界面非常简单易用;只需将主机添加到“目标”中,并给扫描命名。在大型渗透测试中,许多安全评估人员将专门从 Nmap 结果中解析出在线主机(或具有服务监听的主机),以便不浪费 Nessus 时间在要么是离线的主机上,要么是没有任何服务监听的主机上。以下屏幕截图显示了 Nessus 中的漏洞扫描:

使用 Nessus 进行漏洞扫描

扫描完成后,单击漏洞会显示在目标范围上检测到的漏洞的当前列表。如预期的那样,scanme.nmap.org几乎没有漏洞(Nmap 团队对安全性了解很多!),但仍然会出现一些“信息”发现,以便向评估人员提供尽可能多的信息。在这种情况下,似乎某些配置(例如 Apache Web 服务器信息)允许信息泄露。

Nessus 是一个强大的工具,但 NSE 很快就成为了一个强大的竞争对手,因为它能够脚本化 Nessus 内置的所有检查。然而,Nessus 的优势在于 Tenable 拥有一个全职的安全工程师团队,几乎不断地编写新的插件;而对于 Nmap 脚本,需要有人创建脚本,将其上传到网络,并将其分发给许多用户,然后才能在实践中使用。

自定义检查是 Nessus 可以支持的另一个功能。与 NSE 类似,Nessus 用户可以使用一个强大的脚本工具,称为Nessus 攻击脚本语言NASL)。任何人都可以编写 NASL 脚本,并提供 Nessus 引擎的全部功能,而不一定要对给定主机运行完整的 Nessus 扫描。完整的 NASL 文档可以在 Tenable 网站上访问。

使用 Nikto 评估 Web 服务器问题

Nikto 是一个开源工具,允许安全评估人员评估 Web 服务器的配置。与 Nmap 或 Nessus 不同,Nikto 专门设计用于基于 Web 的配置评估。通常情况下,建议在渗透测试或漏洞评估的一部分中运行 Nikto(或类似的 Web 扫描程序)以评估 Web 服务。可以从其网页cirt.net/Nikto2访问 Nikto。

Nikto 的安装过程非常简单,类似于本书中使用过的其他工具:

  1. wget https://github.com/sullo/nikto/archive/master.zip

  2. 解压缩 master.zip

  3. cd nikto-master/program

  4. Nikto 现在可以使用了!

像许多早期的安全工具一样,Nikto 是一个 Perl 脚本,这意味着只要系统上有 Perl,Nikto 就可以运行!为了演示 Nikto 的工作原理,我们将对我们最喜欢的主机scanme.nmap.org运行一个简单的扫描。要运行此扫描,我们使用-h(主机)标志调用 Nikto:nikto -h scanme.nmap.org

使用 Nikto 评估 Web 服务器问题

您可以在上面的屏幕截图中看到,随着 Nikto 的运行,它识别出许多问题(包括我们在 Nmap 和 Nessus 中识别出的一些问题),以及一些不同的配置选项,例如缺少某些安全标头,存在某些 Web 目录等等。

在实际 Web 服务器漏洞的情况下,Nikto 可以是无价的,以检测可利用的攻击向量。随着时间的推移,NSE 正在从 Nikto 中获取越来越多的这些检查,并将它们直接集成到 Nmap 中,但在其核心,Nmap 仍然是一个端口扫描程序;检测漏洞只是一个奖励,而不是主要目的。

使用 DirBuster 识别敏感的 Web 目录

尽管 Nikto 可以识别潜在的敏感目录和 Web 服务器配置错误,但其主要目的不是查找隐藏文件。然而,DirBuster 完全是为了查找 Web 服务器上的隐藏文件和目录而存在的。使用 Java(因此必须安装 Java 运行环境),DirBuster 可以向 Web 服务器发送许多请求,以完全枚举可能对任何评估人员感兴趣的任何目录。从自我测试的角度来看,运行 DirBuster 可以非常有用,以验证自己的 Web 服务器上没有留下敏感文件!

技术上,OWASP 组织认为作为独立产品的 DirBuster 已经终止生命周期。代码库已经移植到 OWASP Zed Attack Proxy (ZAP)项目中,但 DirBuster 仍然可以在独立模式下运行,这在信息安全咨询行业非常常见。您可以在以下网址下载 DirBuster:sourceforge.net/projects/dirbuster/

在正常使用情况下,DirBuster 是基于图形用户界面(GUI)的软件,但在安全行业中最常见的用法是使用-H 标志,这将在无头模式下运行 DirBuster。这种模式意味着软件在命令行上运行,可以更容易地编写脚本来运行软件,并且可以从通常只通过 SSH 访问的"分级"服务器上运行 DirBuster。幸运的是,通过学习 Nmap 时,我们已经对命令行非常熟悉,所以这不应该是问题!

运行 DirBuster 对新手来说可能有点令人生畏,但实际上非常简单:运行java -jar [Dirbuster file].jar -H -u http://scanme.nmap.org将对scanme.nmap.org运行软件。我们使用java -jar来调用它,因为我们正在运行一个 JAR 文件(一个打包的 Java 程序),-H表示无头模式(如上所述),-u表示我们要扫描的基本站点的 URL。尽管我们可以在有权限的情况下扫描站点,但 DirBuster 通常需要一段时间才能运行,因为它必须检查许多潜在的目录以提供全面的列表。一旦 DirBuster 完成运行或者使用"control-C"停止机制停止,报告将被写入 DirBuster 运行的目录中的文本文件。这种自动生成的日志非常有用,因为 DirBuster 通常可以找到大量敏感目录。

有趣的是,您可以指定 DirBuster 用于检查目录的列表,并且确保该列表始终是最新的是个好主意。最好在互联网上查找更新的列表,特别是因为 DirBuster 本身在技术上不再得到积极维护。

开始使用拦截代理

现在我们已经学会了如何使用 Nessus 进行完整的漏洞扫描,使用 Nikto 找到 Web 服务器的配置错误,并使用 DirBuster 识别敏感文件和目录。然而,这些工具都没有向我们展示 Web 应用程序实际上如何与潜在的客户浏览器进行通信。为了看到这种通信水平,我们需要使用所谓的拦截代理。

您可能以前听说过代理——可以将您的网络流量反弹,以便具有不同的源 IP 地址或避开某些类型的防火墙,但拦截代理是完全不同的。虽然您仍然可以将您的流量反弹到其他地方,但在拦截代理的情况下,您是将代理到自己,然后使用一段软件来潜在地修改该请求。

安全行业中最常见的拦截代理之一是 Burp Suite,它有一个"社区"版(免费)和一个"专业"版(付费)。Burp Suite 的一个流行替代品是 OWASP ZAP,但为了演示拦截代理,Burp Suite 完全可以胜任。您可以在以下网址下载 Burp Suite 的免费版:

portswigger.net/burp/download.html

设置拦截代理的第一步是配置 Web 浏览器指向代理。每个代理都不同,但 Burp Suite 默认使用端口 8080。这通常在 Web 浏览器的设置中,通常在"网络"选项卡下。一旦设置了代理,简单地浏览到任何页面将允许拦截请求。

例如,我们已经设置了 Burp Suite 来拦截请求,并尝试使用 Firefox 浏览到scanme.nmap.org

使用拦截代理开始

因为我们已经配置了代理到 Burp Suite,我们可以立即看到我们的请求("GET /")被 Burp Suite 拦截。这本身就很有用,因为它允许我们准确地看到我们的 Web 浏览器对请求的处理,但拦截代理还有更多的功能。除了看到请求,我们实际上还可以在传输过程中修改它们!以下屏幕截图显示了 Burp Suite 拦截请求:

使用拦截代理开始

在前面的屏幕截图中,您可以看到我们将请求从GET /改为GET /TEST,这样在服务器收到请求之前就改变了请求。尽管这个改变只是一个简单的GET参数改变,但在评估 Web 应用程序时,这个功能非常有用。例如,有时候可以通过改变变量来发送其他用户数据的POST请求,而仅仅通过 Web 浏览器浏览到不同的 URL 不会产生预期的效果。在评估 Web 应用程序方面,拦截代理是尖端工具的前沿。以下屏幕截图显示了 Web 浏览器解释请求的结果:

使用拦截代理开始

您可以看到,一旦我们在 Burp Suite 中点击了Forward按钮,允许修改后的请求继续发送到服务器,我们的浏览器就会收到一个/TEST在服务器上找不到的响应。这个 404 错误是因为请求在传输过程中被改变了,新文件并不存在。

Burp Suite 是一个功能强大的工具,具有许多功能,值得一本专门的书来介绍,这本书也是可用的。如果你对 Web 应用程序安全感兴趣,我强烈建议使用并了解更多关于 Burp Suite 的知识。

总结

这一章让我们从了解如何运行端口扫描,到学习其他安全工具如何适应安全专业人员的日常生活。我们已经学会了如何使用 Nessus 进行漏洞扫描和评估,使用 Nikto 评估 Web 服务器配置,使用 DirBuster 查找隐藏的文件和目录,并使用 Burp Suite 拦截和修改 Web 应用程序的请求。

虽然关于安全世界还有很多要学习的,但我们现在已经达到了进行漏洞评估的阶段!

在下一章中,我们将学习使用 Metasploit 进行渗透测试的基础知识,以及如何结合使用 Nmap 和 Metasploit 来生成一个出色的攻击平台。

第十章:渗透测试与 Metasploit

漏洞评估只是完整安全扫描的一部分。在识别漏洞或发现配置错误后,安全评估员应努力实际利用这些漏洞。将评估提升到利用阶段的原因很多,但最重要的部分是消除虚假阳性结果并展示潜在严重结果的全部重要性。

很少有什么比从一个被认为是安全的系统中窃取敏感数据更能引起 IT 主管或 CIO 的注意!

Metasploit 是一个非常有效的攻击平台,许多模块被快速添加到系统中。利用 Metasploit 的强大功能与诸如 Nmap 的扫描工具和 Nessus 等漏洞扫描器可以完成一个准备充分的安全工具套件的三重奏。

在本章中,我们将涵盖以下主题:

  • 安装 Metasploit

  • 使用 Metasploit 进行扫描

  • 使用 Metasploit 攻击服务

  • 接下来学什么

安装 Metasploit

在我们开始使用 Metasploit 之前,我们需要将其安装到我们的系统中。与 Nmap 不同,安装 Metasploit 可能会有点棘手,但只要小心工作就可以克服!

第一步是确保安装了 Metasploit 所需的所有依赖项。这样做相对简单,我们只需要运行sudo apt-get install build-essential libreadline-dev libssl-dev libpq5 libpq-dev libreadline5 libsqlite3-dev libpcap-dev openjdk-7-jre git-core autoconf postgresql pgadmin3 curl zlib1g-dev libxml2-dev libxslt1-dev vncviewer libyaml-dev curl zlib1g-dev

安装 Metasploit

如前面的屏幕截图所示,大多数 Linux 机器都需要安装此列表中默认未包含的几个软件包。如果您不知道这些单独的软件包是做什么的,不要担心-我们只需要安装它们以便 Metasploit 能够正确运行。

除了安装各种软件包之外,我们还需要确保安装了最新版本的 Ruby。使用一个名为“RVM”的工具可以使这相对简单;RVM 的完整文档可在rvm.io上找到。在撰写本文时,我们正在安装 Ruby 2.1.5 来运行 Metasploit:

安装 Metasploit

一旦安装了 Ruby,唯一的其他要求就是 Nmap(我们已经安装了),配置 Postgres 和安装 Metasploit 本身。

配置 Postgres 非常简单:作为root,只需运行su postgres来假定该用户角色,并运行以下两个命令:

  createuser msf -P -S -R -D
  createdb -O msf msf

一旦配置了 Postgres 数据库,我们就可以开始使用 Metasploit 本身。第一步是克隆 Git 存储库以在本地获取代码,可以通过运行git clone https://github.com/rapid7/metasploit-framework.git来实现。

文件创建完成后(在一个名为“metasploit-framework”的目录中),我们可以cd进入该目录并运行bundle install,以确保 Ruby gem 依赖项是最新的。如果 gem 已过时,bundle update将验证最新指定的版本是否正在运行:

安装 Metasploit

在这个阶段,Metasploit 已经安装好了!我们不需要编译任何东西,因为 Metasploit 是用 Ruby 编写的(这是一种解释性语言,而不是编译型语言)。要启动 Metasploit,只需在 metasploit-framework 目录中运行./msfconsole,就这么简单!

使用 Metasploit 进行扫描

虽然 Nmap 的主要优势在于执行快速、可扩展的端口扫描,Nessus 的长处在于进行深入的漏洞扫描和错误配置检测,但 Metasploit 在实际利用漏洞方面表现出色。在安全评估中,Metasploit 通常作为最后一步被引入:一旦从其他工具中枚举出漏洞,Metasploit 就可以实际利用它们。敏感数据、受损的机器等都可以很容易地使用 Metasploit 和框架附带的各种工具被窃取。

Metasploit 可以轻松地有一整本书来专门讲述它的用法——实际上,它确实有——但是我们将介绍基本的扫描和利用技术,以便您可以将其应用到您的日常流程中,而不会有太多麻烦。

启动特定漏洞扫描(或信息收集技术)的最简单方法就是使用它。在 Metasploit 中指定use命令的方式就是简单地运行use primary/secondary/module。以下截图显示了我们在 Metasploit 中设置 HTTP 版本扫描的过程:

使用 Metasploit 进行扫描

正如您在前面的截图中可以轻松看到的,我们决定使用auxiliary/scanner/http/http_version模块来检查 HTTP 版本。一旦我们选择了模块,我们通过运行“show options”来检查可用的选项。在这种情况下,我们需要指定rhosts应该是我们的目标 Web 服务器。因为这是复数形式(hosts,而不是'host'),您可以看出我们可以从这个指令理论上扫描一个 Internet 范围。此窗口的描述选项卡中还写有简要描述。以下截图显示了 Metasploit 扫描的选项:

使用 Metasploit 进行扫描

前面的截图说明了运行模块很简单——只需调用run命令——我们就得到了我们要找的结果!在这种情况下,我们得到了我的 Web 服务器的版本为nginx

值得注意的是,有许多辅助模块,特别是用于各种不同漏洞和利用的“扫描器”模块。您并不总是需要实际攻击一个服务来找出它是否有漏洞!

使用 Metasploit 攻击服务

正如我们在本章前面学到的,Metasploit 的成名之作是作为一个攻击平台。每天都有 Metasploit 模块被编写并提交到 Metasploit 项目中;每个模块都可以执行扫描,或者更常见的是实际攻击特定漏洞。

当 Metasploit 首次推出时,其作为攻击平台的能力是革命性的:安全专业人员不再需要寻找概念证明,或者在漏洞公布后编写自己的概念证明,而是立即能够使用一个可靠的平台和经过验证的模块来发动攻击。Metasploit 是用 Ruby 编写的,因此几乎可以在任何平台上使用——并且由于所有模块都在框架上运行,所以没有理由希望概念证明能够在用户当前使用的任何类型的机器上运行。

成功发动攻击的第一步是使用 Metasploit 的“搜索”功能查找特定模块。您可以使用搜索功能的许多方式,但是对于我们的目的,我们只是要寻找相对简单的东西:MS08-067,这是 Windows 中一个众所周知的漏洞,如果我们正确使用它,可以给我们带来相当多的访问权限!

使用 Metasploit 攻击服务

我们可以通过调用 use 来选择模块,然后通过列出 show options 来设置我们需要的选项。值得注意的是,在前面的屏幕截图中,每个 Metasploit 模块都可以有一个等级——在我们的情况下,匹配的模块返回了“great”。太棒了!最后,您可能会注意到,Metasploit 的初始响应是我们没有连接数据库,所以我们正在使用 slow search。虽然连接我们之前创建的 Postgres 数据库到 Metasploit 可能是有道理的,但如果我们只是想快速运行一个 exploit,这并不总是最快的方法。

在使用 rhost 设置我们的目标后,我们可以通过输入 exploit 来运行 exploit。请注意,这与简单运行扫描是不同的——Metasploit 希望确保您充分意识到自己正在启动一个 exploit。

当 exploit 成功运行时,您将打开一个 meterpreter 会话。您可以通过运行 sessions 命令来查看已打开的会话。

Meterpreter 是一个强大的工具,它存在于被 compromise 的机器的内存中。通过 Meterpreter,可以运行各种命令,包括来自 Metasploit 本身的攻击,以将数据转移到另一个系统,或者进一步进入被 compromise 的网络。一系列的 Meterpreter shells 可以轻松地 compromise 整个网络,并将所有敏感数据转移到攻击源——在这种情况下,就是我们!

下一步要学什么

就像安全程序本身一样,了解信息安全始终是一个过程,而不是一个完成的状态。虽然我们已经学会了网络的基础知识;如何成为 Nmap 的高级用户(以及 Nmap 套件中的其他工具);如何进行漏洞扫描;以及现在如何进行渗透测试——但还有数百万其他主题可供学习。

虽然没有一套固定的课程来成为安全专业人员或在这一领域继续教育,但关于这个主题的书籍还有很多,而且有许多不同的主题可以涵盖。如果您对 Web 应用程序评估感兴趣,我强烈建议您阅读《Web 应用程序黑客手册》。还有无数关于 Metasploit、Burp Suite Professional、利用开发、逆向工程、恶意软件分析等主题的书籍可以探索。

永远不要停止学习!

总结

在本章中,我们学会了如何安装 Metasploit,使用 Metasploit 进行特定漏洞或信息泄漏的扫描,并实际利用这些漏洞以进行成功的攻击。然后,我们了解了 Meterpreter,包括如何查看会话以及进一步进入目标网络的能力。

Metasploit 是一个用于利用基于网络的漏洞的强大框架,它应该成为任何安全评估的重点。

感谢您抽出时间阅读本书。虽然我们已经尽最大努力尽可能保持本书中的信息最新,但安全世界——特别是安全工具的世界——总是在变化。如果有必要,欢迎随时与我联系以获取更新的信息。祝您愉快的黑客攻击!

posted @ 2024-05-04 01:10  绝不原创的飞龙  阅读(111)  评论(0编辑  收藏  举报