class Metasploit::Aggregator::ServerProxy
Attributes
uuid[R]
Public Class Methods
new(host, port)
click to toggle source
# File lib/metasploit/aggregator.rb, line 96 def initialize(host, port) @host = host @port = port @client = Metasploit::Aggregator::Pb::Stub.new("#{@host}:#{@port}", :this_channel_is_insecure) # TODO: add arg{ :channel_override => Core::Channel } to control connection @uuid = SecureRandom.uuid @no_params = Metasploit::Aggregator::Message::No_params.new # server_version = pb_to_array(@client.version(@no_params).value)[0] # raise CompatibilityError("server version mis-match found #{server_version}") unless server_version == version end
Protected Class Methods
register_for_cleanup(connection)
click to toggle source
# File lib/metasploit/aggregator.rb, line 190 def self.register_for_cleanup(connection) @exit_lock.synchronize do unless @cleanup_list @cleanup_list = ::Set.new at_exit { ServerProxy.run_cleanup } end @cleanup_list.add connection end end
run_cleanup()
click to toggle source
# File lib/metasploit/aggregator.rb, line 206 def self.run_cleanup @exit_lock.synchronize do if @cleanup_list @cleanup_list.each do |connection| connection.stop(true) end end end end
unregister_for_cleanup(connection)
click to toggle source
# File lib/metasploit/aggregator.rb, line 200 def self.unregister_for_cleanup(connection) @exit_lock.synchronize do @cleanup_list.delete connection if @cleanup_list end end
Public Instance Methods
add_cable(type, host, port, certificate = nil)
click to toggle source
# File lib/metasploit/aggregator.rb, line 139 def add_cable(type, host, port, certificate = nil) args = nil if certificate.nil? args = Metasploit::Aggregator::Message::Cable_def.new( type: type, host: host, port: port.to_i ) else args = Metasploit::Aggregator::Message::Cable_def.new( type: type, host: host, port: port.to_i, pem: certificate ) end @client.add_cable(args).answer end
available?()
click to toggle source
# File lib/metasploit/aggregator.rb, line 107 def available? begin @client.available(@no_params).answer rescue GRPC::Unavailable false # unavailable if client throws exception. end end
available_addresses()
click to toggle source
# File lib/metasploit/aggregator.rb, line 166 def available_addresses pb_to_array(@client.available_addresses(@no_params).value) end
cables()
click to toggle source
# File lib/metasploit/aggregator.rb, line 119 def cables pb_to_array(@client.cables(@no_params).value) end
default()
click to toggle source
# File lib/metasploit/aggregator.rb, line 162 def default pb_to_array(@client.default(@no_params).value)[0] end
obtain_session(payload, uuid)
click to toggle source
# File lib/metasploit/aggregator.rb, line 124 def obtain_session(payload, uuid) args = Metasploit::Aggregator::Message::String_array.new( value: [payload, uuid] ) @client.obtain_session(args).answer end
register_default(uuid, payload_list)
click to toggle source
# File lib/metasploit/aggregator.rb, line 154 def register_default(uuid, payload_list) uuid = "" if uuid.nil? payloads = [] payloads = payload + payload_list unless payload_list.nil? args = Metasploit::Aggregator::Message::Register.new( uuid: uuid, payloads: payloads ) @client.register_default(args).answer end
register_response_channel(requester)
click to toggle source
# File lib/metasploit/aggregator.rb, line 180 def register_response_channel(requester) unless requester.kind_of? Metasploit::Aggregator::Http::Requester raise ArgumentError("response channel class invalid") end @response_io = requester process end
release_session(payload)
click to toggle source
# File lib/metasploit/aggregator.rb, line 129 def release_session(payload) args = Metasploit::Aggregator::Message::String_array.new( value: [payload] ) @client.release_session(args).answer end
remove_cable(host, port)
click to toggle source
# File lib/metasploit/aggregator.rb, line 149 def remove_cable(host, port) args = Metasploit::Aggregator::Message::String_array.new( value: [host, port] ) @client.remove_cable(args).answer end
session_details(payload)
click to toggle source
# File lib/metasploit/aggregator.rb, line 134 def session_details(payload) args = Metasploit::Aggregator::Message::String_array.new( value: [payload] ) pb_to_map(@client.session_details(args).map) end
sessions()
click to toggle source
# File lib/metasploit/aggregator.rb, line 115 def sessions pb_to_map(@client.sessions(@no_params).map) end
stop(force = false)
click to toggle source
# File lib/metasploit/aggregator.rb, line 170 def stop(force = false) # end the response queue ServerProxy.unregister_for_cleanup(self) unless force @response_queue.push(self) unless @response_queue.nil? @listening_thread.join if @listening_thread @listening_thread = nil @client = nil end
Private Instance Methods
pb_to_array(array)
click to toggle source
# File lib/metasploit/aggregator.rb, line 226 def pb_to_array(array) result = [] array.each do |value| result << value end result end
pb_to_map(map)
click to toggle source
# File lib/metasploit/aggregator.rb, line 218 def pb_to_map(map) result = {} map.each do |key , value| result[key] = value end result end
process()
click to toggle source
# File lib/metasploit/aggregator.rb, line 234 def process @response_queue = EnumeratorQueue.new(self) requests = @client.process(@response_queue.each_item) # add initial key response with only local uuid initial_response = Metasploit::Aggregator::Message::Response.new( uuid: @uuid ) @response_queue.push(initial_response) @listening_thread = Thread.new do begin requests.each do |pb_request| request = Metasploit::Aggregator::Http::Request.new(pb_to_array(pb_request.headers), pb_request.body, nil) response = @response_io.process_request(request) session_id = Metasploit::Aggregator::Http::Request.parse_uri(request) pb_request = Metasploit::Aggregator::Message::Request.new( headers: response.headers, body: response.body ) pb_response = Metasploit::Aggregator::Message::Response.new( uuid: session_id, response: pb_request) @response_queue.push(pb_response) end rescue GRPC::Unavailable false # The remote connection has ended stop this processing thread. end end ServerProxy.register_for_cleanup self end