Skip to content

Latest commit

 

History

History
209 lines (149 loc) · 12.3 KB

File metadata and controls

209 lines (149 loc) · 12.3 KB

十、扩展 Metasploit 和利用开发

在上一章中,您学习了如何有效地使用 Armitage 轻松执行一些复杂的渗透测试任务。在本章中,我们将从高层次概述开发。开发开发可能非常复杂和乏味,并且是一个如此广泛的主题,以至于可以就此编写一整本书。然而,在本章中,我们将试图了解什么是开发利用,为什么需要开发利用,以及 Metasploit 框架如何帮助我们开发开发利用。本章涉及的主题如下:

  • 利用发展概念
  • 向 Metasploit 添加外部漏洞
  • Metasploit 利用模板和混合简介

利用发展概念

利用漏洞可以有许多不同的类型。它们可以根据各种参数进行分类,如平台、体系结构和服务目的。无论何时发现任何给定漏洞,都存在以下三种可能性之一:

  • 攻击代码已存在
  • 存在需要修改以执行恶意负载的部分攻击代码
  • 不存在利用漏洞代码,需要从头开发新的利用漏洞代码

前两种情况看起来很简单,因为漏洞代码存在,可能需要一些小的调整才能执行。然而,第三种情况才是真正的挑战,在这种情况下,刚刚发现一个漏洞,并且不存在利用漏洞的代码。在这种情况下,您可能需要执行以下一些任务:

  • 收集基本信息,例如支持该漏洞的平台和体系结构
  • 获取有关如何利用漏洞以及可能的攻击向量的所有可能的详细信息
  • 使用模糊化等技术明确指出易受攻击的代码和参数
  • 编写一个伪代码或原型来测试该漏洞是否真的有效
  • 编写包含所有必需参数和值的完整代码
  • 发布社区的代码并将其转换为 Metasploit 模块

所有这些活动都非常激烈,需要大量的研究和耐心。攻击代码对参数敏感;例如,在缓冲区溢出攻击的情况下,返回地址是成功运行该攻击的关键。即使返回地址中的一个位被错误地提及,整个攻击也会失败。

什么是缓冲区溢出?

缓冲区溢出是各种应用和系统组件中最常见的漏洞之一。成功利用缓冲区溢出漏洞可允许远程任意代码执行,从而导致权限提升。

当程序试图在缓冲区中插入超出其容纳范围的数据时,或者当程序试图将数据插入缓冲区之外的内存区域时,就会出现缓冲区溢出情况。在本例中,缓冲区只不过是分配用于保存从字符串到整数数组的任何内容的连续内存段。试图在已分配内存块的边界之外进行写入可能会导致数据损坏、程序崩溃,甚至导致恶意代码的执行。让我们考虑下面的代码:

#include <stdio.h>

void AdminFunction()
{
    printf("Congratulations!\n");
    printf("You have entered in the Admin function!\n");
}

void echo()
{
    char buffer[25];

    printf("Enter any text:\n");
    scanf("%s", buffer);
    printf("You entered: %s\n", buffer);    
}

int main()
{
    echo();

    return 0;
}

前面的代码容易发生缓冲区溢出。如果您仔细注意,缓冲区大小已设置为 25 个字符。但是,如果用户输入的数据超过 25 个字符怎么办?缓冲区将溢出,程序执行将突然结束。

什么是模糊者?

在前面的示例中,我们可以访问源代码,并且我们知道变量缓冲区最多可以容纳 25 个字符。因此,为了造成缓冲区溢出,我们可以发送 30、40 或 50 个字符作为输入。然而,并不总是能够访问任何给定应用的源代码。因此,对于一个源代码不可用的应用,如何确定应该向特定参数发送的输入长度,以使缓冲区溢出?这就是 Fuzzer 来营救的地方。Fuzzer 是一种小程序,它向目标应用中的指定参数发送不同长度的随机输入,并通知我们导致应用溢出和崩溃的输入的确切长度。

