企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 如何开始写一个辅助模块 Metasploit以其免费的开源 exploit- 弹出式shell模块而闻名。但实际上,渗透测试人员更多依赖于辅助模块,而且通常可以在不触发单个漏洞的情况下完成成功的渗透。他们更方便,对失败的惩罚通常要低得多。专业人员其实更喜欢辅助模块。 关于辅助模块的另一个有趣的事实是,其中一些与exploit没有太大的区别。主要区别在于它是如何在Metasploit中定义的:如果一个模块弹出一个shell,这是一个漏洞。如果不是,即使它利用了漏洞,它仍然属于辅助类别。 所以你看,如果你是一个辅助模块热爱者,你是来对了。 ### 计划你的模块 就像编写一个软件一样,在你开始写代码之前,你应该对你的辅助模块有一个清晰明确的目标。在单个模块中具有多个功能从来就不是一个好主意。你应该把它分解成多个模块。 你也应该考虑你的模块在不同情况下的表现。例如,如果要针对Tomcat服务器进行测试,那么如果使用Nginx,会发生什么情况?它会出错并留下错误回溯?如果是这样,你应该妥善处理。您的模块是否需要目标机器的特定设置/条件?如果没有,会发生什么?它会再次出错吗? 最重要的是,确保彻底测试你的模块。在重要的战斗中发现问题总是很难堪,这可能会让你付出代价。 ### 辅助模块的主要类别 一般来说,辅助模块是根据他们的行为分类的,但是这有点不一致,所以你只需要用最好的判断,找出最合适的模块。以下是一些常见的列表: | 类别 | 描述 | | --- | --- | | admin | 在目标机器上修改,操作或操作某些东西的模块 | | analyze | 我们最初为需要分析时间的密码破解模块创建了这个文件夹。 | | client | 我们最初为了社会工程目的创建了SMTP模块的这个文件夹。 | | dos | 不言自明 拒绝服务模块。 | |fuzzers | 如果你的模块是fuzz,这就是它所属的地方。确保根据协议将其放置在正确的子目录中。 | | gather | 从单个目标收集或枚举数据的模块。 | | scanner | 使用Msf::Auxiliary::Scanner的模块几乎总是在这里。确保根据协议将其放置在的正确的子目录。 | | server |服务器的模块| |sniffer| 嗅探器的模块。| 实际上在辅助目录中还有几个目录,但这就是灰色区域的地方。是非常欢迎你来[看的](https://github.com/rapid7/metasploit-framework/tree/master/modules/auxiliary) ### The Msf::Auxiliary::Scanner mixin 这`Msf::Auxiliary::Scanner`mixin在辅助模块大量使用。所以我们不妨说说,就在这里。mixin允许你能够测试一系列主机,而且是多线程的。要使用它,首先你需要在你的`Metasploit3`类的范围内包含mixin ~~~ include Msf::Auxiliary::Scanner ~~~ 包含这个mixin的时候,一些新的东西会被添加到你的模块中。您将拥有一个名为“RHOSTS”的新数据存储选项,该选项允许用户指定多个主机。有一个新的“THREADS”选项,它允许执行期间运行的线程数量。跟踪扫描进度的还有“ShowProgress”和“ShowProgressPercent” 通常,辅助模块的主方法是“def run”。但是当你使`Msf::Auxiliary::Scanenrmixin`时,你需要使用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 ~~~ 该名称字段可以以供应商的名称开头,但是是可选的。然后基本上描述它是什么。例如:“Dolibarr ERP/CRM Login Utility” 在Description字段应该解释模块做什么,什么事情要留意,具体要求,多多益善。目标是让用户了解他所使用的内容,而不需要实际读取模块的源代码并找出结果。相信我,他们中的大多数人不会。 Author 字段是你的名字。格式应该是“名称”。如果你想在那里有你的Twitter,留下它作为一个评论,例如:“名称#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 ~~~ ### 基本的git命令 Metasploit不再使用svn进行源代码管理,而是使用git,所以了解git的一些技巧会有很长的路要走。 我们不是在这里教你git是多么的棒,我们知道它有一个学习曲线,新的用户犯错误并不奇怪。 每隔一段时间,你的git”怒火"就会踢过来,我们理解。不过,重要的是要利用分支 。 每次创建模块或对现有代码进行一些更改时,都不应该在默认主分支上这样做。为什么?因为当你使用msfupdate更新你的Metasploit仓库的工具时,它会在合并这些改变之前做一个git reset,你就要和你所有的代码说再见。 人们倾向于做的另一个错误是在提交拉取请求之前对主分支进行了任何更改.这是个坏主意,因为很可能你提交了你不打算改变的其他垃圾,或者你可能会要求我们合并其他不必要的提交历史.只要一次提交就行了.感谢你提交模块到社区,但不感谢你提交其他不必要的提交历史. 所以作为一种习惯,当你想要做出新的东西或者改变某些东西的时候,从最新的主分支分叉一个新的分支开始,首先,先确认你是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_module Switched to a new branch 'my_awesome_module' ~~~ 现在你可以继续前进 添加一个模块.确认他在合适的路径 ~~~ $ git add [module path] ~~~ 当你决定保存更改时,提交(如果只有一个模块,你也可以这样做,git commit -a所以你不必输入模块路径,注意-a事实上意味着所有) ~~~ $ git commit [module path] ~~~ 完成后,推送您的更改,将您的代码上传到您的远程分支“my_awesome_branch”。您必须推送您的更改才能提交拉取请求,或与互联网上的其他人共享。 ~~~ $ git push origin my_awesome_branch ~~~