88 lines
1.6 KiB
Ruby
88 lines
1.6 KiB
Ruby
#!/usr/bin/env ruby
|
|
|
|
require 'rex/io/stream_abstraction'
|
|
require 'rex/post/meterpreter/channel'
|
|
|
|
module Rex
|
|
module Post
|
|
module Meterpreter
|
|
|
|
###
|
|
#
|
|
# Stream
|
|
# ------
|
|
#
|
|
# This class represents a channel that is streaming. This means
|
|
# that sequential data is flowing in either one or both directions.
|
|
#
|
|
###
|
|
class Stream < Rex::Post::Meterpreter::Channel
|
|
|
|
include Rex::IO::StreamAbstraction
|
|
|
|
class << self
|
|
def cls
|
|
return CHANNEL_CLASS_STREAM
|
|
end
|
|
end
|
|
|
|
##
|
|
#
|
|
# Constructor
|
|
#
|
|
##
|
|
|
|
#
|
|
# Passes the initialization information up to the base class
|
|
#
|
|
def initialize(client, cid, type, flags)
|
|
# sf: initialize_abstraction() before super() as we can get a scenario where dio_write_handler() is called
|
|
# with data to write to the rsock but rsock has not yet been initialized. This happens if the channel
|
|
# is registered (client.add_channel(self) in Channel.initialize) to a session and a 'core_channel_write'
|
|
# request comes in before we have called self.initialize_abstraction()
|
|
initialize_abstraction
|
|
super(client, cid, type, flags)
|
|
end
|
|
|
|
##
|
|
#
|
|
# Remote I/O handlers
|
|
#
|
|
##
|
|
|
|
#
|
|
# Performs a write operation on the right side of the local stream.
|
|
#
|
|
def dio_write_handler(packet, data)
|
|
rv = Rex::ThreadSafe.select(nil, [rsock], nil, 0.01)
|
|
if(rv)
|
|
rsock.write(data)
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
#
|
|
# Performs a close operation on the right side of the local stream.
|
|
#
|
|
def dio_close_handler(packet)
|
|
rsock.close
|
|
|
|
return super(packet)
|
|
end
|
|
|
|
#
|
|
# Cleans up the stream abstraction.
|
|
#
|
|
def cleanup
|
|
super
|
|
|
|
cleanup_abstraction
|
|
end
|
|
|
|
end
|
|
|
|
end; end; end
|
|
|