rex-socket 0.1.19 → 0.1.24
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +3 -0
- data/.travis.yml +1 -1
- data/lib/rex/socket.rb +8 -3
- data/lib/rex/socket/parameters.rb +81 -52
- data/lib/rex/socket/ssl.rb +14 -12
- data/lib/rex/socket/tcp_server.rb +5 -0
- data/lib/rex/socket/version.rb +1 -1
- data/lib/rex/socket/x509_certificate.rb +3 -1
- metadata +89 -4
- metadata.gz.sig +1 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a3ef67ae8bd23b0e0b85c459748cec22f99bd99d296d0388c8831d2f45a49b3
|
4
|
+
data.tar.gz: 88175f6a22f757299c3f0f4e4689555ccfbf34d79c1eb9b722e1caa505849ea6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 158ed62e8cadbbf95175372bd3e44289e3d2bc1c0cbcc6e80c5803ece3e7f7186ba13cf5f40b2233dbafaf82fb056e4975bc28edebdf446b4ab7147c343dc9de
|
7
|
+
data.tar.gz: 9a069f248fb298505dedb93426b064a2c157989f73c649efc92948269679c4d527e0b5909662042229a46e96106a83eb3dd4d602a1879f6beeacaeed6afac88e
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
data/.travis.yml
CHANGED
data/lib/rex/socket.rb
CHANGED
@@ -732,14 +732,19 @@ module Socket
|
|
732
732
|
end
|
733
733
|
|
734
734
|
#
|
735
|
-
# Wrapper around getsockname
|
735
|
+
# Wrapper around getsockname that stores the local address and local port values.
|
736
736
|
#
|
737
737
|
def getlocalname
|
738
|
-
|
738
|
+
if self.localhost.nil? && self.localport.nil?
|
739
|
+
_, self.localhost, self.localport = getsockname
|
740
|
+
end
|
741
|
+
|
742
|
+
family = Socket.is_ipv4?(self.localhost) ? ::Socket::AF_INET : ::Socket::AF_INET6
|
743
|
+
[family, self.localhost, self.localport]
|
739
744
|
end
|
740
745
|
|
741
746
|
#
|
742
|
-
#
|
747
|
+
# Returns peer connection information as an array.
|
743
748
|
#
|
744
749
|
def getpeername_as_array
|
745
750
|
peer_name = nil
|
@@ -77,45 +77,33 @@ class Rex::Socket::Parameters
|
|
77
77
|
# retried.
|
78
78
|
# @option hash [Fixnum] 'Timeout' The number of seconds before a connection
|
79
79
|
# should time out
|
80
|
-
def initialize(hash)
|
80
|
+
def initialize(hash = {})
|
81
81
|
if (hash['PeerHost'])
|
82
82
|
self.peerhost = hash['PeerHost']
|
83
83
|
elsif (hash['PeerAddr'])
|
84
84
|
self.peerhost = hash['PeerAddr']
|
85
|
-
else
|
86
|
-
self.peerhost = nil
|
87
85
|
end
|
88
86
|
|
89
87
|
if (hash['LocalHost'])
|
90
88
|
self.localhost = hash['LocalHost']
|
91
89
|
elsif (hash['LocalAddr'])
|
92
90
|
self.localhost = hash['LocalAddr']
|
93
|
-
else
|
94
|
-
self.localhost = '0.0.0.0'
|
95
91
|
end
|
96
92
|
|
97
93
|
if (hash['PeerPort'])
|
98
94
|
self.peerport = hash['PeerPort'].to_i
|
99
|
-
else
|
100
|
-
self.peerport = 0
|
101
95
|
end
|
102
96
|
|
103
97
|
if (hash['LocalPort'])
|
104
98
|
self.localport = hash['LocalPort'].to_i
|
105
|
-
else
|
106
|
-
self.localport = 0
|
107
99
|
end
|
108
100
|
|
109
101
|
if (hash['Bare'])
|
110
102
|
self.bare = hash['Bare']
|
111
|
-
else
|
112
|
-
self.bare = false
|
113
103
|
end
|
114
104
|
|
115
105
|
if (hash['SSL'] and hash['SSL'].to_s =~ /^(t|y|1)/i)
|
116
106
|
self.ssl = true
|
117
|
-
else
|
118
|
-
self.ssl = false
|
119
107
|
end
|
120
108
|
|
121
109
|
if hash['SSLContext']
|
@@ -179,33 +167,16 @@ class Rex::Socket::Parameters
|
|
179
167
|
# The protocol this socket will be using
|
180
168
|
if (hash['Proto'])
|
181
169
|
self.proto = hash['Proto'].downcase
|
182
|
-
else
|
183
|
-
self.proto = 'tcp'
|
184
170
|
end
|
185
171
|
|
186
172
|
# Whether or not the socket should be a server
|
187
|
-
self.server = hash['Server']
|
173
|
+
self.server = hash['Server']
|
188
174
|
|
189
175
|
# The communication subsystem to use to create the socket
|
190
176
|
self.comm = hash['Comm']
|
191
177
|
|
192
178
|
# The context that was passed in, if any.
|
193
|
-
self.context = hash['Context']
|
194
|
-
|
195
|
-
# If no comm was supplied, try to use the comm that is best fit to
|
196
|
-
# handle the provided host based on the current routing table.
|
197
|
-
if( self.server )
|
198
|
-
if (self.comm == nil and self.localhost)
|
199
|
-
self.comm = Rex::Socket::SwitchBoard.best_comm(self.localhost)
|
200
|
-
end
|
201
|
-
else
|
202
|
-
if (self.comm == nil and self.peerhost)
|
203
|
-
self.comm = Rex::Socket::SwitchBoard.best_comm(self.peerhost)
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
# If we still haven't found a comm, we default to the local comm.
|
208
|
-
self.comm = Rex::Socket::Comm::Local if (self.comm == nil)
|
179
|
+
self.context = hash['Context']
|
209
180
|
|
210
181
|
# If we are a UDP server, turn off the server flag as it was only set when
|
211
182
|
# creating the UDP socket in order to avail of the switch board above.
|
@@ -216,19 +187,29 @@ class Rex::Socket::Parameters
|
|
216
187
|
# The number of connection retries to make (client only)
|
217
188
|
if hash['Retries']
|
218
189
|
self.retries = hash['Retries'].to_i
|
219
|
-
else
|
220
|
-
self.retries = 0
|
221
190
|
end
|
222
191
|
|
223
192
|
# The number of seconds before a connect attempt times out (client only)
|
224
193
|
if hash['Timeout']
|
225
194
|
self.timeout = hash['Timeout'].to_i
|
226
|
-
else
|
227
|
-
self.timeout = 5
|
228
195
|
end
|
229
196
|
|
230
197
|
# Whether to force IPv6 addressing
|
231
|
-
self.v6 = hash['IPv6']
|
198
|
+
self.v6 = hash['IPv6']
|
199
|
+
end
|
200
|
+
|
201
|
+
def merge(other)
|
202
|
+
self.dup.merge!(other)
|
203
|
+
end
|
204
|
+
|
205
|
+
def merge!(other)
|
206
|
+
other = self.class.new(other) if other.is_a? Hash
|
207
|
+
|
208
|
+
other.instance_variables.each do |name|
|
209
|
+
value = other.instance_variable_get(name)
|
210
|
+
instance_variable_set(name, value) unless value.nil?
|
211
|
+
end
|
212
|
+
self
|
232
213
|
end
|
233
214
|
|
234
215
|
##
|
@@ -294,7 +275,6 @@ class Rex::Socket::Parameters
|
|
294
275
|
return v6
|
295
276
|
end
|
296
277
|
|
297
|
-
|
298
278
|
##
|
299
279
|
#
|
300
280
|
# Attributes
|
@@ -308,50 +288,94 @@ class Rex::Socket::Parameters
|
|
308
288
|
|
309
289
|
# The remote port. Equivalent to the PeerPort parameter hash key.
|
310
290
|
# @return [Fixnum]
|
311
|
-
|
291
|
+
attr_writer :peerport
|
292
|
+
def peerport
|
293
|
+
@peerport || 0
|
294
|
+
end
|
312
295
|
|
313
296
|
# The local host. Equivalent to the LocalHost parameter hash key.
|
314
297
|
# @return [String]
|
315
|
-
|
298
|
+
attr_writer :localhost
|
299
|
+
def localhost
|
300
|
+
@localhost || '0.0.0.0'
|
301
|
+
end
|
316
302
|
|
317
303
|
# The local port. Equivalent to the LocalPort parameter hash key.
|
318
304
|
# @return [Fixnum]
|
319
|
-
|
305
|
+
attr_writer :localport
|
306
|
+
def localport
|
307
|
+
@localport || 0
|
308
|
+
end
|
320
309
|
|
321
310
|
# The protocol to to use, such as TCP. Equivalent to the Proto parameter
|
322
311
|
# hash key.
|
323
312
|
# @return [String]
|
324
|
-
|
313
|
+
attr_writer :proto
|
314
|
+
def proto
|
315
|
+
@proto || 'tcp'
|
316
|
+
end
|
325
317
|
|
326
318
|
# Whether or not this is a server. Equivalent to the Server parameter
|
327
319
|
# hash key.
|
328
320
|
# @return [Bool]
|
329
|
-
|
321
|
+
attr_writer :server
|
322
|
+
def server
|
323
|
+
@server || false
|
324
|
+
end
|
330
325
|
|
331
326
|
# The {Comm} instance that should be used to create the underlying socket.
|
332
327
|
# @return [Comm]
|
333
|
-
|
328
|
+
attr_writer :comm
|
329
|
+
def comm
|
330
|
+
return @comm unless @comm.nil?
|
331
|
+
|
332
|
+
best_comm = nil
|
333
|
+
# If no comm was explicitly specified, try to use the comm that is best fit
|
334
|
+
# to handle the provided host based on the current routing table.
|
335
|
+
if server and localhost
|
336
|
+
best_comm = Rex::Socket::SwitchBoard.best_comm(localhost)
|
337
|
+
elsif peerhost
|
338
|
+
best_comm = Rex::Socket::SwitchBoard.best_comm(peerhost)
|
339
|
+
end
|
340
|
+
|
341
|
+
best_comm || Rex::Socket::Comm::Local
|
342
|
+
end
|
334
343
|
|
335
344
|
# The context hash that was passed in to the structure. (default: {})
|
336
345
|
# @return [Hash]
|
337
|
-
|
346
|
+
attr_writer :context
|
347
|
+
def context
|
348
|
+
@context || {}
|
349
|
+
end
|
338
350
|
|
339
351
|
# The number of attempts that should be made.
|
340
352
|
# @return [Fixnum]
|
341
|
-
|
353
|
+
attr_writer :retries
|
354
|
+
def retries
|
355
|
+
@retries || 0
|
356
|
+
end
|
342
357
|
|
343
358
|
# The number of seconds before a connection attempt should time out.
|
344
359
|
# @return [Fixnum]
|
345
|
-
|
360
|
+
attr_writer :timeout
|
361
|
+
def timeout
|
362
|
+
@timeout || 5
|
363
|
+
end
|
346
364
|
|
347
365
|
# Whether or not this is a bare (non-extended) socket instance that should
|
348
366
|
# be created.
|
349
367
|
# @return [Bool]
|
350
|
-
|
368
|
+
attr_writer :bare
|
369
|
+
def bare
|
370
|
+
@comm || false
|
371
|
+
end
|
351
372
|
|
352
373
|
# Whether or not SSL should be used to wrap the connection.
|
353
374
|
# @return [Bool]
|
354
|
-
|
375
|
+
attr_writer :ssl
|
376
|
+
def ssl
|
377
|
+
@ssl || false
|
378
|
+
end
|
355
379
|
|
356
380
|
# Pre configured SSL Context to use
|
357
381
|
# @return [OpenSSL::SSL::SSLContext]
|
@@ -384,21 +408,26 @@ class Rex::Socket::Parameters
|
|
384
408
|
# The client SSL certificate
|
385
409
|
#
|
386
410
|
attr_accessor :ssl_client_cert
|
411
|
+
|
387
412
|
#
|
388
413
|
# The client SSL key
|
389
414
|
#
|
390
415
|
attr_accessor :ssl_client_key
|
416
|
+
|
391
417
|
#
|
392
418
|
# SSL certificate verification mode for SSL context
|
393
419
|
attr_accessor :ssl_verify_mode
|
420
|
+
|
394
421
|
#
|
395
422
|
# Whether we should use IPv6
|
396
423
|
# @return [Bool]
|
397
|
-
|
398
|
-
|
424
|
+
attr_writer :v6
|
425
|
+
def v6
|
426
|
+
@v6 || false
|
427
|
+
end
|
399
428
|
|
400
429
|
# List of proxies to use
|
401
|
-
# @return [
|
430
|
+
# @return [Array]
|
402
431
|
attr_accessor :proxies
|
403
432
|
|
404
433
|
alias peeraddr peerhost
|
data/lib/rex/socket/ssl.rb
CHANGED
@@ -13,10 +13,12 @@ module Rex::Socket::Ssl
|
|
13
13
|
|
14
14
|
module CertProvider
|
15
15
|
|
16
|
-
def self.ssl_generate_subject(cn
|
17
|
-
st
|
18
|
-
loc
|
19
|
-
|
16
|
+
def self.ssl_generate_subject(cn: nil, org: nil, loc: nil, st: nil)
|
17
|
+
st ||= Rex::Text.rand_state
|
18
|
+
loc ||= Rex::Text.rand_name.capitalize
|
19
|
+
org ||= Rex::Text.rand_name.capitalize
|
20
|
+
cn ||= Rex::Text.rand_hostname
|
21
|
+
"/C=US/ST=#{st}/L=#{loc}/O=#{org}/CN=#{cn}"
|
20
22
|
end
|
21
23
|
|
22
24
|
def self.ssl_generate_issuer
|
@@ -30,11 +32,11 @@ module Rex::Socket::Ssl
|
|
30
32
|
# certificate. This matches a typical "snakeoil" cert.
|
31
33
|
#
|
32
34
|
# @return [String, String, Array]
|
33
|
-
def self.ssl_generate_certificate(
|
35
|
+
def self.ssl_generate_certificate(cert_vars: {}, **opts)
|
34
36
|
yr = 24*3600*365
|
35
37
|
vf = Time.at(Time.now.to_i - rand(yr * 3) - yr)
|
36
|
-
vt = Time.at(vf.to_i + (rand(9)
|
37
|
-
subject = ssl_generate_subject(
|
38
|
+
vt = Time.at(vf.to_i + (rand(4..9) * yr))
|
39
|
+
subject = ssl_generate_subject(**cert_vars)
|
38
40
|
issuer = ssl_generate_issuer
|
39
41
|
key = OpenSSL::PKey::RSA.new(2048){ }
|
40
42
|
cert = OpenSSL::X509::Certificate.new
|
@@ -88,8 +90,8 @@ module Rex::Socket::Ssl
|
|
88
90
|
@@cert_provider.ssl_generate_issuer
|
89
91
|
end
|
90
92
|
|
91
|
-
def self.ssl_generate_certificate(
|
92
|
-
@@cert_provider.ssl_generate_certificate(
|
93
|
+
def self.ssl_generate_certificate(**opts)
|
94
|
+
@@cert_provider.ssl_generate_certificate(**opts)
|
93
95
|
end
|
94
96
|
|
95
97
|
#
|
@@ -102,8 +104,8 @@ module Rex::Socket::Ssl
|
|
102
104
|
#
|
103
105
|
# Shim for the ssl_generate_certificate module method
|
104
106
|
#
|
105
|
-
def ssl_generate_certificate(
|
106
|
-
Rex::Socket::Ssl.ssl_generate_certificate(
|
107
|
+
def ssl_generate_certificate(**opts)
|
108
|
+
Rex::Socket::Ssl.ssl_generate_certificate(**opts)
|
107
109
|
end
|
108
110
|
|
109
111
|
#
|
@@ -117,7 +119,7 @@ module Rex::Socket::Ssl
|
|
117
119
|
if params.ssl_cert
|
118
120
|
key, cert, chain = ssl_parse_pem(params.ssl_cert)
|
119
121
|
else
|
120
|
-
key, cert, chain = ssl_generate_certificate(params.ssl_cn)
|
122
|
+
key, cert, chain = ssl_generate_certificate(cert_vars: {cn: params.ssl_cn})
|
121
123
|
end
|
122
124
|
|
123
125
|
ctx = OpenSSL::SSL::SSLContext.new()
|
data/lib/rex/socket/version.rb
CHANGED
@@ -28,7 +28,9 @@ class X509Certificate
|
|
28
28
|
|
29
29
|
certs = []
|
30
30
|
ssl_cert.scan(/-----BEGIN\s*[^\-]+-----+\r?\n[^\-]*-----END\s*[^\-]+-----\r?\n?/nm).each do |pem|
|
31
|
-
if pem =~ /PRIVATE KEY/
|
31
|
+
if pem =~ /EC PRIVATE KEY/
|
32
|
+
key = OpenSSL::PKey::EC.new(pem)
|
33
|
+
elsif pem =~ /PRIVATE KEY/
|
32
34
|
key = OpenSSL::PKey::RSA.new(pem)
|
33
35
|
elsif pem =~ /CERTIFICATE/
|
34
36
|
certs << OpenSSL::X509::Certificate.new(pem)
|
metadata
CHANGED
@@ -1,14 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rex-socket
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Maloney
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
|
-
cert_chain:
|
11
|
-
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
|
14
|
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
15
|
+
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
|
16
|
+
b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
|
17
|
+
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
|
18
|
+
cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
|
19
|
+
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
|
20
|
+
JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
|
21
|
+
mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
|
22
|
+
wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
|
23
|
+
VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
|
24
|
+
AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
|
25
|
+
AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
|
26
|
+
BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
|
27
|
+
pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
|
28
|
+
dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
|
29
|
+
fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
|
30
|
+
NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
|
31
|
+
H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
|
32
|
+
+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
|
33
|
+
-----END CERTIFICATE-----
|
34
|
+
- |
|
35
|
+
-----BEGIN CERTIFICATE-----
|
36
|
+
MIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1U0O1b5VQCDANBgkqhkiG9w0BAQsFADBl
|
37
|
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
38
|
+
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
|
39
|
+
b3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcNMjgxMDIyMTIwMDAwWjByMQswCQYDVQQG
|
40
|
+
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
|
41
|
+
cnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBT
|
42
|
+
aWduaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+NOzHH8O
|
43
|
+
Ea9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid2zLXcep2nQUut4/6kkPApfmJ1DcZ17aq
|
44
|
+
8JyGpdglrA55KDp+6dFn08b7KSfH03sjlOSRI5aQd4L5oYQjZhJUM1B0sSgmuyRp
|
45
|
+
wsJS8hRniolF1C2ho+mILCCVrhxKhwjfDPXiTWAYvqrEsq5wMWYzcT6scKKrzn/p
|
46
|
+
fMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzLfnQ5Ng2Q7+S1TqSp6moKq4TzrGdOtcT3
|
47
|
+
jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR93O8vYWxYoNzQYIH5DiLanMg0A9kczye
|
48
|
+
n6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNV
|
49
|
+
HQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMweQYIKwYBBQUHAQEEbTBr
|
50
|
+
MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUH
|
51
|
+
MAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ
|
52
|
+
RFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2lj
|
53
|
+
ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6
|
54
|
+
Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmww
|
55
|
+
TwYDVR0gBEgwRjA4BgpghkgBhv1sAAIEMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
|
56
|
+
d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYIYIZIAYb9bAMwHQYDVR0OBBYEFFrEuXsq
|
57
|
+
CqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgP
|
58
|
+
MA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1aJLPzItEVyCx8JSl2qB1dHC06GsTvMGHX
|
59
|
+
fgtg/cM9D8Svi/3vKt8gVTew4fbRknUPUbRupY5a4l4kgU4QpO4/cY5jDhNLrddf
|
60
|
+
RHnzNhQGivecRk5c/5CxGwcOkRX7uq+1UcKNJK4kxscnKqEpKBo6cSgCPC6Ro8Al
|
61
|
+
EeKcFEehemhor5unXCBc2XGxDI+7qPjFEmifz0DLQESlE/DmZAwlCEIysjaKJAL+
|
62
|
+
L3J+HNdJRZboWR3p+nRka7LrZkPas7CM1ekN3fYBIM6ZMWM9CBoYs4GbT8aTEAb8
|
63
|
+
B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhsRDKyZqHnGKSaZFHv
|
64
|
+
-----END CERTIFICATE-----
|
65
|
+
- |
|
66
|
+
-----BEGIN CERTIFICATE-----
|
67
|
+
MIIFIzCCBAugAwIBAgIQDX9ZkVJ2eNVTlibR5ALyJTANBgkqhkiG9w0BAQsFADBy
|
68
|
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
69
|
+
d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQg
|
70
|
+
SUQgQ29kZSBTaWduaW5nIENBMB4XDTE5MTAxNjAwMDAwMFoXDTIwMTAxOTEyMDAw
|
71
|
+
MFowYDELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxDzANBgNV
|
72
|
+
BAcTBkJvc3RvbjETMBEGA1UEChMKUmFwaWQ3IExMQzETMBEGA1UEAxMKUmFwaWQ3
|
73
|
+
IExMQzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANHnKegPAghKuZk4
|
74
|
+
Gy1jKaZEXbWc4fxioTemv/F1yIYzAjCWP65qjKtyeeFDe4/kJzG9nseF9oa93YBf
|
75
|
+
1nyEqxNSZMw/sCAZ87lOl713dRi73uxOoszy2PT5xEB+Q5R6cbzExkWG2zrLdXDr
|
76
|
+
so0Bd6VHw+IsAoBBkAq5FrZOJQYGn5VY20xw/2DqtCeoW4QDWyqTnbJmwO9tZrfr
|
77
|
+
3Le2crfk2eOgafaPNhLon5uuIKCZsk2YkUSNURSS3M7gosMwU9Gg4JTBi7X5+oww
|
78
|
+
rY43dJT28YklxmNVu8o5kJxW4dqLKJLOIgSXZ63nceT/EaCSg7DcofHNcUzejFwb
|
79
|
+
M7Zbb2kCAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaAFFrEuXsqCqOl6nEDwGD5LfZl
|
80
|
+
dQ5YMB0GA1UdDgQWBBR18CAeMsIEU+0pXal/XXw9LCtMADAOBgNVHQ8BAf8EBAMC
|
81
|
+
B4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0fBHAwbjA1oDOgMYYvaHR0cDov
|
82
|
+
L2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1jcy1nMS5jcmwwNaAzoDGG
|
83
|
+
L2h0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtY3MtZzEuY3Js
|
84
|
+
MEwGA1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
|
85
|
+
d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQBMIGEBggrBgEFBQcBAQR4MHYw
|
86
|
+
JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBOBggrBgEFBQcw
|
87
|
+
AoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3Vy
|
88
|
+
ZWRJRENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEL
|
89
|
+
BQADggEBAFpzR9s7lcYKDzSJucOHztEPj+iSIeCzxEw34NTE9M2AfkYIu82c4r2a
|
90
|
+
bzIGmzZWiCGufjOp0gF5xW6sSSJ9n0TqH0nhHhvjtZQkmkGtOBbN1zeYDFS2ozAp
|
91
|
+
sljF/g68Y1eYs3NaFf7kQUa6vb6RdjW3J8M9AQ8gthBt7gr/guVxd/gJUYbdDdBX
|
92
|
+
cWfJJi/X7GVBOBmmvA43qoKideuhOBrVGBHvIF/yO9p23dIiUrGmW9kxXCSxgute
|
93
|
+
JI/W23RbIRksG2pioMhd4dCXq3FLLlkOV1YfCwWixNB+iIhQPPZVaPNfgPhCn4Dt
|
94
|
+
DeGjje/qA4fkLtRmOtb9PUBq3ToRDE4=
|
95
|
+
-----END CERTIFICATE-----
|
96
|
+
date: 2020-09-22 00:00:00.000000000 Z
|
12
97
|
dependencies:
|
13
98
|
- !ruby/object:Gem::Dependency
|
14
99
|
name: bundler
|
@@ -123,7 +208,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
208
|
version: '0'
|
124
209
|
requirements: []
|
125
210
|
rubyforge_project:
|
126
|
-
rubygems_version: 2.7.
|
211
|
+
rubygems_version: 2.7.10
|
127
212
|
signing_key:
|
128
213
|
specification_version: 4
|
129
214
|
summary: The Ruby Exploitation (Rex) Socket Abstraction Library.
|
metadata.gz.sig
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
nECza��??��°p
|