Metasploit开发指北

0×02 编写模块

Metaploit 官方的 wiki 里对付若何开拓 auxiliary, exploit, post 以致是 meterpreter 脚本都有异常具体的文档,参照这些文档就能够让你对若何开拓这些模块有相称的懂得(纵然有少部分已经有点逾期)

本文将经由过程一些简单的例子阐明若何开始进修对 Metasploit Framework 进行开拓

0×01 筹备事情

Metasploit 官方 wiki 就供给了异常好的文档,能办理你碰到的大年夜部分问题参考链接

下面列出一些对照紧张的文档供参考

1. 搭建 Metasploit 开拓情况,这会创建一个专门用来开拓的 Metasploit 版本msf5官方文档(假如你是一个英语苦手,那么王一航小我供给了一其中文翻译版,见 中文文档)

2. 社区供献指南,请参照官方给出的代码规范进行开拓,官方链接,中文链接

3. Metasploit API,能够查询大年夜量的类、模块、函数定义等等,参考链接

4. 一些其他的开拓技能,包括但不局限于 git应用、ruby 语法、Metasploit 应用懂得等

假如你想介入到社区中,并给 Metasploit 提交 PR,请必然好好参考上述的文档和规范

当然假如你仅仅是想自己随便开拓一个功能或者进行本地调试,完全不必遵守如斯多的限定,怎么兴奋怎么来终究 ruby 就异常自由,do whatever you want

这里笔者就不具体的逐一翻译文档了,主要先容一些自己开拓历程中踩过的坑和必要额外留意的地方

仿照其他模块

当你看完了上面所有的文档和 wiki,假如照样对开拓一个全新的模块毫无思绪的话,那么仿照其他人的模块是最好的措施

在同类型的模块下面,你总能找到和你想开拓的类似的模块,仔细涉猎一遍,最抱负的环境可以直接复制过来,然后改动check和 exploit 函数就大年夜功告成

查询 API 文档

Metasploit 项目对照宏大年夜,而且因为 ruby 的机动和抽象,整体代码封装得相称的好,这导致涉猎代码的时刻常常找不着北,不清楚函数详细的定义,这时就必要查询 API 文档

这里以我开拓 Hadoop 未授权破绽代码为示例进行阐明完备源代码见 https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/linux/http/hadoop_unauth_exec.rb

这个模块的exploit 函数只有两句:

# File ‘modules/exploits/linux/http/hadoop_unauth_exec.rb’, line 62

def exploit

print_status(‘Sending Command’)

execute_cmdstager

end

主如果由 execute_cmdstager 函数触发破绽使用代码,但代码高低文中根本找不到该函数的定义,在文档中查询该函数源码(链接):

def execute_cmdstager(opts = {})

self.cmd_list = generate_cmdstager(opts)

stager_instance.setup(self)

begin

execute_cmdstager_begin(opts)

sent = 0

total_bytes = 0

cmd_list.each { |cmd| total_bytes += cmd.length }

delay = opts[:delay]

delay ||= 0.25

cmd_list.each do |cmd|

execute_command(cmd, opts)

sent += cmd.length

# In cases where a server has multiple threads, we want to be sure that

# commands we execute happen in the correct (serial) order.

::IO.select(nil, nil, nil, delay)

progress(total_bytes, sent)

end

execute_cmdstager_end(opts)

ensure

stager_instance.teardown(self)

end

end

这里其他的细节不用管,主要可以看到履行了两个函数,generate_cmdstager 和 execute_command,分手是用来天生 payload 和履行破绽使用代码的,

前者是 MSF 封装好的函数,后者必要自己在代码中实现(有兴趣可以继承深入源码进修 generate_cmdstager 是若何实现的,笔者这里限于篇幅就不过多先容了)

0×03 开拓库

对库函数进行开拓就没有开拓模块那么多文档了,这个难度也会比之前的难度高一点,没有那么多可以借鉴的代码,而且常常陷入无尽查找函数定义的轮回中

pry-byebug

这是一个 ruby 的库文件,在 pry 的根基上添加了敕令行下的单步调试功能

pry 原先就很好用了,而 pry-byebug 最关键的是可以下断点,我自己开拓碰到不熟识的类或者函数,就靠这个库来办理官方链接

简单先容一下应用措施(安装历程略过):

在必要下断点的地方写入 binding.pry

# Function to install payload as a service

#——————————————————————————-

def install_as_service(script_on_target)

ifis_system? || is_admin?

binding.pry

print_status(“Installing as service..”)

经由过程指令来节制代码履行流

step: 单步履行,类似于OD里的 F7

next: 单步履行,类似于OD里的 F8

finish: 履行到当前函数返回,类似于 Ctrl + F9

continue: 继承履行,类似于F9

backtrace: 查看客栈

还有两个对照实用的函数, show-doc 和 show-method,这两个函数可以在 pry 界面查询对应函数的文档和源码

Metasploit 项目包孕了很多其余库函数,在官方文档内查不到的话用这个措施可以很顺利的找到对应的函数,就不用走太多弯路了

掌握这些基础的操作就可以了,想深入懂得的话多涉猎官方文档和代码

Bug fixer

虽然 Metasploit 社区异常生动,开拓者也很积极的在更新,但 Bug 怎么都是避免不了的器械,尤其是在各类平台下,每添加一个 feature 就有可能引入新的 bug

笔者最开始最开始打仗库函数相关的代码便是先找到了一个bug,想着提个 issue 吧,官方办理 issue 的速率真的是随缘,还不是靠自己来,于是就卷起袖子开始撸

