starting to work on session stuff, tired
git-svn-id: file:///home/svn/incoming/trunk@2519 4d416f70-5f16-0410-b530-b9f4589650daunstable
parent
24f53393f3
commit
1bf8d8b5ac
|
@ -1,26 +0,0 @@
|
|||
require 'Msf/Core'
|
||||
|
||||
module Msf
|
||||
module Test
|
||||
|
||||
###
|
||||
#
|
||||
# FrameworkCoreTestSuite
|
||||
# ----------------------
|
||||
#
|
||||
# This test suite is used to test the various core components of
|
||||
# framework-core.
|
||||
#
|
||||
###
|
||||
class FrameworkCoreTestSuite
|
||||
def self.suite
|
||||
suite = ::Test::Unit::TestSuite.new
|
||||
|
||||
suite << Msf::Test::OptionContainerTestCase.suite
|
||||
|
||||
return suite;
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
|
@ -41,62 +41,37 @@ end
|
|||
###
|
||||
class Session
|
||||
|
||||
def initialize(framework, sid, stream = nil)
|
||||
self.framework = framework
|
||||
self.stream = stream
|
||||
self.sid = sid
|
||||
|
||||
# Call the framework event dispatcher to let it know that we've
|
||||
# opened a new session
|
||||
framework.events.on_session_open(self)
|
||||
def initialize(conn = nil)
|
||||
self.conn = conn
|
||||
end
|
||||
|
||||
# Read length supplied bytes from the stream
|
||||
#
|
||||
# Read length supplied bytes from the conn
|
||||
#
|
||||
def read(length = nil)
|
||||
return stream.read(length)
|
||||
return conn.read(length)
|
||||
end
|
||||
|
||||
# Write the supplied buffer to the stream
|
||||
#
|
||||
# Write the supplied buffer to the conn
|
||||
#
|
||||
def write(buf)
|
||||
return stream.write(buf)
|
||||
return conn.write(buf)
|
||||
end
|
||||
|
||||
# Close the session's stream and perform cleanup as necessary
|
||||
#
|
||||
# Close the session's conn and perform cleanup as necessary
|
||||
#
|
||||
def close
|
||||
# Call the framework event dispatcher to let it know that we've
|
||||
# closed a session
|
||||
framework.events.on_session_close(self)
|
||||
|
||||
return stream.close
|
||||
return conn.close
|
||||
end
|
||||
|
||||
attr_reader :sid, :stream
|
||||
attr_reader :conn
|
||||
attr_accessor :framework, :sid
|
||||
|
||||
protected
|
||||
|
||||
attr_writer :sid, :stream
|
||||
attr_accessor :framework
|
||||
end
|
||||
|
||||
#
|
||||
#
|
||||
# Built-in session classes
|
||||
#
|
||||
#
|
||||
|
||||
###
|
||||
#
|
||||
# ShellSession
|
||||
# ------------
|
||||
#
|
||||
# This class represents a session that is associated with a command
|
||||
# interpreter. Its read and write operations interact with whatever
|
||||
# command interpreter it is backed against, whether it be local or
|
||||
# otherwise.
|
||||
#
|
||||
###
|
||||
class ShellSession < Session
|
||||
|
||||
attr_writer :conn
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
module Msf
|
||||
|
||||
###
|
||||
#
|
||||
# SessionManager
|
||||
# --------------
|
||||
#
|
||||
# The purpose of the session manager is to keep track of sessions that are
|
||||
# created during the course of a framework instance's lifetime. When
|
||||
# exploits succeed, the payloads they use will create a session object,
|
||||
# where applicable, there will implement zero or more of the core
|
||||
# supplied interfaces for interacting with that session. For instance,
|
||||
# if the payload supports reading and writing from an executed process,
|
||||
# the session would implement SimpleCommandShell in a method that is
|
||||
# applicable to the way that the command interpreter is communicated
|
||||
# with.
|
||||
#
|
||||
###
|
||||
class SessionManager
|
||||
|
||||
def initialize(framework)
|
||||
self.framework = framework
|
||||
self.sessions = {}
|
||||
self.sid_pool = 0
|
||||
end
|
||||
|
||||
#
|
||||
# Returns the session object that is associated with the supplied sid
|
||||
#
|
||||
def [](sid)
|
||||
return get(sid)
|
||||
end
|
||||
|
||||
#
|
||||
# Registers the supplied session object with the framework and returns
|
||||
# a unique session identifier to the caller.
|
||||
#
|
||||
def register(session)
|
||||
if (session.sid)
|
||||
wlog("registered session passed to register again (sid #{session.sid}).")
|
||||
return nil
|
||||
end
|
||||
|
||||
next_sid = (sid_pool += 1)
|
||||
|
||||
# Insert the session into the session hash table
|
||||
sessions[next_sid] = session
|
||||
|
||||
# Initialize the session's sid and framework instance pointer
|
||||
session.sid = next_sid
|
||||
session.framework = framework
|
||||
|
||||
# Notify the framework that we have a new session opening up...
|
||||
framework.events.on_session_open(session)
|
||||
|
||||
return next_sid
|
||||
end
|
||||
|
||||
#
|
||||
# Deregisters the supplied session object with the framework
|
||||
#
|
||||
def deregister(session)
|
||||
# Tell the framework that we have a parting session
|
||||
framework.events.on_session_close(session)
|
||||
|
||||
# Remove it from the hash
|
||||
sessions.delete(session.sid)
|
||||
|
||||
# Close it down
|
||||
session.close
|
||||
end
|
||||
|
||||
#
|
||||
# Returns the session associated with the supplied sid, if any
|
||||
#
|
||||
def get(sid)
|
||||
return sessions[sid]
|
||||
end
|
||||
|
||||
protected:
|
||||
|
||||
attr_accessor :sid_pool, :sessions
|
||||
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue