metasploit-aggregator 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,55 @@
1
+ module Msf
2
+ module Aggregator
3
+ class Forwarder
4
+ CONNECTION_TIMEOUT = 60 # one minute
5
+
6
+ attr_accessor :log_messages
7
+ attr_reader :response_queues
8
+
9
+ def initialize
10
+ @log_messages = false
11
+ @response_queues = {}
12
+ @responding_threads = {}
13
+ @forwarder_mutex = Mutex.new
14
+ @router = Router.instance
15
+ end
16
+
17
+ # stub for indexing
18
+ def forward(connection)
19
+
20
+ end
21
+
22
+ def connections
23
+ # TODO: for now before reporting connections flush stale ones
24
+ flush_stale_sessions
25
+ connections = {}
26
+ @response_queues.each_pair do |connection, queue|
27
+ forward = 'parked'
28
+ host, port = @router.get_forward(connection)
29
+ unless host.nil?
30
+ forward = "#{host}:#{port}"
31
+ end
32
+ connections[connection] = forward
33
+ end
34
+ connections
35
+ end
36
+
37
+ def flush_stale_sessions
38
+ @forwarder_mutex.synchronize do
39
+ stale_sessions = []
40
+ @response_queues.each_pair do |uri, queue|
41
+ unless (queue.time + CONNECTION_TIMEOUT) > Time.now
42
+ stale_sessions << uri
43
+ end
44
+ end
45
+ stale_sessions.each do |uri|
46
+ @response_queues[uri].stop_processing
47
+ @response_queues.delete(uri)
48
+ end
49
+ end
50
+ end
51
+
52
+ private :flush_stale_sessions
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,28 @@
1
+ module Msf
2
+ module Aggregator
3
+ module Http
4
+ class Request
5
+ attr_reader :headers
6
+ attr_reader :body
7
+ attr_reader :socket
8
+
9
+ def initialize(request_headers, request_body, socket)
10
+ @headers = request_headers
11
+ @body = request_body
12
+ @socket = socket
13
+ end
14
+
15
+ def self.parse_uri(http_request)
16
+ req = http_request.headers[0]
17
+ parts = req.split(/ /)
18
+ uri = nil
19
+ if parts.length >= 2
20
+ uri = req.split(/ /)[1]
21
+ uri = uri.chomp('/')
22
+ end
23
+ uri
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,151 @@
1
+ require "msf/aggregator/http/request"
2
+
3
+ module Msf
4
+ module Aggregator
5
+ module Http
6
+ class Responder
7
+
8
+ attr_accessor :queue
9
+ attr_accessor :time
10
+ attr_accessor :log_messages
11
+ attr_reader :uri
12
+
13
+ def initialize(uri)
14
+ @uri = uri
15
+ @queue = Queue.new
16
+ @thread = Thread.new { process_requests }
17
+ @time = Time.now
18
+ @router = Router.instance
19
+ end
20
+
21
+ def process_requests
22
+
23
+ while true do
24
+ begin
25
+ request_task = @queue.pop
26
+ connection = request_task.socket
27
+ request_task.headers
28
+
29
+ # peer_addr = connection.io.peeraddr[3]
30
+
31
+ host, port = @router.get_forward(@uri)
32
+ if host.nil?
33
+ # when no forward found park the connection for now
34
+ # in the future this may get smarter and return a 404 or something
35
+ send_parked_response(connection)
36
+ next
37
+ end
38
+
39
+ client = nil
40
+
41
+ begin
42
+ client = get_connection(host, port)
43
+ rescue StandardError => e
44
+ log 'error on console connect ' + e.to_s
45
+ send_parked_response(connection)
46
+ next
47
+ end
48
+
49
+ log 'connected to console'
50
+
51
+ request_task.headers.each do |line|
52
+ client.write line
53
+ end
54
+ unless request_task.body.nil?
55
+ client.write request_task.body
56
+ end
57
+ client.flush
58
+ # log "From victim: \n" + request_lines.join()
59
+
60
+ begin
61
+ response = ''
62
+ request_obj = Responder.get_data(client, true)
63
+ request_obj.headers.each do |line|
64
+ connection.write line
65
+ response += line
66
+ end
67
+ unless request_obj.body.nil?
68
+ connection.write request_obj.body
69
+ end
70
+ connection.flush
71
+ # log "From console: \n" + response
72
+ rescue
73
+ log $!
74
+ end
75
+ close_connection(client)
76
+ close_connection(connection)
77
+ rescue Exception => e
78
+ log "an error occurred processing request from #{@uri}"
79
+ end
80
+ end
81
+
82
+ end
83
+
84
+ def stop_processing
85
+ @thread.exit
86
+ end
87
+
88
+ def send_parked_response(connection)
89
+ address = connection.peeraddr[3]
90
+ log "sending parked response to #{address}"
91
+ parked_message = []
92
+ parked_message << 'HTTP/1.1 200 OK'
93
+ parked_message << 'Content-Type: application/octet-stream'
94
+ parked_message << 'Connection: close'
95
+ parked_message << 'Server: Apache'
96
+ parked_message << 'Content-Length: 0'
97
+ parked_message << ' '
98
+ parked_message << ' '
99
+ parked_message.each do |line|
100
+ connection.puts line
101
+ end
102
+ close_connection(connection)
103
+ end
104
+
105
+ def self.get_data(connection, guaranteed_length)
106
+ checked_first = has_length = guaranteed_length
107
+ content_length = 0
108
+ request_lines = []
109
+
110
+ while (input = connection.gets)
111
+ request_lines << input
112
+ # break for body read
113
+ break if (input.inspect.gsub /^"|"$/, '').eql? '\r\n'
114
+
115
+ if !checked_first && !has_length
116
+ has_length = input.include?('POST')
117
+ checked_first = true
118
+ end
119
+
120
+ if has_length && input.include?('Content-Length')
121
+ content_length = input[(input.index(':') + 1)..input.length].to_i
122
+ end
123
+
124
+ end
125
+ body = ''
126
+ if has_length
127
+ while body.length < content_length
128
+ body += connection.read(content_length - body.length)
129
+ end
130
+ end
131
+ Request.new request_lines, body, connection
132
+ end
133
+
134
+ def get_connection(host, port)
135
+ TCPSocket.new host, port
136
+ end
137
+
138
+ def close_connection(connection)
139
+ connection.close
140
+ end
141
+
142
+ def log(message)
143
+ Logger.log message if @log_messages
144
+ end
145
+
146
+ private :log
147
+ private :send_parked_response
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,28 @@
1
+ require "msf/aggregator/http/request"
2
+ require "msf/aggregator/http/responder"
3
+
4
+ module Msf
5
+ module Aggregator
6
+ module Http
7
+ class SslResponder < Responder
8
+ def initialize(uri)
9
+ super
10
+ end
11
+
12
+ def get_connection(host, port)
13
+ tcp_client = TCPSocket.new host, port
14
+ ssl_context = OpenSSL::SSL::SSLContext.new
15
+ ssl_context.ssl_version = :TLSv1
16
+ ssl_client = OpenSSL::SSL::SSLSocket.new tcp_client, ssl_context
17
+ ssl_client.connect
18
+ ssl_client
19
+ end
20
+
21
+ def close_connection(connection)
22
+ connection.sync_close = true
23
+ connection.close
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,40 @@
1
+ require 'socket'
2
+ require 'msf/aggregator/forwarder'
3
+ require 'msf/aggregator/http/request'
4
+ require 'msf/aggregator/http/responder'
5
+ require 'msf/aggregator/logger'
6
+ require 'msf/aggregator/router'
7
+
8
+ module Msf
9
+ module Aggregator
10
+ class HttpForwarder < Forwarder
11
+ CONNECTION_TIMEOUT = 60 # one minute
12
+
13
+ attr_accessor :log_messages
14
+ attr_reader :response_queues
15
+
16
+ def initialize
17
+ super
18
+ end
19
+
20
+ def forward(connection)
21
+ #forward input requests
22
+ request_obj = Msf::Aggregator::Http::Responder.get_data(connection, false)
23
+ uri = Msf::Aggregator::Http::Request.parse_uri(request_obj)
24
+ @forwarder_mutex.synchronize do
25
+ unless uri.nil?
26
+ unless @response_queues[uri]
27
+ uri_responder = Msf::Aggregator::Http::Responder.new(uri)
28
+ uri_responder.log_messages = @log_messages
29
+ @response_queues[uri] = uri_responder
30
+ end
31
+ @response_queues[uri].queue << request_obj
32
+ @response_queues[uri].time = Time.now
33
+ else
34
+ connection.close
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,39 @@
1
+ require 'socket'
2
+ require 'openssl'
3
+ require 'msf/aggregator/forwarder'
4
+ require 'msf/aggregator/http/request'
5
+ require 'msf/aggregator/http/ssl_responder'
6
+ require 'msf/aggregator/logger'
7
+ require 'msf/aggregator/router'
8
+
9
+ module Msf
10
+ module Aggregator
11
+
12
+ class HttpsForwarder < Forwarder
13
+
14
+ def initialize
15
+ super
16
+ end
17
+
18
+ def forward(connection)
19
+ #forward input requests
20
+ request_obj = Msf::Aggregator::Http::SslResponder.get_data(connection, false)
21
+ uri = Msf::Aggregator::Http::Request.parse_uri(request_obj)
22
+ @forwarder_mutex.synchronize do
23
+ unless uri.nil?
24
+ unless @response_queues[uri]
25
+ uri_responder = Msf::Aggregator::Http::SslResponder.new(uri)
26
+ uri_responder.log_messages = @log_messages
27
+ @response_queues[uri] = uri_responder
28
+ end
29
+ @response_queues[uri].queue << request_obj
30
+ @response_queues[uri].time = Time.now
31
+ else
32
+ connection.sync_close = true
33
+ connection.close
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,5 @@
1
+ class Logger
2
+ def self.log(message)
3
+ $stderr.puts Time.now.to_s + ' ' + message
4
+ end
5
+ end
@@ -0,0 +1,41 @@
1
+ require 'singleton'
2
+
3
+ module Msf
4
+ module Aggregator
5
+ class Router
6
+ include Singleton
7
+
8
+ def initialize
9
+ @mutex = Mutex.new
10
+ @forward_routes = {}
11
+ end
12
+
13
+ def add_route(rhost, rport, payload)
14
+ forward = [rhost, rport]
15
+ @mutex.synchronize do
16
+ if payload.nil?
17
+ @forward_routes['default'] = forward
18
+ return
19
+ end
20
+ @forward_routes[payload] = forward
21
+ end
22
+ end
23
+
24
+ def remove_route(payload)
25
+ unless payload.nil?
26
+ @mutex.synchronize do
27
+ @forward_routes.delete(payload)
28
+ end
29
+ end
30
+ end
31
+
32
+ def get_forward(uri)
33
+ unless @forward_routes[uri].nil?
34
+ @forward_routes[uri]
35
+ else
36
+ @forward_routes['default']
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,5 @@
1
+ module Msf
2
+ module Aggregator
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'msf/aggregator/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "metasploit-aggregator"
8
+ spec.version = Msf::Aggregator::VERSION
9
+ spec.authors = ['Metasploit Hackers']
10
+ spec.email = ['metasploit-hackers@lists.sourceforge.net']
11
+ spec.summary = "metasploit-aggregator"
12
+ spec.description = "metasploit-aggregator"
13
+ spec.homepage = 'https://www.msf.com'
14
+ spec.license = 'BSD-3-Clause'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = "bin"
20
+ spec.executables << 'msfaggregator'
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.13"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rspec", "~> 3.0"
26
+ spec.add_runtime_dependency 'msgpack'
27
+ spec.add_runtime_dependency 'msgpack-rpc'
28
+ end
metadata ADDED
@@ -0,0 +1,218 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: metasploit-aggregator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Metasploit Hackers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
14
+ A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
15
+ Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
16
+ MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
17
+ A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
18
+ hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
19
+ RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
20
+ gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
21
+ KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
22
+ QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
23
+ XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
24
+ DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
25
+ LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
26
+ RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
27
+ jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
28
+ 6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
29
+ mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
30
+ Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
31
+ WD9f
32
+ -----END CERTIFICATE-----
33
+ - |
34
+ -----BEGIN CERTIFICATE-----
35
+ MIIElDCCA3ygAwIBAgIOSBtqBybS6D8mAtSCWs0wDQYJKoZIhvcNAQELBQAwTDEg
36
+ MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2Jh
37
+ bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTYwNjE1MDAwMDAwWhcNMjQw
38
+ NjE1MDAwMDAwWjBaMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBu
39
+ di1zYTEwMC4GA1UEAxMnR2xvYmFsU2lnbiBDb2RlU2lnbmluZyBDQSAtIFNIQTI1
40
+ NiAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjYVVI6kfU6/J
41
+ 7TbCKbVu2PlC9SGLh/BDoS/AP5fjGEfUlk6Iq8Zj6bZJFYXx2Zt7G/3YSsxtToZA
42
+ F817ukcotdYUQAyG7h5LM/MsVe4hjNq2wf6wTjquUZ+lFOMQ5pPK+vldsZCH7/g1
43
+ LfyiXCbuexWLH9nDoZc1QbMw/XITrZGXOs5ynQYKdTwfmOPLGC+MnwhKkQrZ2TXZ
44
+ g5J2Yl7fg67k1gFOzPM8cGFYNx8U42qgr2v02dJsLBkwXaBvUt/RnMngDdl1EWWW
45
+ 2UO0p5A5rkccVMuxlW4l3o7xEhzw127nFE2zGmXWhEpX7gSvYjjFEJtDjlK4Prau
46
+ niyX/4507wIDAQABo4IBZDCCAWAwDgYDVR0PAQH/BAQDAgEGMB0GA1UdJQQWMBQG
47
+ CCsGAQUFBwMDBggrBgEFBQcDCTASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQW
48
+ BBQPOueslJF0LZYCc4OtnC5JPxmqVDAfBgNVHSMEGDAWgBSP8Et/qC5FJK5NUPpj
49
+ move4t0bvDA+BggrBgEFBQcBAQQyMDAwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3Nw
50
+ Mi5nbG9iYWxzaWduLmNvbS9yb290cjMwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDov
51
+ L2NybC5nbG9iYWxzaWduLmNvbS9yb290LXIzLmNybDBjBgNVHSAEXDBaMAsGCSsG
52
+ AQQBoDIBMjAIBgZngQwBBAEwQQYJKwYBBAGgMgFfMDQwMgYIKwYBBQUHAgEWJmh0
53
+ dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMA0GCSqGSIb3DQEB
54
+ CwUAA4IBAQAVhCgM7aHDGYLbYydB18xjfda8zzabz9JdTAKLWBoWCHqxmJl/2DOK
55
+ XJ5iCprqkMLFYwQL6IdYBgAHglnDqJQy2eAUTaDVI+DH3brwaeJKRWUtTUmQeGYy
56
+ DrBowLCIsI7tXAb4XBBIPyNzujtThFKAzfCzFcgRCosFeEZZCNS+t/9L9ZxqTJx2
57
+ ohGFRYzUN+5Q3eEzNKmhHzoL8VZEim+zM9CxjtEMYAfuMsLwJG+/r/uBAXZnxKPo
58
+ 4KvcM1Uo42dHPOtqpN+U6fSmwIHRUphRptYCtzzqSu/QumXSN4NTS35nfIxA9gcc
59
+ sK8EBtz4bEaIcpzrTp3DsLlUo7lOl8oU
60
+ -----END CERTIFICATE-----
61
+ - |
62
+ -----BEGIN CERTIFICATE-----
63
+ MIIE5jCCA86gAwIBAgIMKDuO03uv6RWXR1uAMA0GCSqGSIb3DQEBCwUAMFoxCzAJ
64
+ BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTAwLgYDVQQDEydH
65
+ bG9iYWxTaWduIENvZGVTaWduaW5nIENBIC0gU0hBMjU2IC0gRzMwHhcNMTYwOTEz
66
+ MTgxMDIyWhcNMTkxMTExMTUxNTM4WjBgMQswCQYDVQQGEwJVUzEWMBQGA1UECBMN
67
+ TWFzc2FjaHVzZXR0czEPMA0GA1UEBxMGQm9zdG9uMRMwEQYDVQQKEwpSYXBpZDcg
68
+ TExDMRMwEQYDVQQDEwpSYXBpZDcgTExDMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
69
+ MIIBCgKCAQEAl0HeC0FzN1BJ4nQkxsBng3peS9Bdi9rpSGx+g0Ximd+M/7twmund
70
+ bzn2JPbNK/Gp/rq/SytrNSLcUzcbH/0z5Ltyw1/jQsGtRBrns0NZSRXqupQDW5R6
71
+ HFpaIAl3OdsesmIQc/fm0uhh8dkfHVo7UsZO/TeCPoy0uHXTI6aFBPzMMsdz+gf3
72
+ cCCLsnNKQh/T2Q/jwBs3NTPoyza/pPZcvGogKcWCeNihTO5Rn1Fc71sMHSjQsDtn
73
+ 1fWGKYGi0qjvZ4lpGM9IFZMTbySKHbPLhhHnBOoV7avGemdky3AEsUeiT+6DY0P1
74
+ IydBy24uVNhGATglME1ttlT4Eme/to0M6wIDAQABo4IBpDCCAaAwDgYDVR0PAQH/
75
+ BAQDAgeAMIGUBggrBgEFBQcBAQSBhzCBhDBIBggrBgEFBQcwAoY8aHR0cDovL3Nl
76
+ Y3VyZS5nbG9iYWxzaWduLmNvbS9jYWNlcnQvZ3Njb2Rlc2lnbnNoYTJnM29jc3Au
77
+ Y3J0MDgGCCsGAQUFBzABhixodHRwOi8vb2NzcDIuZ2xvYmFsc2lnbi5jb20vZ3Nj
78
+ b2Rlc2lnbnNoYTJnMzBWBgNVHSAETzBNMEEGCSsGAQQBoDIBMjA0MDIGCCsGAQUF
79
+ BwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzAIBgZn
80
+ gQwBBAEwCQYDVR0TBAIwADA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmds
81
+ b2JhbHNpZ24uY29tL2dzY29kZXNpZ25zaGEyZzMuY3JsMBMGA1UdJQQMMAoGCCsG
82
+ AQUFBwMDMB0GA1UdDgQWBBSm8RBpBC/cK9VmxzO2+RWnacN8CTAfBgNVHSMEGDAW
83
+ gBQPOueslJF0LZYCc4OtnC5JPxmqVDANBgkqhkiG9w0BAQsFAAOCAQEANVO3uYQl
84
+ h8iicbaXE3odrL+kXXmeeNgt4BD3x7GKAVIVixtwBS6pvrshjc1LN0tm3ruiv8oy
85
+ cq4FiEmVUXZejSRvVVtABeWdZWo+lJ8NxCBUEYYmnMrjgFIbGiEbBsg7PGtyeQsA
86
+ 5Wbg7Lx889mS1tKfQBcPif8EjpTiXNfMiywmpaMYmvm+yQgzrRLDbjz6JV0Rc5Ga
87
+ WChka+LTPnMtsWJuFM8ka8icMeS28/nAGERdewxWvz+DeAPMORdTJ7aqb6+Y9xuz
88
+ G+Hmcg1v810agasPdoydE0RTVZgEOOMoQ07qu7JFXVWZ9ZQpHT7qJATWL/b2csFG
89
+ 8mVuTXnyJOKRJA==
90
+ -----END CERTIFICATE-----
91
+ date: 2016-12-21 00:00:00.000000000 Z
92
+ dependencies:
93
+ - !ruby/object:Gem::Dependency
94
+ name: bundler
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '1.13'
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '1.13'
107
+ - !ruby/object:Gem::Dependency
108
+ name: rake
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '10.0'
114
+ type: :development
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '10.0'
121
+ - !ruby/object:Gem::Dependency
122
+ name: rspec
123
+ requirement: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '3.0'
128
+ type: :development
129
+ prerelease: false
130
+ version_requirements: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: '3.0'
135
+ - !ruby/object:Gem::Dependency
136
+ name: msgpack
137
+ requirement: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ type: :runtime
143
+ prerelease: false
144
+ version_requirements: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ - !ruby/object:Gem::Dependency
150
+ name: msgpack-rpc
151
+ requirement: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ type: :runtime
157
+ prerelease: false
158
+ version_requirements: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ description: metasploit-aggregator
164
+ email:
165
+ - metasploit-hackers@lists.sourceforge.net
166
+ executables:
167
+ - msfaggregator
168
+ extensions: []
169
+ extra_rdoc_files: []
170
+ files:
171
+ - ".gitignore"
172
+ - ".rspec"
173
+ - ".ruby-version"
174
+ - ".travis.yml"
175
+ - CODE_OF_CONDUCT.md
176
+ - Gemfile
177
+ - LICENSE
178
+ - README.md
179
+ - Rakefile
180
+ - bin/msfaggregator
181
+ - lib/msf/aggregator.rb
182
+ - lib/msf/aggregator/cable.rb
183
+ - lib/msf/aggregator/connection_manager.rb
184
+ - lib/msf/aggregator/forwarder.rb
185
+ - lib/msf/aggregator/http/request.rb
186
+ - lib/msf/aggregator/http/responder.rb
187
+ - lib/msf/aggregator/http/ssl_responder.rb
188
+ - lib/msf/aggregator/http_forwarder.rb
189
+ - lib/msf/aggregator/https_forwarder.rb
190
+ - lib/msf/aggregator/logger.rb
191
+ - lib/msf/aggregator/router.rb
192
+ - lib/msf/aggregator/version.rb
193
+ - metasploit-aggregator.gemspec
194
+ homepage: https://www.msf.com
195
+ licenses:
196
+ - BSD-3-Clause
197
+ metadata: {}
198
+ post_install_message:
199
+ rdoc_options: []
200
+ require_paths:
201
+ - lib
202
+ required_ruby_version: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ required_rubygems_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
212
+ requirements: []
213
+ rubyforge_project:
214
+ rubygems_version: 2.4.8
215
+ signing_key:
216
+ specification_version: 4
217
+ summary: metasploit-aggregator
218
+ test_files: []