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