你知道吗?Metasploit 有用于模糊各种协议的模糊器。这些模糊器是 Metasploit 框架内辅助模块的一部分,可以在auxiliary/fuzzers/中找到。

利用模板和 mixin

让我们考虑你已经为一个新的零日漏洞编写了漏洞代码。现在,要将攻击代码正式包含到 Metasploit 框架中,它必须采用特定的格式。幸运的是,您只需要专注于实际的漏洞代码,然后简单地使用模板(由 Metasploit 框架提供)以所需的格式插入它。Metasploit 框架提供了一个利用模块框架,如以下代码所示:

##
# This module requires Metasploit: http://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

require 'msf/core'

class MetasploitModule < Msf::Exploit::Remote
  Rank = NormalRanking

  def initialize(info={})
    super(update_info(info,
      'Name'           => "[Vendor] [Software] [Root Cause] [Vulnerability type]",
      'Description'    => %q{
        Say something that the user might need to know
      },
      'License'        => MSF_LICENSE,
      'Author'         => [ 'Name' ],
      'References'     =>
        [
          [ 'URL', '' ]
        ],
      'Platform'       => 'win',
      'Targets'        =>
        [
          [ 'System or software version',
            {
              'Ret' => 0x42424242 # This will be available in `target.ret`
            }
          ]
        ],
      'Payload'        =>
        {
          'BadChars' => "\x00\x00"
        },
      'Privileged'     => true,
      'DisclosureDate' => "",
      'DefaultTarget'  => 1))
  end

  def check
    # For the check command
  end

  def exploit
    # Main function
  end

end

现在,让我们试着了解前面利用漏洞框架中的各个字段:

  • 名称字段:以供应商名称开始,然后是软件。根本原因字段指向发现缺陷的组件或功能,最后是模块正在利用的漏洞类型。
  • 说明字段:该字段详细说明模块的功能、注意事项以及任何具体要求。这样做的目的是让用户能够清楚地了解自己在使用什么,而无需实际查看模块的源代码。
  • 作者字段:在此处插入您的姓名。格式应为 Name。如果您还想插入您的 Twitter 句柄,只需将其作为注释,例如,Name #Twitterhandle
  • 引用字段:这是一个与漏洞或漏洞相关的引用数组,例如,一条建议、一篇博客文章等。有关参考标识符的更多详细信息,请访问https://github.com/rapid7/metasploit-framework/wiki/Metasploit-module-reference-identifiers
  • 平台字段:此字段表示攻击代码将在所有平台上受支持,例如 Windows、Linux、BSD 和 Unix。
  • 目标字段:这是一系列系统、应用、设置或您的攻击目标的特定版本。第二个元素或每个目标数组是存储目标的特定元数据的地方,例如,特定偏移量、小工具、ret地址等等。当用户选择目标时,元数据由target index加载和跟踪,可以使用目标方法进行检索。
  • 有效载荷字段:该字段指定有效载荷应如何编码和生成。您可以指定空间、存储寄存器、预结束、预结束、预结束、BadChars、Append、AppendEncoder、MaxNops、MinNops、Encoder、Nop、EncoderType、EncoderOptions、ExtendedOptions 和 encoderOntFallthrough。
  • 披露日期字段:该字段指定公开披露漏洞的时间,格式为 M D Y,例如“2017 年 6 月 29 日”

您的攻击代码还应该包括一个支持check命令的check方法,但如果不可能,这是可选的。check命令将探测目标以确定利用漏洞的可行性。

最后,利用方法与您的主要方法类似。开始在那里编写代码。

什么是 Metasploit 混合物?

如果您熟悉 C 和 Java 等编程语言,那么您一定遇到过函数和类等术语。C 中的函数和 Java 中的类基本上允许代码重用。这使得程序更加高效。Metasploit 框架是用 Ruby 语言编写的。因此,从 Ruby 语言的角度来看,mixin 只不过是一个包含在类中的简单模块。这将使类能够访问此模块的所有方法。

