Skip to content

在浏览器 Exploit 中使用 BrowserExploitServer

L edited this page May 15, 2020 · 3 revisions

Metasploit 框架提供了可用于开发浏览器漏洞 Exploit 的不同 mixin 包, 主要有:

Exploit 自动化程序

BrowserExploitServer mixin 是唯一专门为浏览器利用而设计的 mixin. 在使用此 mixin 之前, 你应该了解它在幕后为你做了什么:

  1. 它自动收集浏览器信息, 包括诸如操作系统名称, 版本, 浏览器名称, 浏览器版本, 是否使用代理, Java 插件版本, Microsoft Office 版本等信息. 如果浏览器未启用 Javascript, 则对目标的信息了解较少. 收集的所有信息将存储在由 mixin 管理的配置中.
  2. 然后 mixin 将标记浏览器以跟踪会话. 必要时, 它还将使用相同的标签来检索配置.
  3. 在 mixin 决定是否将 exploit 提供给浏览器之前, 它将与模块检查是否有可利用的条件. 如果不满足利用条件, 它将向浏览器发送 404, 操作失败.
  4. 如果满足利用条件, mixin 会将配置 (在检测阶段收集到的有关浏览器的信息) 传递给模块, 然后其余由模块来进行下一步利用.

提示: 在模块中, 你可以检查配置中的 :source 字段, 以确定是否启用了 Javascript: 如果 :source 为 "script", 则表示已启用 Javascript. 如果是 "headers" (如 HTTP headers) , 则浏览器已禁用 Javascript.

设置可利用条件

能设置浏览器利用条件是 mixin 的重要功能. 它使你的攻击更聪明, 更有针对性, 并防止了事故的发生. 这是一个场景: 假设你有一个针对 Internet Explorer 的漏洞, 该漏洞仅影响特定范围的 MSHTML 构建, 你可以设置 :os_name, :ua_name, :ua_ver:mshtml_build 来确保它不会盲目地利用其他目标. :mshtml_build 可以在 MSHTML 的文件属性下的 "产品版本" 中找到.

可利用的浏览器条件设置在模块的元数据中的 "BrowserRequirements" 下定义. 下面是定义运行某些 ActiveX 控件的易受攻击目标的示例:

'BrowserRequirements' =>
{
  source: /script/i,
        activex: [
          {
            clsid: '{D27CDB6E-AE6D-11cf-96B8-444553540000}',
            method: 'LoadMovie'
          }
        ],
  os_name: /win/i
}

你还可以定义特定目标的条件. 这也是 mixin 自动选择目标的方式, 你可以使用 get_target 方法来获取它. 这是一个示例, 说明如何为 Win XP 上的 IE8 和 Win 7 上的 IE 9 定义特定目标的条件:

'BrowserRequirements' =>
  {
    :source   => /script|headers/i,
    'ua_name' => HttpClients::IE,
  },
'Targets'             =>
  [
    [ 'Automatic', {} ],
    [
      'Windows XP with IE 8',
      {
        :os_name    => 'Windows XP',
        'ua_ver'    => '8.0',
        'Rop'       => true,
        'Offset'    => 0x100
      }
    ],
    [
      'Windows 7 with IE 9',
      {
        'os_name'   => 'Windows 7',
        'ua_ver'    => '9.0',
        'Rop'       => true,
        'Offset'    => 0x200
      }
    ]
  ]

你还可以使用以下这些 :os_name:

Constant Purpose
OperatingSystems::Match::WINDOWS Match all versions of Windows
OperatingSystems::Match::WINDOWS_95 Match Windows 95
OperatingSystems::Match::WINDOWS_98 Match Windows 98
OperatingSystems::Match::WINDOWS_ME Match Windows ME
OperatingSystems::Match::WINDOWS_NT3 Match Windows NT 3
OperatingSystems::Match::WINDOWS_NT4 Match Windows NT 4
OperatingSystems::Match::WINDOWS_2000 Match Windows 2000
OperatingSystems::Match::WINDOWS_XP Match Windows XP
OperatingSystems::Match::WINDOWS_2003 Match Windows Server 2003
OperatingSystems::Match::WINDOWS_VISTA Match Windows Vista
OperatingSystems::Match::WINDOWS_2008 Match Windows Server 2008
OperatingSystems::Match::WINDOWS_7 Match Windows 7
OperatingSystems::Match::WINDOWS_2012 Match Windows 2012
OperatingSystems::Match::WINDOWS_8 Match Windows 8
OperatingSystems::Match::WINDOWS_81 Match Windows 8.1
OperatingSystems::Match::LINUX Match a Linux distro
OperatingSystems::Match::MAC_OSX Match Mac OSX
OperatingSystems::Match::FREEBSD Match FreeBSD
OperatingSystems::Match::NETBSD Match NetBSD
OperatingSystems::Match::OPENBSD Match OpenBSD
OperatingSystems::Match::VMWARE Match VMWare
OperatingSystems::Match::ANDROID Match Android
OperatingSystems::Match::APPLE_IOS Match Apple IOS

你还可以使用以下这些 :ua_name:

Constant Value
HttpClients::IE "MSIE"
HttpClients::FF "Firefox"
HttpClients::SAFARI "Safari"
HttpClients::OPERA "Opera"
HttpClients::CHROME "Chrome"

更多的产量可以在这里找到: https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/constants.rb

可以在此处找到 mixin 当前支持的所有条件(请查看 REQUIREMENT_KEY_SET): https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/exploit/remote/browser_exploit_server.rb#L46

设置监听器

在检测阶段和条件检查之后, mixin 将触发 on_request_exploit 回调方法, 在这里你可以处理 HTTP 请求, 编写 HTML 并发回漏洞利用响应. 这是有关如何设置 on_request_exploit 的示例:

