metasploit-aggregator 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: []