123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- #!/usr/bin/env ruby
- # -*- coding: binary -*-
- #
- # $Id$
- #
- # This user interface listens on a port and provides clients that connect to
- # it with an RPC interface to the Metasploit Framework.
- #
- # $Revision$
- #
- msfbase = __FILE__
- while File.symlink?(msfbase)
- msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
- end
- $:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
- require 'msfenv'
- $:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
- require 'rex/parser/arguments'
- # Declare the argument parser for msfrpcd
- arguments = Rex::Parser::Arguments.new(
- "-a" => [ true, "Bind to this IP address" ],
- "-p" => [ true, "Bind to this port instead of 55553" ],
- "-U" => [ true, "Specify the username to access msfrpcd" ],
- "-P" => [ true, "Specify the password to access msfrpcd" ],
- "-u" => [ true, "URI for Web server" ],
- "-S" => [ false, "Disable SSL on the RPC socket" ],
- "-f" => [ false, "Run the daemon in the foreground" ],
- "-n" => [ false, "Disable database" ],
- "-h" => [ false, "Help banner" ])
- opts = {
- 'RunInForeground' => true,
- 'SSL' => true,
- 'ServerHost' => '0.0.0.0',
- 'ServerPort' => 55553,
- 'ServerType' => 'Msg'
- }
- foreground = false
- frameworkOpts = {}
- # 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 "-f"
- foreground = true
- when "-u"
- opts['URI'] = val
- when "-n"
- frameworkOpts['DisableDatabase'] = true
- when "-h"
- print("\nUsage: #{File.basename(__FILE__)} <options>\n" + arguments.usage)
- exit
- end
- }
- unless opts['Pass']
- $stderr.puts "[-] Error: a password must be specified (-P)"
- exit(0)
- end
- $0 = "msfrpcd"
- rpctype = 'MSG'
- $stderr.puts "[*] #{rpctype}RPC starting on #{opts['ServerHost']}:#{opts['ServerPort']} (#{opts['SSL'] ? "SSL" : "NO SSL"}):#{opts['ServerType']}..."
- $stderr.puts "[*] URI: #{opts['URI']}" if opts['URI']
- require 'msf/base'
- require 'msf/ui'
- # Fork into the background if requested
- begin
- if foreground
- $stdout.puts "[*] #{rpctype}RPC ready at #{Time.now}."
- else
- $stderr.puts "[*] #{rpctype}RPC backgrounding at #{Time.now}..."
- exit(0) if Process.fork()
- end
- rescue ::NotImplementedError
- $stderr.puts "[-] Background mode is not available on this platform"
- end
- # Create an instance of the framework
- $framework = Msf::Simple::Framework.create(frameworkOpts)
- # Run the plugin instance in the foreground.
- begin
- $framework.plugins.load("#{rpctype.downcase}rpc", opts).run
- rescue ::Interrupt
- $stderr.puts "[*] Shutting down"
- end
|