Skip to content

Latest commit

 

History

History
97 lines (57 loc) · 10.4 KB

File metadata and controls

97 lines (57 loc) · 10.4 KB

六、Nmap 脚本引擎介绍

尽管能够进行端口扫描是使用 Nmap 工具套件的一个组成部分,但 Nmap 的开发人员创建了一个内置于该工具中的非常强大的引擎:Nmap 脚本引擎NSE。这一章介绍了 NSE,并涵盖了在 Nmap 脚本存储库中使用可靠编写的脚本所需的所有主题,以便进行侦察扫描,这些扫描不仅包括打开的端口和侦听的服务。

在本章中,我们将介绍:

  • NSE 的历史
  • NSE 的工作原理
  • 如何查找要使用的现有脚本
  • 如何使用 NSE 运行脚本

NSE 的历史

到 2000 年代中期,Nmap 已经成为端口扫描工具和安全工具(无论是否开源)的明确领导者。尽管不断创新和优化是一场持续的战斗,但 Nmap 只能被视为一个极其成功的项目。

由于它的受欢迎程度,以及它是一个具有较高知名度的开源项目,Nmap 多次被选中参与谷歌代码之夏。GoogleSummer of Code 是一个软件开发实习/协会项目,在该项目中,学生被挑选并加入开源软件团队,以在现有项目中构建新功能。

2006 年 5 月,当当前发布的 Nmap 版本仅为 4.0 时,Nmap 被选为代码季的第二个夏季。上一年,即 2005 年,通过学生们为 Nmap 项目编写代码,已经取得了一些改进:学生们编写了一个 Netcat 的当代实现(称为 Ncat),将 Nmap 的操作系统检测升级到第二代(更好),并创建了一个小型简化 GUI,后来成为 Zenmap。

在经历了一个非常成功的第一个夏天之后,第二次运行期间,参与者开发者们更加雄心勃勃。既然 Nmap 显然有一组优秀的特性,为什么不让这些特性可以被更广泛的社区扩展呢?新的漏洞和扫描技术被频繁地开发出来,完整的 Nmap 版本无法跟上安全专业人员需要评估的内容。每次出现新漏洞时,安全专业人员(和恶意黑客!)都会使用 Nmap 扫描易受攻击的服务,但只能通过手动分析来测试软件版本是否易受攻击:显然,这不是一种非常有效的时间利用方式。

由于 GoogleSummer 为代码开发人员提供了新的资源,因此创建了一个任意脚本框架,允许用户基于某些开放端口或服务触发额外的检查。这意味着,例如,如果您正在所有 web 服务器上查找特定文件-robots.txt,例如,您可以轻松创建一个脚本,在所有 HTTP 和 HTTPS 服务上检查该文件。NSE(以及在 Nmap 的默认安装中包含 Nmap 脚本)确实彻底改变了工具套件的多功能性。

经过数月的努力,NSE 于 2006 年 12 月发布,与 Nmap 版本 4.21ALPHA1 一起打包。NSE 附带的脚本在复杂性和可用性方面不断增长,是将 Nmap 转变为功能齐全的安全工具套件的优秀资源。

NSE 的内部工作

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

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

The inner working of the NSE

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

查找 Nmap 脚本

许多 Nmap 脚本随 Nmap 一起提供,并且已经在您的系统上预打包。尽管如此,对于您可能正在进行的每个特定扫描或评估,仍然很难确定要运行哪些脚本。幸运的是,NSE 文档门户是整个 Nmap 项目中最深入、文档最完整的方面之一。

通过至http://nmap.org/nsedoc/ ,您可以看到官方 Nmap 脚本库中的所有脚本。

Finding Nmap scripts

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

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

  • Auth:这些脚本尝试对服务进行身份验证,并可以验证找到的凭据
  • 广播:这些脚本广播某些协议,以确定它们是否正在收听
  • 暴力:这些脚本试图对网络服务进行暴力或基于字典的攻击
  • 默认:这是启动扫描时可能运行的脚本的默认类别
  • 发现:这些脚本试图枚举来自主机和网络服务的敏感信息
  • 拒绝服务(DoS):这些脚本可能会导致正在扫描的服务中断
  • 漏洞利用:这些脚本试图执行利用给定漏洞的漏洞利用
  • 外部:这些脚本查询第三方数据库,如 DNS 黑名单,以收集有关目标的其他信息
  • Fuzzer:这些脚本向服务发送随机的“垃圾”信息,以试图发现软件中的缺陷
  • 侵入性:这些脚本是任何可能对服务本身造成损害或侵入性的脚本的总括类别
  • 恶意软件:这些脚本试图查找已知恶意软件的实例。
  • 安全:验证这些脚本不会对服务器造成伤害
  • 版本:这些脚本试图以比普通服务版本检测更深入的方式识别特定版本以及来自特定服务的信息披露
  • Vuln:这些脚本识别服务中的已知漏洞

知道要运行哪些类别是很重要的,因为这些类别中有几个特别是 DoS、利用漏洞和侵入性,在弱系统或生产系统上运行可能会很危险。在安全评估中包含这些 Nmap 脚本可以很容易地以非常显著的方式提高 Nmap 的实用性。

运行 Nmap 脚本

运行 Nmap 脚本很容易,一些“默认”类别甚至会作为正常扫描的一部分自行运行。一些脚本的设计目的是简单地提供有关目标的附加信息,而另一些脚本甚至会主动利用它(“利用”类别),甚至将其脱机(“DoS”类别)。

运行作为 NSEDoc 存储库一部分的 Nmap 脚本的第一步是验证脚本是否存储在本地。与 Nmap 工具本身不同,Nmap 脚本存储库经常更新,因此始终验证您是否拥有最新的版本符合您的最佳利益。您可以通过运行带有标记--script-updatedb的 Nmap 来更新 NSE 脚本,该标记将更新脚本数据库。

Running Nmap scripts

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

Running Nmap scripts

您可以在前面的屏幕截图中看到,在这里运行default脚本可以立即清楚地标记出几个发现。如果您使用-vv运行相同的扫描,以便在扫描上启用双重详细模式,您还可以看到针对给定目标加载的脚本数量(在本例中为 93)。在这个特定的实例中,http-title脚本在扫描结果本身中显示 HTML 标题(Go ahead and ScanMe!

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

Running Nmap scripts

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

最后,通过在括号中包含不同的标记,可以组合不同的选项来启动脚本。例如,如果您希望启动属于默认、安全或入侵类别的脚本,但特别不希望启动针对 web 服务器启动的任何脚本,则可以使用--script(默认、安全或入侵)标志而不是"http-*"启动扫描。始终记住,or标志不是一个排他 or—这意味着两个类别中的脚本仍将运行,但and必须在两个部分中。

尽管 Nmap 脚本库非常全面,但如果您认为有用的特定脚本未发布,则始终值得在 Internet 上的其他地方查找。许多来自安全研究人员的博客都有特定用途的 NSE 脚本,在尝试编写自己的脚本之前,首先检查搜索引擎绝对值得!

总结

本章介绍了 NSE,它是 Nmap 工具套件中最有用、最通用、最吸引人的特性之一。我们现在应该能够启动扫描,而不仅仅是端口和服务版本,Nmap 脚本实际上可以和侦听的服务交互,在某些情况下甚至可以利用漏洞!

在本章中,我们介绍了 NSE 的历史、NSE 如何工作、如何找到要使用的现有脚本以及如何使用 NSE 运行脚本。

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