#!/usr/bin/env ruby # # $Id$ # # This user interface allows users to interact with a remote framework # instance through a XMLRPC socket. # # $Revision$ # msfbase = __FILE__ while File.symlink?(msfbase) msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase)) end $:.unshift(File.join(File.dirname(msfbase), 'lib')) require 'fastlib' $:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB'] require 'rex/parser/arguments' # Declare the argument parser for msfrpc arguments = Rex::Parser::Arguments.new( "-a" => [ true, "Connect to this IP address" ], "-p" => [ true, "Connect to the specified port instead of 55553" ], "-U" => [ true, "Specify the username to access msfrpcd" ], "-P" => [ true, "Specify the password to access msfrpcd" ], "-t" => [ true, "Type of RPC daemon, [XML|Msg]" ], "-S" => [ false, "Disable SSL on the RPC socket" ], "-h" => [ false, "Help banner" ] ) opts = { 'User' => 'msf', 'SSL' => true, 'ServerPort' => 55553, 'Type' => 'Xml' } # Parse command line arguments. arguments.parse(ARGV) { |opt, idx, val| case opt when "-a" opts['ServerHost'] = val when "-S" opts['SSL'] = false when "-p" opts['ServerPort'] = val when '-U' opts['User'] = val when '-P' opts['Pass'] = val when '-t' opts['Type'] = (val =~ /xml/i) ? 'XML' : 'Msg' when "-h" print("\nUsage: #{File.basename(__FILE__)} \n" + arguments.usage) exit end } if(not opts['ServerHost']) $stderr.puts "[-] Error: a server IP must be specified (-a)" $stderr.puts arguments.usage exit(0) end if(not opts['Pass']) $stderr.puts "[-] Error: a password must be specified (-P)" $stderr.puts arguments.usage exit(0) end $0 = "msfrpc" if opts['Type'] == 'Msg' require 'msf/core/rpc/v10/client' else require 'msf/core/rpc/client' end require 'rex/ui' rpc = Msf::RPC::Client.new( :host => opts['ServerHost'], :port => opts['ServerPort'], :ssl => opts['SSL'] ) res = rpc.login(opts['User'], opts['Pass']) puts "[*] The 'rpc' object holds the RPC client interface" puts "" while(ARGV.shift) end Rex::Ui::Text::IrbShell.new(binding).run