因此,不必详细讨论编程,您只需记住 mixin 有助于模块化编程;例如,您可能希望执行一些 TCP 操作,例如连接到远程端口并获取一些数据。现在,要执行此任务,您可能需要总共编写大量代码。但是,如果您使用已经可用的 TCP mixin,那么最终将节省从头开始编写整个代码的工作量!您只需包含 TCP mixin 并根据需要调用适当的函数。因此,您无需重新发明轮子,使用 mixin 可以节省大量时间和精力。

您可以通过浏览/lib/msf/core/exploit目录查看 Metasploit 框架中可用的各种 mixin,如以下屏幕截图所示:

Metasploit 框架中最常用的一些 mixin 如下所示:

  • Exploit::Remote::Tcp:此混音器的代码位于lib/msf/core/exploit/tcp.rb,提供以下方法和选项:
    • TCP 选项和方法
    • 定义 RHOST、RPORT 和 ConnectTimeout
    • connect()disconnect()
    • 创建 self.sock 作为全局套接字
    • 提供 SSL、代理、CPORT 和 CHOST
    • 通过小段发送绕过
    • 将用户选项公开为方法,例如rhost()``rport()``ssl()
  • Exploit::Remote::SMB:此 mixin 的代码继承自 TCP mixin,位于lib/msf/core/exploit/smb.rb,提供以下方法和选项:
    • smb_login()
    • smb_create()
    • smb_peer_os()
    • 提供 SMBUser、SMBPass 和 SMBDomain 的选项
    • 暴露 IP 绕过方法,如SMB::pipe_evasionSMB::pad_data_levelSMB::file_data_level

向 Metasploit 添加外部漏洞

每天都会发现各种应用和产品中的新漏洞。对于大多数新发现的漏洞,攻击代码也会公开。现在,利用漏洞的代码通常是原始格式(就像外壳代码一样),不容易使用。此外,在 Metasploit 框架中正式将该漏洞作为一个模块提供之前,可能需要一些时间。但是,我们可以在 Metasploit 框架中手动添加一个外部利用模块,并将其与任何其他现有利用模块一样使用。让我们以最近被 Wannacry 勒索软件使用的 MS17-010 漏洞为例。默认情况下,MS17-010 的漏洞攻击代码在 Metasploit 框架中不可用。

让我们从利用漏洞数据库下载 MS17-010 模块开始。

你知道吗?利用位于的数据库进行攻击 https://www.exploit-db.com 是获取各种平台、产品和应用新漏洞的最可靠和最新来源之一。

只需打开https://www.exploit-db.com/exploits/41891/ 在任意浏览器中点击,下载ruby (.rb)格式的漏洞代码,如下图所示:

下载该漏洞的 Ruby 文件后,我们需要将其复制到 Metasploit Framework 目录,路径如以下屏幕截图所示:

屏幕截图中显示的路径是预装在 Kali Linux 上的 Metasploit 框架的默认路径。如果要自定义安装 Metasploit 框架,则需要更改路径。

将新下载的漏洞代码复制到 Metasploit 目录后,我们将启动msfconsole并发出reload_all命令,如下图所示:

reload_all命令将刷新 Metasploit 的内部数据库,以包含新复制的外部攻击代码。现在,我们可以像往常一样使用use exploit命令设置并启动一个新的漏洞,如下面的屏幕截图所示。我们可以简单地设置变量RHOSTS的值并启动漏洞:

总结

在这最后一章中,您学习了各种利用漏洞开发的概念,通过添加外部利用漏洞扩展 Metasploit 框架的各种方法,并对 Metasploit 利用漏洞模板和 mixin 进行了介绍。

练习

您可以尝试以下练习:

  • 尝试探索 mixin 代码和相应的功能,了解以下内容:
    • 俘虏
    • 洛肯
    • MSSQL
    • 核模
    • 文件传输协议
    • FTP 服务器
    • 鸡蛋猎人
  • 上发现任何漏洞 https://www.exploit-db.com 这目前不是 Metasploit 框架的一部分。尝试在 Metasploit 框架中下载并导入它。