跳至内容

Metasploit/开发辅助模块

来自维基教科书,自由的教科书


在 Metasploit 3 中开发和理解辅助模块

[编辑 | 编辑源代码]

本章介绍了辅助模块背后的概念、其结构以及如何开发辅助模块的工作示例。本章的大部分讨论都围绕着辅助模块的开发展开。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 方法

[编辑 | 编辑源代码]

第二个调用是针对 register_options 方法的。此方法添加用户可以在运行模块之前指定的选项。

数据存储

[编辑 | 编辑源代码]

用户设置的选项可以通过名为 datastore 的预定义哈希表使用。例如

 print_status("the contents of the DATA variable are: " + datastore['DATA'])

辅助模块 Mixin

[编辑 | 编辑源代码]

辅助模块 Mixin 提供了有用的功能,你可以使用这些功能来增强你创建的辅助模块。

华夏公益教科书