-
Notifications
You must be signed in to change notification settings - Fork 3
提交模块和功能增强规范指南
开源社区的贡献是 Metasploit 的灵魂, 我们喜欢评价和发起的 pull request, 添加了新的框架功能和内容. Metasploit Framework 拥有成千上万的用户, 他们依赖每日一致且无错误的更新. 因此, Metasploit 的核心开发人员对添加新的框架功能和模块的 pull request 采用了相当高的标准. 为了鼓励开放和透明的开发, 本文档为 Metasploit 贡献者和开发人员概述了一些一般准则. 遵守这些准则可以最大程度地将你的贡献合并到正式的 Metasploit 发行中.
Metasploit 的开源社区支持大多数以 Metasploit 模块的形式出现. 应当考虑以下内容; 请注意, 这些只是指南, 而不是绝对必要的 ("应该", 而不是"必须") , 因为该规范始终存在例外情况, 尤其是在涉及新颖的攻击和技术时.
模块应通过 msftidy.rb 并遵守 CONTRIBUTING.md 准则, 两者都随 Metasploit 一起分发. 关于空格缩进等排版等问题参考 排版风格.
模块应该有一个明确的目标: Exploit 模块应该产生一个 shell. Post 模块应导致特权升级或夺取数据. Auxiliary 模块是"其他所有"类别, 但也应定义明确的任务 (例如, 收集信息找到可利用的漏洞程序)
鉴于设置多个 payload 的复杂性, 模块不应启动其它的模块. 这类操作应该由外部 UI 自动化操作.
拒绝服务模块应该跟其他模块区别开, 具有一些特殊的情况. 可以在某些理由中让终端停留等待, 例如 slowloris.
模块应该能够以最小的配置达到预期的功能. 默认值应该合理并且通常是正确的. 模块不应依赖于确切的时间、不可控的堆状态和系统 DLL 等. 所有内存地址 (即 JMP ESP 或 ROP 小工具) 都应写在模块元数据 "Targets" 下, 并记录什么指令, 以及什么 DLL. 如果该 Exploit 是针对特定硬件设备 (例如路由器, PLC 等) 的, 还是针对不免费的软件 (并且没有可用的试用/演示) , 请记住要提交二进制数据包捕获 (pcap 格式) 以及演示漏洞利用模块确实有效.
不要使用字母数字编码器来规避 BadChar 检测. 拒绝 Payload 模块中设置 EncoderType
来规避真实的 BadChar 检测. 这些编码真实环境总是不可靠的.
Exploit 等级定义介绍可以在 Exploit 等级 页面找到.
Exploit 模块应该实现一个 check()
方法. 可用 check()
通过 banner 或网络协议泄漏的版本信息确定是否已有可用补丁程序修复了漏洞.
如果模块 (auxiliary/post) 从受害机器获得某种信息, 则它应使用以下一种 (或多种) 方法存储该数据:
-
store_loot()
: 用于存储获取到的文件 (文本文件和二进制文件) 以及ps -ef
和ifconfig
等命令的 "屏幕截图". 获取到的文件不必具有数字取证的完整性 -- Post 模块仅供渗透测试人员提取一些相关信息. -
report_auth_info()
: 用于存储可被另一个模块重用的身份凭证. 例如, 导出本地 SMB hash 的模块应使用此方法, 读取主机和服务的 username:password 组合的模块也应该使用该方法. 如果仅有用户名或密码的应使用store_loot ()
来代替. -
report_vuln()
: 检测特定漏洞的 Auxiliary 和 Post 模块, 发现漏洞应该使用report_vuln()
. 注意 Exploit 模块创建 session 时会自动调用report_vuln()
(不需要特别调用它). -
report_note()
: 当上述方法更合适时, 应避免使用report_note()
, 当上面的方法都不合适时, 调用report_note()
可记录一些信息, 以便其他模块可以轻松在数据库中搜索到, 如::type
和domains.hosts
等.
模块应使用 Metasploit 的 API. 例如, 不应尝试使用 Ruby 创建自己的 TCP Socket 或应用协议. 应该通过 Rex
和 Rex::Proto
来调用 Socket. 这样可确保与框架的全部功能兼容, 例如流量转发和代理链.
Web 应用程序攻击通常是无趣的 (SQLi, XSS, CSRF) , 除非该模块可以可靠地获取到 shell 或造成某种有用的信息泄漏. 模块也应该符合上面的要求.
Web 应用程序攻击应仅限于流行且广泛部署的应用程序. 例如, 欢迎针对流行 CMS 的 SQLi 模块, 该模块能获取 CMS 的 shell. 导致私有 Facebook 个人资料公开的模块将不会收入 (目前 Facebook 仅有一个已部署模块) .
Web 应用程序攻击应该设置 HttpFingerprint 常量, 当 FingerprintCheck 为 true 时, 会在运行模块时检测指纹 (先从数据库查找, 再发送请求) 是否匹配, 不匹配则停止模块运行.
模块应仅列出 你实际测试过漏洞利用的目标. 如果从未在特定系统上进行过测试, 请避免假设它可以在特定系统上运行. 目标条目上方的注释指示有关给定目标的其他信息 (语言包, 补丁程序级别等) , 可以极大地帮助其他开发人员添加其他目标并改善你的模块.
模块可以提交未修补和未公开的漏洞. Rapid7 很乐意遵循 Rapid7 政策来协助进行披露. 从联系供应商到漏洞被释放, 此策略提供了一个 90 天期限. Rapid7 人员发现的所有漏洞都遵循此过程. 无论如何处理漏洞披露, 提交者都将获得有关漏洞和所得利用模块的全部功劳.
通常, Metasploit 框架的新功能应从插件开始. 如果该功能变得有用且流行, 我们可以更紧密地集成它, 添加 RPC API 等等, 但是在此之前, 社区应该对它进行充分的测试.
自动化一系列离散的功能通常不是框架的责任. 自动化应该通过 API 完成 (请参见 Metasploit 社区版/专业版, MSFGUI 等) . 过去在框架内自动化方面的努力证明了这一点. 比如 db_autopwn
和 browser_autopwn
之类的组件很少能达到用户的期望, 而配置这些工具却成为越来越复杂的选项和参数的噩梦. 自动化框架, 应该保持简单, 自动化本身应该存在于框架脚本和框架本身的其他外部前端中.
Console 功能应重点关注漏洞利用和安全工具的开发, 并面向漏洞利用开发人员为典型用户. 最终用户应指向如 社区版或 MSFGUI 之类的用户界面, 并且不应期望 Console 带来用户友好性. 应将控制台视为 Metasploit 的调试模式, 并尽可能接近裸机功能.
比如 msfvenom
之类的外部工具用于简化漏洞利用程序的开发并运用特定技术. 我们乐意继续接收这类型的工具, 以便将其纳入框架; 这些都应附上文档, 快速入门的操作指南以及其相关的文本说明.