#
# Listens for the HTTP request
# cli is the socket
# request is the Rex::Proto::Http::Request object
# target_info is a hash that contains all the browser info (aka the profile)
#
def on_request_exploit(cli, request, target_info)
  print_status("Here's what I know about the target: #{target_info.inspect}")
end

使用 BrowserExploitServer 制作 HTML

BrowserExploitServer 混合支持两种编码样式: HTML 或 ERB 模板. 首先是不言自明的 HTML:

def on_request_exploit(cli, request, target_info)
  html = %Q|
  <html>
  Hello, world!
  </html>
  |
  send_exploit_html(cli, html)
end 

ERB 是编写 Metasploit 浏览器漏洞 Exploit 的一种新方法. 如果你编写了一个或两个 Web 应用程序, 那么这对你来说并不陌生. 当你使用 BrowserExploitServer mixin 编写漏洞 Exploit 时, 实际上是在编写 Rails 模板. 这是使用此功能的示例:

def on_request_exploit(cli, request, target_info)
  html = %Q|
  <html>
  Do you feel lucky, punk?<br>
  <% if [true, false].sample %>
  Lucky!<br>
  <% else %>
  Bad luck, bro!<Br>
  <% end %>
  </html>
  |
  send_exploit_html(cli, html)
end

如果要访问局部变量或参数, 请确保将 binding 对象传递给 send_exploit_html:

def exploit_template1(target_info, txt)
  txt2 = "I can use local vars!"

  template = %Q|
  <% msg = "This page is generated by an exploit" %>
  <%=msg%><br>
  <%=txt%><br>
  <%=txt2%><br>
  <p></p>
  Data gathered from source: #{target_info[:source]}<br>
  OS name: #{target_info[:os_name]}<br>
  UA name: #{target_info[:ua_name]}<br>
  UA version: #{target_info[:ua_ver]}<br>
  Java version: #{target_info[:java]}<br>
  Office version: #{target_info[:office]}
  |

  return [template, binding]
end

def on_request_exploit(cli, request, target_info)
  send_exploit_html(cli, exploit_template(target_info, txt))
end

BrowserExploitServer mixin 在制作漏洞 Exploit 时还提供了许多其他有用的功能. 例如: 当你调用 get_payload 方法时, 它可以生成特定目标的有效负载. 它还使你可以访问 RopDb mixin, 该 mixin 包含用于绕过 DEP (数据执行保护) 的 ROP 的集合. 请务必查看 API 文档以获取更多信息.

首先, 这是一个代码示例, 你可以使用它开始开发浏览器漏洞 Exploit:

##
# 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

  include Msf::Exploit::Remote::BrowserExploitServer

  def initialize(info={})
    super(update_info(info,
      'Name'           => "BrowserExploitServer Example",
      'Description'    => %q{
        This is an example of building a browser exploit using the BrowserExploitServer mixin
      },
      'License'        => MSF_LICENSE,
      'Author'         => [ 'sinn3r' ],
      'References'     =>
        [
          [ 'URL', 'http://metasploit.com' ]
        ],
      'Platform'       => 'win',
      'BrowserRequirements' =>
        {
          :source => /script|headers/i,
        },
      'Targets'        =>
        [
          [ 'Automatic', {} ],
          [
            'Windows XP with IE 8',
            {
              'os_name'   => 'Windows XP',
              'ua_name'   => 'MSIE',
              'ua_ver'    => '8.0'
            }
          ],
          [
            'Windows 7 with IE 9',
            {
              'os_name'   => 'Windows 7',
              'ua_name'   => 'MSIE',
              'ua_ver'    => '9.0'
            }
          ]
        ],
      'Payload'        => { 'BadChars' => "\x00" },
      'DisclosureDate' => "Apr 1 2013",
      'DefaultTarget'  => 0))
  end

  def exploit_template(target_info)
    template = %Q|
    Data source: <%=target_info[:source]%><br>
    OS name: <%=target_info[:os_name]%><br>
    UA name: <%=target_info[:ua_name]%><br>
    UA version: <%=target_info[:ua_ver]%><br>
    Java version: <%=target_info[:java]%><br>
    Office version: <%=target_info[:office]%>
    |

    return template, binding()
  end

  def on_request_exploit(cli, request, target_info)
    send_exploit_html(cli, exploit_template(target_info))
  end

end

JavaScript 混淆

BrowserExploitServer 依靠 JSObfu mixin 支持 JavaScript 模糊处理. 在编写 JavaScript 时, 应始终这样编写:

js = js_obfuscate(your_code)

#js_obfuscate 将返回 Rex::Exploitation::JSObfu 对象. 要获取混淆前的 JavaScript, 请调用 #to_s 方法:

js.to_s

如果需要访问混淆的后的变量名称, 则可以使用 #sym 方法:

# Get the obfuscated version of function name test()
var_name = js.sym('test')

请注意, 默认情况下, 即使你的模块正在调用 #js_obfuscate 方法, 除非用户设置 JsObfuscate datastore 选项, 否则混淆不会开始. 此选项是一个 OptInt, 它允许你设置混淆的次数 (默认为 0) .

如果你的基于 BES 的利用程序根本不需要混淆, 请调用 #deregister_options 并删除 JsObfuscate 选项. 像这样:

deregister_options('JsObfuscate')

To learn more about Metasploit's JavaScript obfuscation capabilities, please read How to obfuscate JavaScript in Metasploit. 要了解有关 Metasploit 的 JavaScript 模糊处理功能的更多信息, 请阅读 Metasploit 中混淆 JavaScript 代码.

相关文章:

Clone this wiki locally