Metasploit/开发辅助模块
本章介绍了辅助模块背后的概念、其结构以及如何开发辅助模块的工作示例。本章的大部分讨论都围绕着辅助模块的开发展开。Metasploit 版本 3 使用 Ruby 编程语言编写。虽然不了解任何 Ruby 编程知识也可以让你对框架的组织和功能有很好的了解;但如果你了解 Ruby 语言并且想要编写 Metasploit 的模块,你会发现这些材料最有帮助。
在 Metasploit 中,任何不是漏洞利用的模块都是辅助模块。漏洞利用模块始终包含有效负载。辅助模块是框架的一项迷人功能,它允许框架扩展以实现各种目的,而不仅仅是漏洞利用。你可以创建自己的快速漏洞扫描程序、端口扫描程序,使 MSF 充当 FTP、HTTP 或 SMTP 客户端,以及执行很多其他很酷的事情。你可以使用现成的代码库,快速开发此类工具。
在本章中,我们将研究辅助模块的各个方面和功能,并尝试实现我们自己的辅助模块。该模块将尝试将文件放置到允许 HTTP 协议的 PUT 和 DELETE 方法而不进行任何身份验证的 Web 服务器上,或者从这些服务器上删除文件。这是一个辅助模块的良好示例,因为它不是漏洞利用。它只是一个简单的工具来检查 Web 服务器配置错误。
辅助模块驻留在框架主目录的 modules/auxiliary/ 目录中。下面是辅助模块的基本定义。
require 'msf/core' p "My Auxiliary Module" class Metasploit3 < Msf::Auxiliary end # for the class definition
将此代码放置在 '$HOME/.msf/modules/auxiliary' 文件夹下的任何位置。
所有辅助模块都继承自它们的基类 Msf::Auxiliary。当 msf 加载时,行 p "My Auxiliary Module" 会打印一行。现在,你的模块已成为 MSF 的一部分,可以通过各种 MSF 用户界面使用它。当然,就目前而言,此模块除了打印一行(其他任何模块都不会这样做)之外,什么也不做。
我们需要做的第一件事是添加一些关于此模块的信息。这可以在类的 initialize 构造函数中完成。让我们在类定义中包含 initialize 构造函数。
def initialize(info = {}) super(update_info(info, 'Name' => 'HTTP Put method exploiter', 'Description' => %q{ This module exploits faulty web server configurations allowing HTTP PUT and DELETE methods without any user validation. }, 'Author' => [ 'Kashif [at] compulife.com.pk' ], 'License' => BSD_LICENSE, 'Version' => '$Revision: 4663 $', 'Privileged' => false, 'Platform' => [ ], 'Arch' => [ ARCH_X86, ARCH_PPC, ARCH_SPARC, ARCH_CMD ], 'Targets' => [ [ 'Wildcard Target', { } ] ], 'DefaultTarget' => 0, 'Actions' => [AuxiliaryAction.new('PUT_FILE', {}), AuxiliaryAction.new('DELETE_FILE', {})], 'DefaultAction' => [ 'PUT_FILE' ] )) register_options( [ OptString.new('PATH', [ true, "path where to store the new file", '/']), OptString.new('DATA', [ false, "Data to write into the file", ' ']), ], self.class ) end
构造函数首先通过调用 super 方法调用其基类的构造函数。所有模块都应该包含此调用。请注意对构造函数中的 update_info 方法的调用。此方法用于更新模块的信息,无论是漏洞利用模块还是辅助模块。每种模块类型接受的选项略有不同,例如,漏洞利用模块包含 payload 选项,而辅助模块则没有。
(此处将提供对 update_info 可以接受的选项的详细描述)
第二个调用是针对 register_options 方法的。此方法添加用户可以在运行模块之前指定的选项。
用户设置的选项可以通过名为 datastore 的预定义哈希表使用。例如
print_status("the contents of the DATA variable are: " + datastore['DATA'])
辅助模块 Mixin 提供了有用的功能,你可以使用这些功能来增强你创建的辅助模块。