2005-07-18 04:07:56 +00:00
|
|
|
require 'msf/base'
|
|
|
|
require 'rex/post/meterpreter'
|
|
|
|
|
|
|
|
module Msf
|
|
|
|
module Sessions
|
|
|
|
|
|
|
|
###
|
|
|
|
#
|
|
|
|
# This class represents a session compatible interface to a meterpreter server
|
|
|
|
# instance running on a remote machine. It provides the means of interacting
|
|
|
|
# with the server instance both at an API level as well as at a console level.
|
|
|
|
#
|
|
|
|
###
|
|
|
|
class Meterpreter < Rex::Post::Meterpreter::Client
|
|
|
|
|
|
|
|
#
|
|
|
|
# The meterpreter session is interactive
|
|
|
|
#
|
|
|
|
include Msf::Session
|
|
|
|
include Msf::Session::Interactive
|
2005-09-30 05:59:44 +00:00
|
|
|
include Msf::Session::Comm
|
2005-07-18 04:07:56 +00:00
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Initializes a meterpreter session instance using the supplied rstream
|
|
|
|
# that is to be used as the client's connection to the server.
|
|
|
|
#
|
2005-07-18 04:07:56 +00:00
|
|
|
def initialize(rstream)
|
|
|
|
super
|
|
|
|
|
2005-07-18 05:59:27 +00:00
|
|
|
#
|
|
|
|
# Initialize the meterpreter client
|
|
|
|
#
|
|
|
|
self.init_meterpreter(rstream)
|
|
|
|
|
2005-07-18 04:07:56 +00:00
|
|
|
#
|
|
|
|
# Create the console instance
|
|
|
|
#
|
2005-07-18 05:13:21 +00:00
|
|
|
self.console = Rex::Post::Meterpreter::Ui::Console.new(self)
|
2005-07-18 04:07:56 +00:00
|
|
|
end
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Returns the session type as being 'meterpreter'.
|
|
|
|
#
|
2005-07-19 14:33:25 +00:00
|
|
|
def self.type
|
|
|
|
"meterpreter"
|
|
|
|
end
|
|
|
|
|
2005-07-18 04:07:56 +00:00
|
|
|
##
|
|
|
|
#
|
|
|
|
# Msf::Session overrides
|
|
|
|
#
|
|
|
|
##
|
2005-11-15 15:11:43 +00:00
|
|
|
|
|
|
|
#
|
|
|
|
# Returns the session description.
|
|
|
|
#
|
2005-07-18 04:07:56 +00:00
|
|
|
def desc
|
|
|
|
"Meterpreter"
|
|
|
|
end
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Calls the class method.
|
|
|
|
#
|
2005-07-18 04:07:56 +00:00
|
|
|
def type
|
2005-07-19 14:33:25 +00:00
|
|
|
self.class.type
|
2005-07-18 04:07:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
#
|
|
|
|
# Msf::Session::Interactive implementors
|
|
|
|
#
|
|
|
|
##
|
|
|
|
|
|
|
|
#
|
2005-11-15 15:11:43 +00:00
|
|
|
# Initializes the console's I/O handles.
|
2005-07-18 04:07:56 +00:00
|
|
|
#
|
|
|
|
def init_ui(input, output)
|
2005-07-18 05:13:21 +00:00
|
|
|
console.init_ui(input, output)
|
2005-10-02 03:21:26 +00:00
|
|
|
console.set_log_source(log_source)
|
2005-12-07 03:40:09 +00:00
|
|
|
|
|
|
|
super
|
2005-07-18 04:07:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
#
|
2005-11-15 15:11:43 +00:00
|
|
|
# Resets the console's I/O handles.
|
2005-07-18 04:07:56 +00:00
|
|
|
#
|
|
|
|
def reset_ui
|
2005-10-02 03:21:26 +00:00
|
|
|
console.unset_log_source
|
2005-07-18 04:07:56 +00:00
|
|
|
console.reset_ui
|
|
|
|
end
|
|
|
|
|
2005-11-19 15:09:41 +00:00
|
|
|
#
|
|
|
|
# Run the supplied command as if it came from suer input.
|
|
|
|
#
|
|
|
|
def queue_cmd(cmd)
|
|
|
|
console.queue_cmd(cmd)
|
|
|
|
end
|
|
|
|
|
2005-07-18 04:07:56 +00:00
|
|
|
#
|
2005-11-15 15:11:43 +00:00
|
|
|
# Interacts with the meterpreter client at a user interface level.
|
2005-07-18 04:07:56 +00:00
|
|
|
#
|
|
|
|
def _interact
|
|
|
|
# Call the console interaction subsystem of the meterpreter client and
|
|
|
|
# pass it a block that returns whether or not we should still be
|
|
|
|
# interacting. This will allow the shell to abort if interaction is
|
|
|
|
# canceled.
|
2005-12-07 03:40:09 +00:00
|
|
|
console.interact { self.interacting != true }
|
2005-07-18 05:13:21 +00:00
|
|
|
|
|
|
|
# If the stop flag has been set, then that means the user exited. Raise
|
|
|
|
# the EOFError so we can drop this bitch like a bad habit.
|
|
|
|
raise EOFError if (console.stopped? == true)
|
2005-07-18 04:07:56 +00:00
|
|
|
end
|
|
|
|
|
2005-09-30 05:59:44 +00:00
|
|
|
|
|
|
|
##
|
|
|
|
#
|
|
|
|
# Msf::Session::Comm implementors
|
|
|
|
#
|
|
|
|
##
|
|
|
|
|
|
|
|
#
|
|
|
|
# Creates a connection based on the supplied parameters and returns it to
|
|
|
|
# the caller. The connection is created relative to the remote machine on
|
|
|
|
# which the meterpreter server instance is running.
|
|
|
|
#
|
|
|
|
def create(param)
|
2005-11-15 20:33:55 +00:00
|
|
|
sock = nil
|
|
|
|
|
|
|
|
# Notify handlers before we create the socket
|
|
|
|
notify_before_socket_create(self, param)
|
|
|
|
|
2005-09-30 05:59:44 +00:00
|
|
|
case param.proto
|
|
|
|
when 'tcp'
|
2005-11-15 20:33:55 +00:00
|
|
|
sock = net.socket.create(param)
|
2005-09-30 05:59:44 +00:00
|
|
|
else
|
|
|
|
raise Rex::UnsupportedProtocol.new(param.proto), caller
|
|
|
|
end
|
2005-11-15 20:33:55 +00:00
|
|
|
|
|
|
|
# Notify now that we've created the socket
|
|
|
|
notify_socket_created(self, sock, param)
|
|
|
|
|
|
|
|
# Return the socket ot the caller
|
|
|
|
sock
|
2005-09-30 05:59:44 +00:00
|
|
|
end
|
|
|
|
|
2005-07-18 04:07:56 +00:00
|
|
|
protected
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
attr_accessor :rstream, :console # :nodoc:
|
2005-07-18 04:07:56 +00:00
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|