metasploit-aggregator 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/bin/metasploit-aggregator +3 -11
- data/lib/metasploit/aggregator.rb +303 -137
- data/lib/metasploit/aggregator/aggregator_pb.rb +13 -0
- data/lib/metasploit/aggregator/aggregator_services_pb.rb +36 -0
- data/lib/metasploit/aggregator/connection_manager.rb +3 -1
- data/lib/metasploit/aggregator/error.rb +9 -0
- data/lib/metasploit/aggregator/http/responder.rb +1 -1
- data/lib/metasploit/aggregator/messages_pb.rb +51 -0
- data/lib/metasploit/aggregator/router.rb +0 -1
- data/lib/metasploit/aggregator/tlv/uuid.rb +232 -232
- data/lib/metasploit/aggregator/version.rb +1 -1
- data/metasploit-aggregator.gemspec +4 -2
- metadata +23 -9
- metadata.gz.sig +0 -0
- data/.gitignore +0 -10
- data/CODE_OF_CONDUCT.md +0 -52
- data/LICENSE +0 -748
- data/README.md +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f132369edfc38617414a3e370e08b300cfe0960d
|
4
|
+
data.tar.gz: e78d5af7c79f7578403a2aff1129b0e9b9ad36c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8155484bd84179dfcadd27ed391c56fb77d911f8d727845119e33b5f1d2d3b66ebcf652c4a15075d64c7da41238c99db164ed54ff3ffdd0e6f00c953eda1923
|
7
|
+
data.tar.gz: be4b963516ce7645ec42e970f70f2c8203c058e392c73ec891b326e5cfe61bfe53b84384f02856b80112e8af27ca3ca03bd107b593e62191f9b5a7f053b12e39
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/bin/metasploit-aggregator
CHANGED
@@ -7,35 +7,27 @@ require 'metasploit/aggregator/logger'
|
|
7
7
|
|
8
8
|
admin_host = '127.0.0.1'
|
9
9
|
admin_port = 2447
|
10
|
-
listener = '127.0.0.1'
|
11
|
-
remote_console = '127.0.0.1'
|
12
10
|
# cert_file = './cert.pem'
|
13
11
|
# cert_string = File.new(cert_file).read
|
14
12
|
cert_string = nil
|
15
13
|
|
16
|
-
|
17
|
-
server = Metasploit::Aggregator::MsgPackServer.new(admin_host, admin_port)
|
18
|
-
server.start
|
14
|
+
server = Metasploit::Aggregator::GrpcServer.new(admin_host, admin_port)
|
19
15
|
Logger.log "Starting administration service on #{admin_host}:#{admin_port}"
|
20
16
|
|
21
17
|
loop do
|
22
18
|
command = $stdin.gets
|
23
19
|
if command.chomp == 'exit'
|
24
20
|
exit
|
25
|
-
elsif command.chomp == 'clear'
|
26
|
-
forwarder.requests = []
|
27
|
-
forwarder.responses = []
|
28
21
|
elsif command.chomp == 'pause'
|
29
22
|
Logger.log "paused"
|
30
|
-
elsif command.chomp == 'start'
|
31
|
-
server.start
|
32
23
|
elsif command.chomp == 'stop'
|
33
24
|
server.stop
|
34
25
|
elsif command.chomp == 'park'
|
35
26
|
client.release_session($stdin.gets.chomp)
|
36
27
|
elsif command.chomp == 'details'
|
37
28
|
client = Metasploit::Aggregator::ServerProxy.new(admin_host, admin_port)
|
38
|
-
client.sessions
|
29
|
+
sessions = client.sessions
|
30
|
+
sessions.each_pair do |payload, console|
|
39
31
|
details = client.session_details(payload)
|
40
32
|
$stdout.puts payload
|
41
33
|
details.each_pair do |key, attr|
|
@@ -1,10 +1,11 @@
|
|
1
1
|
require 'socket'
|
2
2
|
require 'openssl'
|
3
3
|
require 'thread'
|
4
|
-
require 'msgpack'
|
5
|
-
require 'msgpack/rpc'
|
6
4
|
require 'securerandom'
|
7
5
|
|
6
|
+
require 'metasploit/aggregator/error'
|
7
|
+
require 'metasploit/aggregator/messages_pb'
|
8
|
+
require 'metasploit/aggregator/aggregator_services_pb'
|
8
9
|
require 'metasploit/aggregator/version'
|
9
10
|
require 'metasploit/aggregator/cable'
|
10
11
|
require 'metasploit/aggregator/connection_manager'
|
@@ -21,6 +22,11 @@ module Metasploit
|
|
21
22
|
# index for impl
|
22
23
|
end
|
23
24
|
|
25
|
+
# return the current service version found
|
26
|
+
def version
|
27
|
+
Metasploit::Aggregator::VERSION
|
28
|
+
end
|
29
|
+
|
24
30
|
# returns map of sessions available from the service
|
25
31
|
def sessions
|
26
32
|
# index for impl
|
@@ -80,87 +86,91 @@ module Metasploit
|
|
80
86
|
|
81
87
|
class ServerProxy < Service
|
82
88
|
attr_reader :uuid
|
89
|
+
@exit_lock = Mutex.new
|
83
90
|
@host = @port = @socket = nil
|
84
|
-
@
|
91
|
+
@no_params = nil
|
92
|
+
@response_queue = nil
|
93
|
+
@listening_thread = nil
|
94
|
+
@cleanup_list = nil
|
85
95
|
|
86
96
|
def initialize(host, port)
|
87
97
|
@host = host
|
88
98
|
@port = port
|
89
|
-
@client =
|
99
|
+
@client = Metasploit::Aggregator::Pb::Stub.new("#{@host}:#{@port}", :this_channel_is_insecure)
|
100
|
+
# TODO: add arg{ :channel_override => Core::Channel } to control connection
|
90
101
|
@uuid = SecureRandom.uuid
|
102
|
+
@no_params = Metasploit::Aggregator::Message::No_params.new
|
103
|
+
# server_version = pb_to_array(@client.version(@no_params).value)[0]
|
104
|
+
# raise CompatibilityError("server version mis-match found #{server_version}") unless server_version == version
|
91
105
|
end
|
92
106
|
|
93
107
|
def available?
|
94
|
-
@client.
|
95
|
-
rescue MessagePack::RPC::ConnectionTimeoutError => e
|
96
|
-
false
|
108
|
+
@client.available(@no_params).answer
|
97
109
|
end
|
98
110
|
|
99
111
|
def sessions
|
100
|
-
@client.
|
101
|
-
rescue MessagePack::RPC::TimeoutError => e
|
102
|
-
Logger.log(e.to_s)
|
112
|
+
pb_to_map(@client.sessions(@no_params).map)
|
103
113
|
end
|
104
114
|
|
105
115
|
def cables
|
106
|
-
@client.
|
107
|
-
rescue MessagePack::RPC::TimeoutError => e
|
108
|
-
Logger.log(e.to_s)
|
116
|
+
pb_to_array(@client.cables(@no_params).value)
|
109
117
|
end
|
110
118
|
|
111
119
|
|
112
120
|
def obtain_session(payload, uuid)
|
113
|
-
|
114
|
-
|
115
|
-
Logger.log(e.to_s)
|
121
|
+
args = Metasploit::Aggregator::Message::String_array.new( value: [payload, uuid] )
|
122
|
+
@client.obtain_session(args).answer
|
116
123
|
end
|
117
124
|
|
118
125
|
def release_session(payload)
|
119
|
-
|
120
|
-
|
121
|
-
Logger.log(e.to_s)
|
126
|
+
args = Metasploit::Aggregator::Message::String_array.new( value: [payload] )
|
127
|
+
@client.release_session(args).answer
|
122
128
|
end
|
123
129
|
|
124
130
|
def session_details(payload)
|
125
|
-
|
126
|
-
|
127
|
-
Logger.log(e.to_s)
|
131
|
+
args = Metasploit::Aggregator::Message::String_array.new( value: [payload] )
|
132
|
+
pb_to_map(@client.session_details(args).map)
|
128
133
|
end
|
129
134
|
|
130
135
|
def add_cable(type, host, port, certificate = nil)
|
131
|
-
|
132
|
-
|
133
|
-
|
136
|
+
args = nil
|
137
|
+
if certificate.nil?
|
138
|
+
args = Metasploit::Aggregator::Message::Cable_def.new( type: type, host: host, port: port.to_i )
|
139
|
+
else
|
140
|
+
args = Metasploit::Aggregator::Message::Cable_def.new( type: type, host: host, port: port.to_i, pem: certificate )
|
141
|
+
end
|
142
|
+
@client.add_cable(args).answer
|
134
143
|
end
|
135
144
|
|
136
145
|
def remove_cable(host, port)
|
137
|
-
|
138
|
-
|
139
|
-
Logger.log(e.to_s)
|
146
|
+
args = Metasploit::Aggregator::Message::String_array.new( value: [host, port] )
|
147
|
+
@client.remove_cable(args).answer
|
140
148
|
end
|
141
149
|
|
142
150
|
def register_default(uuid, payload_list)
|
143
|
-
|
144
|
-
|
145
|
-
|
151
|
+
uuid = "" if uuid.nil?
|
152
|
+
payloads = []
|
153
|
+
payloads = payload + payload_list unless payload_list.nil?
|
154
|
+
args = Metasploit::Aggregator::Message::Register.new( uuid: uuid, payloads: payloads )
|
155
|
+
@client.register_default(args).answer
|
146
156
|
end
|
147
157
|
|
148
158
|
def default
|
149
|
-
@client.
|
150
|
-
rescue MessagePack::RPC::TimeoutError => e
|
151
|
-
Logger.log(e.to_s)
|
159
|
+
pb_to_array(@client.default(@no_params).value)[0]
|
152
160
|
end
|
153
161
|
|
154
162
|
def available_addresses
|
155
|
-
@client.
|
156
|
-
rescue MessagePack::RPC::TimeoutError => e
|
157
|
-
Logger.log(e.to_s)
|
163
|
+
pb_to_array(@client.available_addresses(@no_params).value)
|
158
164
|
end
|
159
165
|
|
160
|
-
def stop
|
161
|
-
|
162
|
-
|
166
|
+
def stop(force = false)
|
167
|
+
# end the response queue
|
168
|
+
ServerProxy.unregister_for_cleanup(self) unless force
|
169
|
+
@response_queue.push(self) unless @response_queue.nil?
|
170
|
+
|
163
171
|
@listening_thread.join if @listening_thread
|
172
|
+
@listening_thread = nil
|
173
|
+
@client = nil
|
164
174
|
end
|
165
175
|
|
166
176
|
def register_response_channel(requester)
|
@@ -168,44 +178,268 @@ module Metasploit
|
|
168
178
|
raise ArgumentError("response channel class invalid")
|
169
179
|
end
|
170
180
|
@response_io = requester
|
171
|
-
|
181
|
+
process
|
172
182
|
end
|
173
183
|
|
174
|
-
|
184
|
+
protected
|
185
|
+
|
186
|
+
def self.register_for_cleanup(connection)
|
187
|
+
@exit_lock.synchronize do
|
188
|
+
unless @cleanup_list
|
189
|
+
@cleanup_list = ::Set.new
|
190
|
+
at_exit { ServerProxy.run_cleanup }
|
191
|
+
end
|
192
|
+
@cleanup_list.add connection
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def self.unregister_for_cleanup(connection)
|
197
|
+
@exit_lock.synchronize do
|
198
|
+
@cleanup_list.delete connection if @cleanup_list
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def self.run_cleanup
|
203
|
+
@exit_lock.synchronize do
|
204
|
+
if @cleanup_list
|
205
|
+
@cleanup_list.each do |connection|
|
206
|
+
connection.stop(true)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
private
|
213
|
+
|
214
|
+
def pb_to_map(map)
|
215
|
+
result = {}
|
216
|
+
map.each do |key , value|
|
217
|
+
result[key] = value
|
218
|
+
end
|
219
|
+
result
|
220
|
+
end
|
221
|
+
|
222
|
+
def pb_to_array(array)
|
223
|
+
result = []
|
224
|
+
array.each do |value|
|
225
|
+
result << value
|
226
|
+
end
|
227
|
+
result
|
228
|
+
end
|
229
|
+
|
230
|
+
def process
|
231
|
+
@response_queue = EnumeratorQueue.new(self)
|
232
|
+
requests = @client.process(@response_queue.each_item)
|
233
|
+
|
234
|
+
# add initial key response with only local uuid
|
235
|
+
initial_response = Metasploit::Aggregator::Message::Response.new( uuid: @uuid )
|
236
|
+
@response_queue.push(initial_response)
|
237
|
+
|
175
238
|
@listening_thread = Thread.new do
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
239
|
+
requests.each do |pb_request|
|
240
|
+
request = Metasploit::Aggregator::Http::Request.new(pb_to_array(pb_request.headers), pb_request.body, nil)
|
241
|
+
response = @response_io.process_request(request)
|
242
|
+
session_id = Metasploit::Aggregator::Http::Request.parse_uri(request)
|
243
|
+
pb_request = Metasploit::Aggregator::Message::Request.new( headers: response.headers, body: response.body )
|
244
|
+
pb_response = Metasploit::Aggregator::Message::Response.new( uuid: session_id, response: pb_request)
|
245
|
+
@response_queue.push(pb_response)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
ServerProxy.register_for_cleanup self
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
# A EnumeratorQueue wraps a Queue to yield the items added to it.
|
253
|
+
class EnumeratorQueue
|
254
|
+
extend Forwardable
|
255
|
+
def_delegators :@q, :push
|
256
|
+
|
257
|
+
def initialize(sentinel)
|
258
|
+
@q = Queue.new
|
259
|
+
@sentinel = sentinel
|
260
|
+
end
|
261
|
+
|
262
|
+
def each_item
|
263
|
+
return enum_for(:each_item) unless block_given?
|
264
|
+
loop do
|
265
|
+
r = @q.pop
|
266
|
+
break if r.equal?(@sentinel)
|
267
|
+
fail r if r.is_a? Exception
|
268
|
+
yield r
|
269
|
+
end
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
class ServerImpl < Metasploit::Aggregator::Pb::Service
|
274
|
+
|
275
|
+
def initialize
|
276
|
+
super
|
277
|
+
@local_server = Server.new
|
278
|
+
@requestThreads = {}
|
279
|
+
@listeners = []
|
280
|
+
end
|
281
|
+
|
282
|
+
def available(_no_params, _unused_call)
|
283
|
+
Metasploit::Aggregator::Message::Result.new( answer: @local_server.available? )
|
284
|
+
end
|
285
|
+
|
286
|
+
def version(_no_params, _unused_call)
|
287
|
+
Metasploit::Aggregator::Message::String_array.new( value: [ @local_server.version ] )
|
288
|
+
end
|
289
|
+
|
290
|
+
def sessions(_no_parms, _unused_call)
|
291
|
+
Metasploit::Aggregator::Message::Result_map.new( map: @local_server.sessions() )
|
292
|
+
end
|
293
|
+
|
294
|
+
def cables(_no_parms, _unused_call)
|
295
|
+
Metasploit::Aggregator::Message::String_array.new( value: @local_server.cables() )
|
296
|
+
end
|
297
|
+
|
298
|
+
def obtain_session(args, _unused_call)
|
299
|
+
payload, uuid = args.value
|
300
|
+
Metasploit::Aggregator::Message::Result.new( answer: @local_server.obtain_session(payload, uuid) )
|
301
|
+
end
|
302
|
+
|
303
|
+
def release_session(args, _unused_call)
|
304
|
+
payload = args.value.shift
|
305
|
+
Metasploit::Aggregator::Message::Result.new( answer: @local_server.release_session(payload) )
|
306
|
+
end
|
307
|
+
|
308
|
+
def session_details(args, _unused_call)
|
309
|
+
payload = args.value.shift
|
310
|
+
Metasploit::Aggregator::Message::Result_map.new( map: @local_server.session_details(payload) )
|
311
|
+
end
|
312
|
+
|
313
|
+
def add_cable(cable, _unused_call)
|
314
|
+
pem = nil
|
315
|
+
pem = cable.pem unless cable.pem.empty?
|
316
|
+
result = @local_server.add_cable(cable.type, cable.host, cable.port, pem)
|
317
|
+
Metasploit::Aggregator::Message::Result.new( answer: result )
|
318
|
+
end
|
319
|
+
|
320
|
+
def remove_cable(args, _unused_call)
|
321
|
+
host, port = args.value
|
322
|
+
result = @local_server.remove_cable(host, port)
|
323
|
+
Metasploit::Aggregator::Message::Result.new( answer: result )
|
324
|
+
end
|
325
|
+
|
326
|
+
def register_default(register, _unused_call)
|
327
|
+
payloads = nil
|
328
|
+
payloads = register.payloads unless register.payloads.empty?
|
329
|
+
result = @local_server.register_default(register.uuid, payloads)
|
330
|
+
Metasploit::Aggregator::Message::Result.new( answer: result )
|
331
|
+
end
|
332
|
+
|
333
|
+
def default(_no_params, _unused_call)
|
334
|
+
uuid = @local_server.default
|
335
|
+
return Metasploit::Aggregator::Message::String_array.new( value: [ uuid ] ) unless uuid.nil?
|
336
|
+
Metasploit::Aggregator::Message::String_array.new()
|
337
|
+
end
|
338
|
+
|
339
|
+
def available_addresses(_no_params, _unused_call)
|
340
|
+
addresses = @local_server.available_addresses
|
341
|
+
Metasploit::Aggregator::Message::String_array.new( value: addresses )
|
342
|
+
end
|
343
|
+
|
344
|
+
def process(responses)
|
345
|
+
requests = EnumeratorQueue.new(self)
|
346
|
+
uuid = nil
|
347
|
+
|
348
|
+
requestingThread = Thread.new do
|
349
|
+
loop do
|
350
|
+
sleep 0.1 # outer loop only occurs until uuid is set
|
351
|
+
next if uuid.nil?
|
352
|
+
request = @local_server.request(uuid)
|
353
|
+
# TODO: with this in place we can just get the request queue and pop each item to process and forward
|
354
|
+
unless request.nil?
|
355
|
+
body = ""
|
356
|
+
body = request.body unless request.body.nil?
|
357
|
+
pb_request = Metasploit::Aggregator::Message::Request.new( headers: request.headers, body: body )
|
358
|
+
requests.push(pb_request)
|
191
359
|
end
|
192
360
|
end
|
193
|
-
|
361
|
+
end
|
362
|
+
|
363
|
+
Thread.new do
|
364
|
+
responses.each do |response|
|
365
|
+
uuid = response.uuid if uuid.nil?
|
366
|
+
next if response.response.nil?
|
367
|
+
request_pb = response.response
|
368
|
+
request = Metasploit::Aggregator::Http::Request.new(request_pb.headers, request_pb.body, nil)
|
369
|
+
@local_server.respond(response.uuid, request)
|
370
|
+
end
|
371
|
+
requestingThread.exit
|
372
|
+
requestingThread.join
|
373
|
+
requests.push(self)
|
374
|
+
end
|
375
|
+
|
376
|
+
requests.each_item
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
class GrpcServer
|
381
|
+
@exit_lock = Mutex.new
|
382
|
+
|
383
|
+
def initialize(host, port)
|
384
|
+
@host = host
|
385
|
+
@port = port
|
386
|
+
|
387
|
+
# TODO: investigate using Core::Channel to secure this communication
|
388
|
+
# server = TCPServer.new(@host, @port)
|
389
|
+
# sslContext = OpenSSL::SSL::SSLContext.new
|
390
|
+
# sslContext.key, sslContext.cert = Metasploit::Aggregator::ConnectionManager.ssl_generate_certificate
|
391
|
+
# sslServer = OpenSSL::SSL::SSLServer.new(server, sslContext)
|
392
|
+
|
393
|
+
@svr = GRPC::RpcServer.new
|
394
|
+
@svr.add_http2_port("#{@host}:#{@port}", :this_port_is_insecure)
|
395
|
+
@svr.handle(ServerImpl)
|
396
|
+
|
397
|
+
@exec = Thread.new do
|
398
|
+
GrpcServer.register_for_cleanup(self)
|
399
|
+
@svr.run_till_terminated
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
def stop(force = false)
|
404
|
+
GrpcServer.unregister_for_cleanup(self) unless force
|
405
|
+
@svr.stop if @svr.running?
|
406
|
+
end
|
407
|
+
|
408
|
+
protected
|
409
|
+
|
410
|
+
def self.register_for_cleanup(connection)
|
411
|
+
@exit_lock.synchronize do
|
412
|
+
unless @cleanup_list
|
413
|
+
@cleanup_list = ::Set.new
|
414
|
+
at_exit { GrpcServer.run_cleanup }
|
415
|
+
end
|
416
|
+
@cleanup_list.add connection
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
def self.unregister_for_cleanup(connection)
|
421
|
+
@exit_lock.synchronize do
|
422
|
+
@cleanup_list.delete connection if @cleanup_list
|
194
423
|
end
|
195
424
|
end
|
196
|
-
|
425
|
+
|
426
|
+
def self.run_cleanup
|
427
|
+
@exit_lock.synchronize do
|
428
|
+
if @cleanup_list
|
429
|
+
@cleanup_list.each do |connection|
|
430
|
+
connection.stop(true)
|
431
|
+
end
|
432
|
+
end
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
end
|
197
437
|
|
198
438
|
class Server < Service
|
199
|
-
# include Metasploit::Aggregator::ConnectionManager
|
200
439
|
|
201
440
|
def initialize
|
202
|
-
@manager = nil
|
203
441
|
@router = Router.instance
|
204
|
-
|
205
|
-
|
206
|
-
def start
|
207
|
-
@manager = Metasploit::Aggregator::ConnectionManager.new
|
208
|
-
true
|
442
|
+
@manager = ConnectionManager.instance
|
209
443
|
end
|
210
444
|
|
211
445
|
def available?
|
@@ -266,7 +500,7 @@ module Metasploit
|
|
266
500
|
end
|
267
501
|
|
268
502
|
def default
|
269
|
-
|
503
|
+
_send, _recv, console = @router.get_forward('default')
|
270
504
|
console
|
271
505
|
end
|
272
506
|
|
@@ -289,8 +523,7 @@ module Metasploit
|
|
289
523
|
|
290
524
|
def request(uuid)
|
291
525
|
# return requests here
|
292
|
-
|
293
|
-
send, recv = @router.reverse_route(uuid)
|
526
|
+
send, _recv = @router.reverse_route(uuid)
|
294
527
|
if send.length > 0
|
295
528
|
result = send.pop
|
296
529
|
end
|
@@ -298,7 +531,7 @@ module Metasploit
|
|
298
531
|
end
|
299
532
|
|
300
533
|
def respond(uuid, data)
|
301
|
-
|
534
|
+
_send, recv = @router.get_forward(uuid)
|
302
535
|
recv << data unless recv.nil?
|
303
536
|
true
|
304
537
|
end
|
@@ -310,72 +543,5 @@ module Metasploit
|
|
310
543
|
response
|
311
544
|
end
|
312
545
|
end # class Server
|
313
|
-
|
314
|
-
# wrapping class required to avoid MsgPack specific needs to parallel request processing.
|
315
|
-
class AsyncMsgPackServer < Server
|
316
|
-
|
317
|
-
def initialize
|
318
|
-
super
|
319
|
-
end
|
320
|
-
|
321
|
-
# MsgPack specific wrapper for listener due to lack of parallel processing
|
322
|
-
def request(uuid)
|
323
|
-
result = super(uuid)
|
324
|
-
sendMsg = nil
|
325
|
-
if result
|
326
|
-
begin
|
327
|
-
sendMsg = result.to_msgpack
|
328
|
-
rescue Exception => e
|
329
|
-
Logger.log e.backtrace
|
330
|
-
# when an error occurs here we should likely respond with an error of some sort to remove block on response
|
331
|
-
end
|
332
|
-
end
|
333
|
-
sendMsg
|
334
|
-
end
|
335
|
-
|
336
|
-
# MsgPack specific wrapper for listener due to lack of parallel processing
|
337
|
-
def respond(uuid, data)
|
338
|
-
begin
|
339
|
-
result = super(uuid, Metasploit::Aggregator::Http::Request.from_msgpack(data))
|
340
|
-
result
|
341
|
-
rescue Exception => e
|
342
|
-
Logger.log e.backtrace
|
343
|
-
end
|
344
|
-
end
|
345
|
-
end # AsyncMsgPackServer
|
346
|
-
|
347
|
-
class MsgPackServer
|
348
|
-
|
349
|
-
def initialize(host, port)
|
350
|
-
@host = host
|
351
|
-
@port = port
|
352
|
-
|
353
|
-
# server = TCPServer.new(@host, @port)
|
354
|
-
# sslContext = OpenSSL::SSL::SSLContext.new
|
355
|
-
# sslContext.key, sslContext.cert = Metasploit::Aggregator::ConnectionManager.ssl_generate_certificate
|
356
|
-
# sslServer = OpenSSL::SSL::SSLServer.new(server, sslContext)
|
357
|
-
#
|
358
|
-
@svr = MessagePack::RPC::Server.new # need to initialize this as ssl server
|
359
|
-
# @svr.listen(sslServer, Server.new)
|
360
|
-
@svr.listen(@host, @port, AsyncMsgPackServer.new)
|
361
|
-
|
362
|
-
Thread.new { @svr.run }
|
363
|
-
end
|
364
|
-
|
365
|
-
def start
|
366
|
-
c = MessagePack::RPC::Client.new(@host,@port)
|
367
|
-
c.call(:start)
|
368
|
-
c.close
|
369
|
-
rescue MessagePack::RPC::TimeoutError => e
|
370
|
-
Logger.log(e.to_s)
|
371
|
-
end
|
372
|
-
|
373
|
-
def stop
|
374
|
-
c = MessagePack::RPC::Client.new(@host,@port)
|
375
|
-
c.call(:stop)
|
376
|
-
c.close
|
377
|
-
@svr.close
|
378
|
-
end
|
379
|
-
end
|
380
546
|
end
|
381
547
|
end
|