metasploit-framework/lib/msf/core/session/interactive.rb

155 lines
2.5 KiB
Ruby

# -*- coding: binary -*-
require 'rex/ui'
require 'rex/io/ring_buffer'
module Msf
module Session
###
#
# This class implements the stubs that are needed to provide an interactive
# session.
#
###
module Interactive
#
# Interactive sessions by default may interact with the local user input
# and output.
#
include Rex::Ui::Interactive
#
# Initializes the session.
#
def initialize(rstream, opts={})
# A nil is passed in the case of non-stream interactive sessions (Meterpreter)
if rstream
self.rstream = rstream
self.ring = Rex::IO::RingBuffer.new(rstream, {:size => opts[:ring_size] || 100 })
end
super()
end
#
# Returns that, yes, indeed, this session supports going interactive with
# the user.
#
def interactive?
true
end
#
# Returns the local information.
#
def tunnel_local
return @local_info if @local_info
begin
@local_info = rstream.localinfo
rescue ::Exception
@local_info = '127.0.0.1'
end
end
#
# Returns the remote peer information.
#
def tunnel_peer
return @peer_info if @peer_info
begin
@peer_info = rstream.peerinfo
rescue ::Exception
@peer_info = '127.0.0.1'
end
end
#
# Run an arbitrary command as if it came from user input.
#
def run_cmd(cmd)
end
#
# Terminate the session
#
def kill
self.reset_ui
self.cleanup
super()
end
#
# Closes rstream.
#
def cleanup
begin
self.interacting = false if self.interactive?
rstream.close if (rstream)
rescue ::Exception
end
rstream = nil
super
end
#
# The remote stream handle. Must inherit from Rex::IO::Stream.
#
attr_accessor :rstream
#
# The RingBuffer object used to allow concurrent access to this session
#
attr_accessor :ring
protected
#
# Stub method that is meant to handler interaction.
#
def _interact
framework.events.on_session_interact(self)
end
#
# Check to see if the user wants to abort.
#
def _interrupt
begin
user_want_abort?
rescue Interrupt
# The user hit ctrl-c while we were handling a ctrl-c. Ignore
end
end
#
# Check to see if we should suspend.
#
def _suspend
# Ask the user if they would like to background the session
if (prompt_yesno("Background session #{name}?") == true)
self.interacting = false
end
end
#
# If the session reaches EOF, deregister it.
#
def _interact_complete
framework.events.on_session_interact_completed()
framework.sessions.deregister(self, "User exit")
end
#
# Checks to see if the user wants to abort.
#
def user_want_abort?
prompt_yesno("Abort session #{name}?")
end
end
end
end