-
Notifications
You must be signed in to change notification settings - Fork 3
怎么开始编写辅助模块
Metasploit 以其免费的开源漏洞利用框架而闻名, 弹出 shell 的模块. 但实际上, 渗透测试人员更多地依赖于辅助模块, 并且通常可以成功进行渗透, 而无需任何 Exploit. 它们更加方便, 尝试失败的风险通常要低得多. 专业人员实际上喜欢辅助模块.
关于辅助模块的另一个有趣的事实是, 其中的一些与 Exploit 并没有太大不同. 主要区别在于它在 Metasploit 中的定义方式: 如果模块弹出 shell, 则是一种利用. 有没有利用漏, 它都属于辅助类别.
因此, 你会发现, 如果你是辅助模块迷, 你将走上正确的道路.
就像编写软件一样, 在开始编写之前, 你应对辅助模块的功能有一个明确的目标. 在单个模块中具有多个功能绝不是一个好主意, 你应该将其分解为多个模块.
你还应该考虑模块在不同情况下的运行状况. 例如, 如果要针对 Tomcat 服务器进行测试, 那么将其用于 Nginx 会怎样? 它会出错并留下回溯信息吗? 如果是这样, 则应正确处理. 你的模块是否需要目标计算机的特定设置/条件? 如果没有, 会发生什么? 它会再次出错吗?
最重要的是, 请确保彻底测试你的模块. 在重要的行动中发现问题总是很丑陋的, 这可能会花费你很多时间.
一般来说, 辅助模块是根据其行为进行分类的, 但这有点不一致, 因此你仅需使用最佳判断并找到最合适的判断即可. 以下是一些常见的清单:
类型 | 描述 |
---|---|
admin | 修改, 操作或操纵目标计算机上某些内容的模块. |
analyze | 我们最初是为需要密码破解模块创建此文件夹的. |
client | 最初, 我们出于社会工程目的为 SMTP 模块创建了此文件夹. |
dos | 不言而喻: 拒绝服务模块. |
fuzzers | 如果你的模块是一个模糊器, 它就是它的所属位置. 确保根据协议将其放置在正确的子目录中. |
gather | 信息收集或枚举来自单个目标的数据的模块. |
scanner | 使用 Msf::Auxiliary::Scanner mixin 的模块几乎总是在这里. 确保根据协议将你的文件放在正确的子目录中. |
server | 服务器模块. |
sniffer | 嗅探器模块. |
实际上, 辅助目录中还有 更多目录, 非常欢迎来看看.
Msf::Auxiliary::Scanner mixin 在辅助模块中大量使用, 因此我们不妨在这里进行讨论. 这个 mixin 使你能够针对多个主机进行测试, 并且它是多线程的. 要使用它, 首先需要将 mixin 包括在 MetasploitModule
类的范围内:
include Msf::Auxiliary::Scanner
当你包含此 mixin 时, 将在模块中添加一些新内容. 你将有一个名为 "RHOSTS" 的新数据存储选项, 该选项允许用户指定多个主机. 有一个新的 "THREADS" 选项, 该选项允许在执行过程中运行的线程数. 还有 "ShowProgress" 和 "ShowProgressPercent" 用于跟踪扫描进度.
通常, 辅助模块的主要方法是 def run
. 但是当你使用 Msf::Auxiliary::Scanenr
mixin 时, 你需要使用 def run_host(ip)
, 这 IP 参数是目标计算机.
这是辅助模块的最基本示例. 我们将进一步解释需要填写的字段:
##
# This module requires Metasploit: http://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
require 'msf/core'
class MetasploitModule < Msf::Auxiliary
def initialize(info = {})
super(update_info(info,
'Name' => 'Module name',
'Description' => %q{
Say something that the user might want to know.
},
'Author' => [ 'Name' ],
'License' => MSF_LICENSE
))
end
def run
# Main function
end
end
Name 字段供应商名称开头, 但是是可选的. 然后是软件名称, 然后是几句话, 基本上描述了它的用途. 例如: "Dolibarr ERP / CRM 登录实用程序"
Description 字段应说明模块的功能, 需要注意的事项、特定要求等越多越好. 目的是让用户了解他在使用什么, 而无需实际阅读模块的源代码并弄清楚事情. 相信我, 他们中的大多数都不知道.
Author 字段是你输入姓名的地方. 格式应为 "Name". 如果你想在那里处理 Twitter, 请将其保留为注释, 例如: "Name # handle"
因为 Msf::Auxiliary::Scanner
mixin 非常流行, 所以我们认为你也想要一个模板. 在这里:
##
# This module requires Metasploit: http://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
require 'msf/core'
class MetasploitModule < Msf::Auxiliary
include Msf::Auxiliary::Scanner
def initialize(info = {})
super(update_info(info,
'Name' => 'Module name',
'Description' => %q{
Say something that the user might want to know.
},
'Author' => [ 'Name' ],
'License' => MSF_LICENSE
))
end
def run_host(ip)
# Main method
end
end
Metasploit 不再使用 svn 进行源代码管理, 而是使用 git, 因此了解 git 的一些技巧将大有帮助. 我们并不是在这里向你介绍 git 的出色表现, 我们知道它具有学习曲线, 并且发现新用户出错也就不足为奇了. git 利用分支对你来说很重要.
每次创建模块或对现有代码进行某些更改时, 都不应在默认的 master 分支上执行此操作. 为什么? 因为当你执行 msfupdate (这是 Metasploit 的用于更新的实用程序) 时, 它将在合并更改之前执行 git reset, 因此所有的修改都会消失.
另一个常见的错误是在提交 pull request 之前将所有更改都 commit 在 master 上. 这是个坏主意, 因为你很可能要提交其他你不想更改的修改, 并且你可能要求我们在仅需一次提交时合并其他不必要的提交历史记录.
因此, 作为一种习惯, 当你要创建或更改某些代码时, 请从一个新的分支开始, 该分支是最新的. 如果你执行 git status
则它会告诉你所在的分支.
$ git status
# On branch upstream-master
nothing to commit, working directory clean
好的, 现在执行 git pull
从 Metasploit 下载最新更改:
$ git pull
Already up-to-date.
此时, 你就可以开始新的分支了. 将新分支命名为 my_awesome_branch
:
$ git checkout -b my_awesome_branch
Switched to a new branch 'my_awesome_branch'
然后, 你可以继续添加该 Exploit 模块. 确保它在正确的路径中:
$ git add [module path]
当你决定保存更改时, 提交 (如果只有一个模块, 你也可以执行 git commit -a
, 因此你不必键入模块路径. 注意 -a
确实意味着所有) :
$ git commit [module path]
完成后, 请推送更改, 这会将你的代码上传到远程分支 my_awesome_branch
. 你必须推送你的更改才能提交 pull request, 与 Internet 上的其他人共享请求.
$ git push origin my_awesome_branch
https://github.com/rapid7/metasploit-framework/tree/master/modules/auxiliary
https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/auxiliary.rb
https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/auxiliary/scanner.rb