Skip to content

在浏览器 Exploit 中使用 HttpServer

L edited this page May 14, 2020 · 1 revision

Metasploit 框架提供了可用于开发浏览器漏洞的不同混合包, 主要是 Msf::Exploit::Remote::HttpServer, Msf::Exploit::Remote::HttpServer::HTML 和Msf::Exploit::Remote::BrowserExploitServer. 该文章涵盖了 HttpServer mixin.

所有 HTTP 服务器都会加入 HttpServer minxin (比如 BrowserExploitServer 和 HttpServer::HTML). 要使用它, 你的模块必须具有 on_request_uri 方法. 这是 HTTP 服务器从浏览器收到 HTTP 请求时触发的响应. 下面是设置 on_request_uri 的示例:

#
# Listens for a HTTP request.
# cli is the socket object, and request is a Rex::Proto::Http::Request object
#
def on_request_uri(cli, request)
  print_status("Client requests URI: #{request.uri}")
end

你也可以在 on_request_uri 方法中创建 HTTP 响应. 你可以使用以下三种选择来执行此操作:

  • send_not_found(cli) - 向客户端发送 404 页面. 确保传递 cli(socket) 对象.
  • send_redirect(cli, location='/', body='', headers={}) - 发送重定向响应包.
  • send_response(cli, body, headers={}) - 向客户端发送响应. 这种方法可能是你大多数时候会使用的方法.

如果你看过我们的一些 Exploit 模块, 会看到部分使用 Exploit::Remote::HttpServer::HTML 来代替 Exploit::Remote::HttpServer. 用法基本相同, 区别在于 Exploit::Remote::HttpServer::HTML mixin 使你可以访问一些 Javascript 函数, 例如 Base64, 堆喷射, 操作系统检测等.

这是发送 HTTP 响应的示例:

#
# Sends a "Hello, world!" to the client
#
def on_request_uri(cli, request)
  html = "Hello, world!"
  send_response(cli, html)
end

还要注意, 为了处理 HTTP 请求, 它必须包含基本 URIPATH, 默认情况下是随机的. 这意味着如果你要处理多个 URI (可能需要处理重定向或链接) , 则还需要确保它们具有基本 URIPATH. 要检索基本 URIPATH, 可以使用 get_resource 方法, 下面是一个示例:

def serve_page_1(cli)
  html = "This is page 1"
  send_response(cli, html)
end

def serve_page_2(cli)
  html = "This is page 2"
  send_response(cli, html)
end

def serve_default_page(cli)
  html = %Q|
  <html>
  <a href="#{get_resource.chomp('/')}/page_1.html">Go to page 1</a><br>
  <a href="#{get_resource.chomp('/')}/page_2.html">Go to page 2</a>
  </html>
  |

  send_response(cli, html)
end

def on_request_uri(cli, request)
  case request.uri
  when /page_1\.html$/
    serve_page_1(cli)
  when /page_2\.html$/
    serve_page_2(cli)
  else
    serve_default_page(cli)
  end
end

当然, 当你编写 Metasploit 浏览器 Exploit 时, 还需要考虑很多其他问题. 例如, 你的模块可能需要进行浏览器检测, 因为允许 Chrome 接收 IE 漏洞没有任何意义. 你可能还需要构建特定于目标的 payload, 这意味着你的模块需要知道它所击中的目标, 并且你必须构建一种方法来相应地自定义 exploit 等. HttpServer 和 HttpServer::HTML mixin 提供了各种方法来使你完成所有这些工作. 请查看 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::HttpServer

  def initialize(info={})
    super(update_info(info,
      'Name'           => "HttpServer mixin example",
      'Description'    => %q{
        Here's an example of using the HttpServer mixin
      },
      'License'        => MSF_LICENSE,
      'Author'         => [ 'sinn3r' ],
      'References'     => 
        [
          [ 'URL', 'http://metasploit.com' ]
        ],
      'Platform'       => 'win',
      'Targets'        =>
        [
          [ 'Generic', {} ],
        ],
      'DisclosureDate' => "Apr 1 2013",
      'DefaultTarget'  => 0))
  end

  def on_request_uri(cli, request)
    html = "hello"
    send_response(cli, html)
  end

end

如果你想进一步了解 mixin 可以做什么, 请参阅: https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/exploit/http/server.rb

Clone this wiki locally