Class: Msf::Aggregator::ConnectionManager
- Inherits:
-
Object
- Object
- Msf::Aggregator::ConnectionManager
- Defined in:
- lib/msf/aggregator/connection_manager.rb
Class Method Summary collapse
Instance Method Summary collapse
- #add_cable_http(host, port) ⇒ Object
- #add_cable_https(host, port, certificate) ⇒ Object
- #cables ⇒ Object
- #connect_cable(server, host, port, forwarder) ⇒ Object
- #connections ⇒ Object
-
#initialize ⇒ ConnectionManager
constructor
A new instance of ConnectionManager.
- #park(payload) ⇒ Object
- #register_forward(rhost, rport, payload_list = nil) ⇒ Object
- #remove_cable(host, port) ⇒ Object
- #stop ⇒ Object
Constructor Details
#initialize ⇒ ConnectionManager
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_certificate ⇒ Object
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. = 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. = 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 |
#cables ⇒ Object
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 |
#connections ⇒ Object
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 |
#stop ⇒ Object
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 |