Class: Msf::Aggregator::ConnectionManager

Inherits:
Object
  • Object
show all
Defined in:
lib/msf/aggregator/connection_manager.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeConnectionManager

Returns a new instance of ConnectionManager.



14
15
16
17
18
19
# File 'lib/msf/aggregator/connection_manager.rb', line 14

def initialize
  @cables = []
  @manager_mutex = Mutex.new
  @default_route = []
  @router = Router.instance
end

Class Method Details

.ssl_generate_certificateObject



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/msf/aggregator/connection_manager.rb', line 21

def self.ssl_generate_certificate
  yr   = 24*3600*365
  vf   = Time.at(Time.now.to_i - rand(yr * 3) - yr)
  vt   = Time.at(vf.to_i + (10 * yr))
  cn   = 'localhost'
  key  = OpenSSL::PKey::RSA.new(2048){ }
  cert = OpenSSL::X509::Certificate.new
  cert.version    = 2
  cert.serial     = (rand(0xFFFFFFFF) << 32) + rand(0xFFFFFFFF)
  cert.subject    = OpenSSL::X509::Name.new([["CN", cn]])
  cert.issuer     = OpenSSL::X509::Name.new([["CN", cn]])
  cert.not_before = vf
  cert.not_after  = vt
  cert.public_key = key.public_key

  ef = OpenSSL::X509::ExtensionFactory.new(nil,cert)
  cert.extensions = [
      ef.create_extension("basicConstraints","CA:FALSE")
  ]
  ef.issuer_certificate = cert

  cert.sign(key, OpenSSL::Digest::SHA256.new)

  [key, cert, nil]
end

Instance Method Details

#add_cable_http(host, port) ⇒ Object



81
82
83
84
85
86
87
88
89
90
# File 'lib/msf/aggregator/connection_manager.rb', line 81

def add_cable_http(host, port)
  @manager_mutex.synchronize do
    forwarder = Msf::Aggregator::HttpForwarder.new
    forwarder.log_messages = true
    server = TCPServer.new(host, port)

    handler = connect_cable(server, host, port, forwarder)
    @cables << Cable.new(handler, server, forwarder)
  end
end

#add_cable_https(host, port, certificate) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/msf/aggregator/connection_manager.rb', line 62

def add_cable_https(host, port, certificate)
  @manager_mutex.synchronize do
    forwarder = Msf::Aggregator::HttpsForwarder.new
    forwarder.log_messages = true
    server = TCPServer.new(host, port)
    ssl_context = OpenSSL::SSL::SSLContext.new
    unless certificate.nil?
      ssl_context.key, ssl_context.cert = ssl_parse_certificate(certificate)
    else
      ssl_context.key, ssl_context.cert = Msf::Aggregator::ConnectionManager.ssl_generate_certificate
    end
    ssl_server = OpenSSL::SSL::SSLServer.new(server, ssl_context)

    handler = connect_cable(ssl_server, host, port, forwarder)
    @cables << Cable.new(handler, server, forwarder)
    handler
  end
end

#cablesObject



118
119
120
121
122
123
124
125
# File 'lib/msf/aggregator/connection_manager.rb', line 118

def cables
  local_cables = []
  @cables.each do |cable|
    addr = cable.server.local_address
    local_cables << addr.ip_address + ':' + addr.ip_port.to_s
  end
  local_cables
end

#connect_cable(server, host, port, forwarder) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/msf/aggregator/connection_manager.rb', line 127

def connect_cable(server, host, port, forwarder)
  Logger.log "Listening on port #{host}:#{port}"

  handler = Thread.new do
    begin
      loop do
        Logger.log "waiting for connection on #{host}:#{port}"
        connection = server.accept
        Logger.log "got connection on #{host}:#{port}"
        Thread.new do
          begin
            forwarder.forward(connection)
          rescue
            Logger.log $!
          end
          Logger.log "completed connection on #{host}:#{port}"
        end
      end
    end
  end
  handler
end

#connectionsObject



110
111
112
113
114
115
116
# File 'lib/msf/aggregator/connection_manager.rb', line 110

def connections
  connections = {}
  @cables.each do |cable|
    connections = connections.merge cable.forwarder.connections
  end
  connections
end

#park(payload) ⇒ Object



176
177
178
179
# File 'lib/msf/aggregator/connection_manager.rb', line 176

def park(payload)
  @router.add_route(nil, nil, payload)
  Logger.log "parking #{payload}"
end

#register_forward(rhost, rport, payload_list = nil) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/msf/aggregator/connection_manager.rb', line 92

def register_forward(rhost, rport, payload_list = nil)
  @cables.each do |cable|
    addr = cable.server.local_address
    if addr.ip_address == rhost && addr.ip_port == rport.to_i
      raise ArgumentError.new("#{rhost}:#{rport} is not a valid forward")
    end
  end
  if payload_list.nil?
    # add the this host and port as the new default route
    @default_route = [rhost, rport]
    @router.add_route(rhost, rport, nil)
  else
    payload_list.each do |payload|
      @router.add_route(rhost, rport, payload)
    end
  end
end

#remove_cable(host, port) ⇒ Object



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/msf/aggregator/connection_manager.rb', line 150

def remove_cable(host, port)
  @manager_mutex.synchronize do
    closed_servers = []
    @cables.each do |cable|
      addr = cable.server.local_address
      if addr.ip_address == host && addr.ip_port == port.to_i
        cable.server.close
        cable.thread.exit
        closed_servers << cable
      end
    end
    @cables -= closed_servers
  end
  return true
end

#stopObject



167
168
169
170
171
172
173
174
# File 'lib/msf/aggregator/connection_manager.rb', line 167

def stop
  @manager_mutex.synchronize do
    @cables.each do |listener|
      listener.server.close
      listener.thread.exit
    end
  end
end