接下来会用一个异常简单的例子给大年夜家解说(原始 PR 链接: https://github.com/rapid7/metasploit-framework/pull/10151

在 meterpreter session 回连成功后,假如没有设置自动加载 stdapi 扩展或者由于收集缘故原由没有加载成功的话,应用 load 敕令自动补全待加载的扩展时,meterpreter会直接崩溃

报错如下:

load [-] Session manipulation failed: undefined method `config’ for nil:NilClass [“/root/Desktop/msf_dev/metasploit-framework/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb:1220:in `cmd_load_tabs'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:409:in `tab_complete_helper'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:369:in `block in tab_complete_stub'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:358:in `each'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:358:in `tab_complete_stub'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:343:in `tab_complete'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/shell.rb:62:in `block in init_tab_complete'”, “/usr/local/rvm/gems/ruby-2.5.1@metasploit-framework/gems/rb-readline-0.5.5/lib/readline.rb:136:in `readline_attempted_completion_function'”, “/usr/local/rvm/gems/ruby-2.5.1@metasploit-framework/gems/rb-readline-0.5.5/lib/rbreadline.rb:6329:in `gen_completion_matches'”, “/usr/local/rvm/gems/ruby-2.5.1@metasploit-framework/gems/rb-readline-0.5.5/lib/rbreadline.rb:6813:in `rl_complete_internal'”, “/usr/local/rvm/gems/ruby-2.5.1@metasploit-framework/gems/rb-readline-0.5.5/lib/rbreadline.rb:6903:in `rl_complete'”, “/usr/local/rvm/gems/ruby-2.5.1@metasploit-framework/gems/rb-readline-0.5.5/lib/rbreadline.rb:4374:in `_rl_dispatch_subseq'”, “/usr/local/rvm/gems/ruby-2.5.1@metasploit-framework/gems/rb-readline-0.5.5/lib/rbreadline.rb:4363:in `_rl_dispatch'”, “/usr/local/rvm/gems/ruby-2.5.1@metasploit-framework/gems/rb-readline-0.5.5/lib/rbreadline.rb:4779:in `readline_internal_charloop'”, “/usr/local/rvm/gems/ruby-2.5.1@metasploit-framework/gems/rb-readline-0.5.5/lib/rbreadline.rb:4853:in `readline_internal'”, “/usr/local/rvm/gems/ruby-2.5.1@metasploit-framework/gems/rb-readline-0.5.5/lib/rbreadline.rb:4875:in `readline'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/input/readline.rb:162:in `readline_with_output'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/input/readline.rb:100:in `pgets'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/shell.rb:375:in `get_input_line'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/shell.rb:191:in `run'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/post/meterpreter/ui/console.rb:66:in `interact'”, “/root/Desktop/msf_dev/metasploit-framework/lib/msf/base/sessions/meterpreter.rb:570:in `_interact'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/interactive.rb:49:in `interact'”, “lib/msf/ui/console/command_dispatcher/core.rb:1386:in `cmd_sessions'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:546:in `run_command'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:508:in `block in run_single'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:502:in `each'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/dispatcher_shell.rb:502:in `run_single'”, “/root/Desktop/msf_dev/metasploit-framework/lib/rex/ui/text/shell.rb:208:in `run'”, “/root/Desktop/msf_dev/metasploit-framework/lib/metasploit/framework/command/console.rb:48:in `start'”, “/root/Desktop/msf_dev/metasploit-framework/lib/metasploit/framework/command/base.rb:82:in `start'”, “./msfconsole:49:in `'”]

差错对照长,但对照有用的主如果第一行,也便是最底层的客栈调用,会直接反映出问题,仔细看这一句

Session manipulation failed: undefined method `config’ for nil:NilClass [“/root/Desktop/msf_dev/metasploit-framework/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb:1220:in `cmd_load_tabs’

查看对应文件的代码

# lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb

def cmd_load_tabs(str, words)

tabs = SortedSet.new

if !client.sys.config.sysinfo[‘BuildTuple’].blank?

# Use API to get list of extensions from the gem

MetasploitPayloads::Mettle.available_extensions(client.sys.config.sysinfo[‘BuildTuple’]).each { |f|

if !extensions.include?(f.split(‘.’).first)

tabs.add(f)

end

}

client.sys.config.sysinfo 函数是在 stdapi 扩展中实现的,是以没有成功加载 stdapi 时调用此函数肯定会掉败

这部分代码的作者在实现的时刻未斟酌该环境,才导致该bug的呈现,我们只必要判断一下是否加载了该扩展就修复了该bug

修复后的代码

# lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb

def cmd_load_tabs(str, words)

tabs = SortedSet.new

if extensions.include?(‘stdapi’) && !client.sys.config.sysinfo[‘BuildTuple’].blank?

# Use API to get list of extensions from the gem

MetasploitPayloads::Mettle.available_extensions(client.sys.config.sysinfo[‘BuildTuple’]).each { |f|

if !extensions.include?(f.split(‘.’).first)

tabs.add(f)

end

}

更多得当新手的 Pull Request 可以参考链接

feature develop

当修复对照多的bug后,对 Metasploit 懂得也越来越深入,尤其是一些运行加载的库和对应的函数,这个时刻想实现一些自己想要的功能就轻车熟路

着实这个部分主要不是局限于对 Metasploit 的不认识,更多的是对编程能力的磨练

这部分不太好先容若何开拓,就放上一个我近来给 meterpreter 添加的补全功能吧,有兴趣的多参考一下

PR 链接见 https://github.com/rapid7/metasploit-framework/pull/10379

0×04 结论

笔者最开始懂得到 Metasploit 的时刻就感想熏染到了它的强大年夜,是让我真正感到到敲敲敕令就能渗透的对象,逐步的就成为了一个 Metasploit 的喜欢者,当一个快乐的脚本小子

盼望本篇文章能给各位新手大年夜佬供给一点赞助,也迎接大年夜家能够更多的介入到掩护 Metasploit 社区的事情中

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包