Skip to content

浏览理解 Metasploit 的代码库

L edited this page May 3, 2022 · 1 revision

首次使用 Metasploit 时要学习的最重要的事情之一是如何浏览 Metasploit 的代码库. 本页旨在解释浏览 Metasploit 代码库时采用的一些不同方法, 并为学习 Metasploit 代码库的结构提供入门知识.

开始之前, 你可以在 https://metasploit.slack.com/ 访问 Metasploit Slack. 通常此页面应该允许你注册, 但是如果由于任何原因你不能注册, 请随时向 [email protected] 发送电子邮件, 我们很乐意向你发送邀请链接.

Metasploit 代码结构

可以在 https://www.offensive-security.com/metasploit-unleashed/metasploit-architecture/ 上找到 Metasploit 代码结构的一个大概的描述, 参考 Metasploit 的代码结构概述. 重复上述, 还有以下主要子目录:

  • data - 我们的通用数据存储. 用于存储供模块使用的字典列表、漏洞利用程序使用的二进制文件、图像等文件.
  • db - 保存 Metasploit 模块数据库信息. 每次将新模块推入框架或更新一个模块的属性时, 此处的 modules_metadata_base.json 文件都会更新, 因此 Metasploit 可以执行诸如自动完成模块名称之类的操作.
  • docker - 与构建 Metasploit 框架的 docker 实例相关的文件.
  • documentation - 这是文档目录. 在过去 3-4 年内的每个模块都需要有文档以及漏洞利用代码. 你可能会发现较旧的漏洞利用没有文档; 如果你想帮助解决这个问题, 我们在 https://github.com/rapid7/metasploit-framework/issues/12389 有一个开放任务, 用于向一些辅助模块添加缺少的文档.
  • external - 用作模块可能依赖的二进制文件源代码的存储目录, 以及 burpsuite、zsh 选项卡完成和串行端口项目的 Metasploit 特定分支.
  • lib - 所有库代码的去向. 如果你的行为会影响多个模块, 则该代码可能包含在存储在此目录下的库中.
  • modules - 所有模块都存储在这个目录下, 并进一步细分为下面几个类别的模块目录.
  • modules/exploit - 存储通常倾向于为你获得某种 shell 的漏洞利用模块.
  • modules/auxiliary - 存放辅助模块, 用于获取信息, 一般不获取 shell.
  • modules/post - 存放后渗透模块, 在获得对目标的访问权后执行有用的操作.
  • modules/encoders - 存放编码模块, 它们用于对各种有效负载进行编码, 以帮助避免坏字符或提供额外的混淆.
  • modules/evasion - 存放免杀模块, 用于帮助避免防病毒.
  • modules/nops - 存放 NOP 模块, 用于为各种架构生成 NOP shellcode
  • plugins - 用于存储各种 Metasploit 插件, 允许 Metasploit 与其他程序集成或从其他程序导入数据.
  • scripts - 存储 Metasploit 中使用的各种脚本, 例如 Meterpreter, 以及 Metasploit Framework 控制台界面的脚本.
  • spec - 包含各种 RSpec 检查, 用于确保框架内的库和核心功能按预期工作. 如果你正在编写一个新库或调整一个库, 你可能需要更新此目录中相应的 RSpec 文件, 以确保更新规范检查以反映新行为.
  • test - 包含对 Metasploit 代码各个部分的测试, 以确保它们按预期运行.
  • tools - 包含在不同情况下可能有用的各种工具. dev 目录包含在开发过程中有用的工具, 例如 tools/dev/msftidy_docs.rb, 它有助于确保你的文档符合标准.

GitHub 代码浏览

你可以使用 GitHub 搜索 Metasploit 的代码, 例如 https://github.com/rapid7/metasploit-framework/search?l=Ruby&q=%22payload.arch%22&type=code. 请注意, 双引号需要专门匹配某个术语; 在前面的例子中, 这个词是 payload.arch. 你还可以将 type=code 参数设置为仅在代码结果上专门匹配, 如果你想搜索提交或问题, 则可以将其设置为 commitsissues. 最后注意在搜索代码时, 指定要匹配文件的语言也很重要. 在上面的例子中, 我这样做是为了让我的结果只匹配 GitHub 认为包含 Ruby 代码的文件, 但如果你想要其他语言, 也可以指定其他语言, 例如 Batch 或 C. 如果你发现搜索结果太少, 你甚至可以取消语言限制.

GitHub 的另一个非常有用的功能是能够搜索组织拥有的所有存储库. 这在 Metasploit 中特别有用, 因为某些组件, 例如 Rex 代码和有效负载代码, 可能包含在 metasploit-framework 以外的存储库中. 要 Rapid7 拥有的公共存储库中搜索, 请使用 https://github.com/search?q=org%3Arapid7+%22payload.arch%22&type=code. 注意之前 URL 中 org:rapid7 标记的存在, 这告诉 GitHub 在任何代码文件中查看 Rapid7 拥有的所有存储库, 以查找术语 payload.arch.

试验这些结果并更多地使用 GitHub 搜索. 随着时间的推移, 你将了解它的用处和局限性, 并且能够确定何时使用 IDE 来帮助更多地理解一段代码可能会更好.

IDE 代码浏览

在 Metasploit 中导航代码库的最佳方法之一是使用 RubyMine, 可从 https://www.jetbrains.com/ruby/ 获得. 然它是一个付费工具, 但它提供了各种简洁的参考查找功能, 例如能够右键单击方法名称并选择 Find Usages, 或右键单击方法名称并选择 Go To -> Declaration or Usages 以查找可能在代码库中定义该方法的所有位置, 这可以使跟踪库和模块代码之间的复杂定义变得更加容易. RubyMine 还提供自动补全功能, 并与 Git 等许多工具很好地集成, 让你可以快速切换分支, 而 RuboCop 可以帮助你就可以改进代码风格的地方提供建议.

对于更便宜的选择, 也可以使用 VS Code. VS Code 没有最好的自动补全, 并且不允许你跟踪引用, 但是如果你愿意忍受这一点, 它是比 RubyMine 更快、更轻量级的产品, 非常适合当你只需要编辑一段代码而不加载一堆你不需要引用或编辑的相关文件. 它还具有出色的正则表达式搜索功能, 工作速度比 RubyMine 快得多, 这使你可以比使用 RubyMine 更快地搜索代码库中的项目, 因为它的开销较大, 有时看起来会卡顿.

最终由你决定选择什么工具. 有些人可能更喜欢在 GUI 界面上使用 vim/nano/emacs 或其他命令行编辑器. 使用任何你能负担得起并让你感觉舒适的东西!

Pry 调试

有时简单地阅读 Metasploit 代码可能没有帮助. 你需要真正深入了解并了解一段代码在做什么. 在这些情况下, 使用 pry 可能会有所帮助, 一个 Ruby 调试器, 可以在代码中的特定位置启动, 它允许你查看当时程序的状态, 根据需要进行调整, 然后单步执行程序或继续让它运行. 此处不会提供有关 Pry 的完整教程, 而是鼓励读者阅读在线提供的有关 Pry 的各种指南, 例如 https://learn.co/lessons/debugging-with-pry

Clone this wiki locally