8.2 探索模块结构
Metasploit渗透测试手册
理解漏洞利用模块的结构是非常重要的,因为这有助于对不同漏洞利用模块的正确分析。由于Metasploit框架是一个开源项目,其开发依赖于来自研究团体的贡献。来自全球的开发者们将各种漏洞利用代码的概念验证代码转换为Metasploit模块,以便为其他用户使用。读者也可以将新发现漏洞的利用代码转换为Metasploit模块,从而为Metasploit开发贡献力量。还有些时候需要利用不在Metasploit框架中的特定漏洞利用代码。掌握漏洞利用代码模块结构的相关知识,有助于更容易地将漏洞利用代码转换为Metasploit模块。
准备
首先来理解框架中漏洞利用代码的模块结构,其结构与辅助模块结构类似,但多了一些字段,用户可以在 /pentest/exploits/framework3目录中找到漏洞利用模块,下面对MSF中漏洞利用代码的结构进行分析。
怎样实现
上面提到的,漏洞利用代码模块的结构与辅助模块类似,同时又增加了一些特定内容。
require 'msf/core'
class Metasploit3 < Msf::Exploit::Remote
Rank = ExcellentRanking
include Msf::Exploit::Remote::Tcp
include Msf::Exploit::EXE
漏洞利用代码模块首先在脚本中包含MSF核心库,并声明一个类,该类扩展了与该漏洞利用代码相关的一些属性。在上面的示例中,Metasploit3类扩展了Remote Exploit库,其实该脚本还包含其他一些库,例如TCP。
def initialize(info = {})
super(update_info(info,
'Name' =>'',
'Description')
initialize函数用于对模块中不同的值和内容定义进行初始化,主要包括Name、Description、Author、Version等内容。
register_options(
[
Opt::RPORT(7777),
], self.class)
end
该脚本中的一些注册选项用于为该脚本提供一些重要的和默认的值,这些值可以根据用户需要进行更改。目前为止,可以看到其结构与辅助模块非常类似,其差别在于下面要定义的exploit()函数。
def exploit
connect()
sock.put(payload.encoded)
handler()
disconnect()
end
上面这一函数是模块漏洞利用代码的主体部分,其中包含了适用于该漏洞利用代码的shellcode,该函数的内容依据漏洞利用代码的不同而变化。远程漏洞利用代码中通常可能包含的一些关键功能在该函数体中有所体现,例如connect()函数用于打开到目标的远程连接,这是一个在Remote::TCP库中定义的函数。攻击载荷也是漏洞利用代码主体的重要组成部分,用于建立目标机器到攻击者机器的反向连接。用户也可以根据实际需要在漏洞利用代码主体部分中定义不同的处理程序。
还可以声明一个漏洞测试函数check(),该函数用于确定目标机器是否存在该漏洞,可以对除攻击载荷之外的所有选项进行验证。
上面是对Metasplot中漏洞利用代码模块的基本介绍,后面章节中会对与框架中漏洞利用代码相关的一些核心概念进行讨论。
怎样工作
上述分析的漏洞利用代码模块结构是Metasploit可以理解的格式。def initialize()函数主要帮助模块定义一些常用的漏洞利用代码选项。类似地,register_options()则被Metasploit用于定义一些不同的参数,或为漏洞利用代码模块的一些参数赋予默认值。这也是模块化体系结构的优势所在。随着本章内容的推进,我们还会介绍到怎样将现有的漏洞利用代码转换为Metasploit模块。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。