-
Notifications
You must be signed in to change notification settings - Fork 3
在浏览器 Exploit 中使用 BrowserExploitServer
Metasploit 框架提供了可用于开发浏览器漏洞 Exploit 的不同 mixin 包, 主要有:
- Msf::Exploit::Remote::HttpServer - HTTP 服务器的最基本形式.
- Msf::Exploit::Remote::HttpServer::HTML - 它提供了 Javascript 函数, 模块可以在制作 HTML 内容时使用.
- Msf::Exploit::Remote::BrowserExploitServer - 其中包括 HttpServer 和 HttpServer::HTML 的功能, 但是还有更多的功能. 此文章涵盖 BrowserExploitServer Minin 的内容.
BrowserExploitServer mixin 是唯一专门为浏览器利用而设计的 mixin. 在使用此 mixin 之前, 你应该了解它在幕后为你做了什么:
- 它自动收集浏览器信息, 包括诸如操作系统名称, 版本, 浏览器名称, 浏览器版本, 是否使用代理, Java 插件版本, Microsoft Office 版本等信息. 如果浏览器未启用 Javascript, 则对目标的信息了解较少. 收集的所有信息将存储在由 mixin 管理的配置中.
- 然后 mixin 将标记浏览器以跟踪会话. 必要时, 它还将使用相同的标签来检索配置.
- 在 mixin 决定是否将 exploit 提供给浏览器之前, 它将与模块检查是否有可利用的条件. 如果不满足利用条件, 它将向浏览器发送 404, 操作失败.
- 如果满足利用条件, 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 或 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
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 代码.