-
Notifications
You must be signed in to change notification settings - Fork 3
在浏览器 Exploit 中使用 HttpServer
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