#!/usr/bin/env ruby
#
# This user interface listens on a port and provides clients that connect to
# it with an msfconsole instance.  The nice thing about this interface is that
# it allows multiple clients to share one framework instance and thus makes it
# possible for sessions to to be shared from a single vantage point.
#

msfbase = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
$:.unshift(File.join(File.dirname(msfbase), 'lib'))

require 'msf/base'
require 'msf/ui'

# Declare the argument parser for msfd
arguments = Rex::Parser::Arguments.new(
	"-a" => [ true,  "Bind to this IP address instead of loopback"          ],
	"-p" => [ true,  "Bind to this port instead of 55554"                   ],
	"-f" => [ false, "Run the daemon in the foreground"                     ],
	"-h" => [ false, "Help banner"                                          ])

opts = { 'RunInForeground' => true }
foreground = false

# Parse command line arguments.
arguments.parse(ARGV) { |opt, idx, val|
	case opt
		when "-a"
			opts['ServerHost'] = val
		when "-p"
			opts['ServerPort'] = val
		when "-f"
			foreground = true
		when "-h"
			print(
				"\nUsage: #{File.basename(__FILE__)} <options>\n" +
				arguments.usage)
			exit
	end
}

# Create an instance of the framework
$framework = Msf::Simple::Framework.create

# Fork into the background if requested
begin
	if (not foreground)
		exit(0) if Process.fork()
	end
rescue ::NotImplementedError
	$stderr.puts "[*] Background mode is not available on this platform"
end

# Run the plugin instance in the foreground.
$framework.plugins.load('msfd', opts).run
