nexpose 0.0.94 → 0.0.95

Sign up to get free protection for your applications and to get access to all the features.
data/lib/nexpose.rb CHANGED
@@ -95,7 +95,7 @@ module Nexpose
95
95
  def self.getAttribute(attribute, xml)
96
96
  value = ''
97
97
  #@value = substr(substr(strstr(strstr(@xml,@attribute),'"'),1),0,strpos(substr(strstr(strstr(@xml,@attribute),'"'),1),'"'))
98
- yvalue
98
+ value
99
99
  end
100
100
 
101
101
  # === Description
@@ -126,4 +126,4 @@ module Nexpose
126
126
  end
127
127
  end
128
128
 
129
- end
129
+ end
data/lib/nexpose/creds.rb CHANGED
@@ -1,189 +1,279 @@
1
1
  module Nexpose
2
- include Sanitize
3
-
4
- # === Description
5
- # Object that represents administrative credentials to be used during a scan. When retrived from an existing site configuration the credentials will be returned as a security blob and can only be passed back as is during a Site Save operation. This object can only be used to create a new set of credentials.
6
- #
7
- class AdminCredentials
8
- # Security blob for an existing set of credentials
9
- attr_reader :securityblob
10
- # Designates if this object contains user defined credentials or a security blob
11
- attr_reader :isblob
12
- # The service for these credentials. Can be All.
13
- attr_reader :service
14
- # The host for these credentials. Can be Any.
15
- attr_reader :host
16
- # The port on which to use these credentials.
17
- attr_reader :port
18
- # The user id or username
19
- attr_reader :userid
20
- # The password
21
- attr_reader :password
22
- # The realm for these credentials
23
- attr_reader :realm
24
- # When using httpheaders, this represents the set of headers to pass
25
- # with the authentication request.
26
- attr_reader :headers
27
-
28
- def initialize(isblob = false)
29
- @isblob = isblob
30
- end
2
+ # === Description
3
+ # Object that represents administrative credentials to be used
4
+ # during a scan. When retrived from an existing site configuration
5
+ # the credentials will be returned as a security blob and can only
6
+ # be passed back as is during a Site Save operation. This object
7
+ # can only be used to create a new set of credentials.
8
+ #
9
+ class AdminCredentials
10
+ include XMLUtils
31
11
 
32
- # Sets the credentials information for this object.
33
- def setCredentials(service, host, port, userid, password, realm)
34
- @isblob = false
35
- @securityblob = nil
36
- @service = service
37
- @host = host
38
- @port = port
39
- @userid = userid
40
- @password = password
41
- @realm = realm
42
- end
12
+ # Security blob for an existing set of credentials
13
+ attr_reader :securityblob
14
+ # Designates if this object contains user defined credentials or a security blob
15
+ attr_reader :isblob
16
+ # The service for these credentials. Can be All.
17
+ attr_reader :service
18
+ # The host for these credentials. Can be Any.
19
+ attr_reader :host
20
+ # The port on which to use these credentials.
21
+ attr_reader :port
22
+ # The user id or username
23
+ attr_reader :userid
24
+ # The password
25
+ attr_reader :password
26
+ # The realm for these credentials
27
+ attr_reader :realm
28
+ # When using httpheaders, this represents the set of headers to pass
29
+ # with the authentication request.
30
+ attr_reader :headers
31
+ # When using htmlforms, this represents the tho form to pass the
32
+ # authentication request to.
33
+ attr_reader :html_forms
43
34
 
44
- # TODO: add description
45
- def setService(service)
46
- @service = service
47
- end
35
+ def initialize(isblob = false)
36
+ @isblob = isblob
37
+ end
48
38
 
49
- def setHost(host)
50
- @host = host
51
- end
39
+ # Sets the credentials information for this object.
40
+ def set_credentials(service, host, port, userid, password, realm)
41
+ @isblob = false
42
+ @securityblob = nil
43
+ @service = service
44
+ @host = host
45
+ @port = port
46
+ @userid = userid
47
+ @password = password
48
+ @realm = realm
49
+ end
52
50
 
53
- # TODO: add description
54
- def setBlob(securityblob)
55
- @isblob = true
56
- @securityblob = securityblob
57
- end
51
+ # TODO: add description
52
+ def set_service(service)
53
+ @service = service
54
+ end
58
55
 
59
- # Add Headers to credentials for httpheaders.
60
- def setHeaders(headers)
61
- @headers = headers
62
- end
56
+ def set_host(host)
57
+ @host = host
58
+ end
63
59
 
64
- def to_xml
65
- xml = ''
66
- xml << '<adminCredentials'
67
- xml << %Q{ service="#{replace_entities(service)}"} if (service)
68
- xml << %Q{ userid="#{replace_entities(userid)}"} if (userid)
69
- xml << %Q{ password="#{replace_entities(password)}"} if (password)
70
- xml << %Q{ realm="#{replace_entities(realm)}"} if (realm)
71
- xml << %Q{ host="#{replace_entities(host)}"} if (host)
72
- xml << %Q{ port="#{replace_entities(port)}"} if (port)
73
- xml << '>'
74
- xml << replace_entities(securityblob) if (isblob)
75
- xml << @headers.to_xml() if @headers
76
- xml << '</adminCredentials>'
77
-
78
- xml
79
- end
80
- end
81
-
82
- # Object that represents Header name-value pairs, associated with Web Session Authentication.
83
- class Header
84
- # Name, one per Header
85
- attr_reader :name
86
- # Value, one per Header
87
- attr_reader :value
88
-
89
- # Construct with name value pair
90
- def initialize(name, value)
91
- @name = name
92
- @value = value
93
- end
60
+ # TODO: add description
61
+ def set_blob(securityblob)
62
+ @isblob = true
63
+ @securityblob = securityblob
64
+ end
94
65
 
95
- def to_xml
96
- xml = ''
97
- xml << '<Header'
98
- xml << %Q{ name="#{replace_entities(name)}"} if (name)
99
- xml << %Q{ value="#{replace_entities(value)}"} if (value)
100
- xml << '/>'
101
- xml
102
- end
103
- end
104
-
105
- # Object that represents Headers, associated with Web Session Authentication.
106
- class Headers
107
- # A regular expression used to match against the response to identify authentication failures.
108
- attr_reader :soft403
109
- # Base URL of the application for which the form authentication applies.
110
- attr_reader :webapproot
111
- # When using httpheaders, this represents the set of headers to pass with the authentication request.
112
- attr_reader :headers
113
-
114
- def initialize(webapproot, soft403)
115
- @headers = []
116
- @webapproot = webapproot
117
- @soft403 = soft403
66
+ # Add Headers to credentials for httpheaders.
67
+ def set_headers(headers)
68
+ @headers = headers
69
+ end
70
+
71
+ def set_html_forms(html_forms)
72
+ @html_forms = html_forms
73
+ end
74
+
75
+ def to_xml
76
+ to_xml_elem.to_s
77
+ end
78
+
79
+ def to_xml_elem
80
+ attributes = {}
81
+
82
+ attributes['service'] = @service
83
+ attributes['userid'] = @userid
84
+ attributes['password'] = @password
85
+ attributes['realm'] = @realm
86
+ attributes['host'] = @host
87
+ attributes['port'] = @port
88
+
89
+ data = isblob ? securityblob : ''
90
+ xml = make_xml('adminCredentials', attributes, data)
91
+ xml.add_element(@headers.to_xml_elem) if @headers
92
+ xml.add_element(@html_forms.to_xml_elem) if @html_forms
93
+ xml
94
+ end
95
+ end
96
+
97
+ # Object that represents Header name-value pairs, associated with Web Session Authentication.
98
+ class Header
99
+ include XMLUtils
100
+ # Name, one per Header
101
+ attr_reader :name
102
+ # Value, one per Header
103
+ attr_reader :value
104
+
105
+ # Construct with name value pair
106
+ def initialize(name, value)
107
+ @name = name
108
+ @value = value
109
+ end
110
+
111
+ def to_xml_elem
112
+ attributes = {}
113
+ attributes['name'] = @name
114
+ attributes['value'] = @value
115
+
116
+ make_xml('Header', attributes)
117
+ end
118
+ end
119
+
120
+ # Object that represents Headers, associated with Web Session Authentication.
121
+ class Headers
122
+ include XMLUtils
123
+ # A regular expression used to match against the response to identify authentication failures.
124
+ attr_reader :soft403
125
+ # Base URL of the application for which the form authentication applies.
126
+ attr_reader :webapproot
127
+ # When using httpheaders, this represents the set of headers to pass with the authentication request.
128
+ attr_reader :headers
129
+
130
+ def initialize(webapproot, soft403)
131
+ @headers = []
132
+ @webapproot = webapproot
133
+ @soft403 = soft403
134
+ end
135
+
136
+ def add_header(header)
137
+ @headers.push(header)
138
+ end
139
+
140
+ def to_xml_elem
141
+ attributes = {}
142
+ attributes['webapproot'] = @webapproot
143
+ attributes['soft403'] = @soft403
144
+
145
+ xml = make_xml('Headers', attributes)
146
+ @headers.each do |header|
147
+ xml.add_element(header.to_xml_elem)
118
148
  end
149
+ xml
150
+ end
151
+
152
+ end
153
+
154
+ # When using htmlform, this represents the login form information.
155
+ class Field
156
+ include XMLUtils
157
+ # The name of the HTML field (form parameter).
158
+ attr_reader :name
159
+ # The value of the HTML field (form parameter).
160
+ attr_reader :value
161
+ # The type of the HTML field (form parameter).
162
+ attr_reader :type
163
+ # Is the HTML field (form parameter) dynamically generated? If so,
164
+ # the login page is requested and the value of the field is extracted
165
+ # from the response.
166
+ attr_reader :dynamic
167
+ # If the HTML field (form parameter) is a radio button, checkbox or select
168
+ # field, this flag determines if the field should be checked (selected).
169
+ attr_reader :checked
170
+
171
+ def initialize(name, value, type, dynamic, checked)
172
+ @name = name
173
+ @value = value
174
+ @type = type
175
+ @dynamic = dynamic
176
+ @checked = checked
177
+ end
178
+
179
+ def to_xml_elem
180
+ attributes = {}
181
+ attributes['name'] = @name
182
+ attributes['value'] = @value
183
+ attributes['type'] = @type
184
+ attributes['dynamic'] = @dynamic
185
+ attributes['checked'] = @checked
186
+
187
+ make_xml('Field', attributes)
188
+ end
189
+ end
190
+
191
+ # When using htmlform, this represents the login form information.
192
+ class HTMLForm
193
+ include XMLUtils
194
+ # The name of the form being submitted.
195
+ attr_reader :name
196
+ # The HTTP action (URL) through which to submit the login form.
197
+ attr_reader :action
198
+ # The HTTP request method with which to submit the form.
199
+ attr_reader :method
200
+ # The HTTP encoding type with which to submit the form.
201
+ attr_reader :enctype
202
+ # The fields in the HTML Form
203
+ attr_reader :fields
204
+
205
+ def initialize(name, action, method, enctype)
206
+ @name = name
207
+ @action = action
208
+ @method = method
209
+ @enctype = enctype
210
+ @fields = []
211
+ end
212
+
213
+ def add_field(field)
214
+ @fields << field
215
+ end
119
216
 
120
- def addHeader(header)
121
- @headers.push(header)
217
+ def to_xml_elem
218
+ attributes = {}
219
+ attributes['name'] = @name
220
+ attributes['action'] = @action
221
+ attributes['method'] = @method
222
+ attributes['enctype'] = @enctype
223
+
224
+ xml = make_xml('HTMLForm', attributes)
225
+
226
+ fields.each() do |field|
227
+ xml.add_element(field.to_xml_elem)
122
228
  end
123
229
 
230
+ xml
231
+ end
232
+
233
+ end
234
+
235
+ # When using htmlform, this represents the login form information.
236
+ class HTMLForms
237
+ include XMLUtils
238
+ # The URL of the login page containing the login form.
239
+ attr_reader :parentpage
240
+ # A regular expression used to match against the response to identify
241
+ # authentication failures.
242
+ attr_reader :soft403
243
+ # Base URL of the application for which the form authentication applies.
244
+ attr_reader :webapproot
245
+ # The forms to authenticate with
246
+ attr_reader :html_forms
247
+
248
+ def initialize(parentpage, soft403, webapproot)
249
+ @parentpage = parentpage
250
+ @soft403 = soft403
251
+ @webapproot = webapproot
252
+ @html_forms = []
253
+ end
124
254
 
125
- def to_xml
126
- xml = ''
127
- xml << '<Headers'
128
- xml << %Q{ soft403="#{replace_entities(soft403)}"} if (soft403)
129
- xml << %Q{ webapproot="#{replace_entities(webapproot)}"} if (webapproot)
130
- xml << '>'
131
- @headers.each do |header|
132
- xml << header.to_xml
133
- end
134
- xml << '</Headers>'
135
- xml
255
+ def add_html_form(html_form)
256
+ @html_forms << html_form
257
+ end
258
+
259
+ def to_xml_elem
260
+ attributes = {}
261
+ attributes['parentpage'] = @parentpage
262
+ attributes['soft403'] = @soft403
263
+ attributes['webapproot'] = @webapproot
264
+
265
+ xml = make_xml('HTMLForms', attributes)
266
+
267
+ html_forms.each() do |html_form|
268
+ xml.add_element(html_form.to_xml_elem)
136
269
  end
137
- end
138
-
139
- # When using htmlform, this represents the login form information.
140
- class Field
141
- # The name of the HTML field (form parameter).
142
- attr_reader :name
143
- # The value of the HTML field (form parameter).
144
- attr_reader :value
145
- # The type of the HTML field (form parameter).
146
- attr_reader :type
147
- # Is the HTML field (form parameter) dynamically generated? If so,
148
- # the login page is requested and the value of the field is extracted
149
- # from the response.
150
- attr_reader :dynamic
151
- # If the HTML field (form parameter) is a radio button, checkbox or select
152
- # field, this flag determines if the field should be checked (selected).
153
- attr_reader :checked
154
-
155
- # TODO
156
- end
157
-
158
- # When using htmlform, this represents the login form information.
159
- class HTMLForm
160
- # The name of the form being submitted.
161
- attr_reader :name
162
- # The HTTP action (URL) through which to submit the login form.
163
- attr_reader :action
164
- # The HTTP request method with which to submit the form.
165
- attr_reader :method
166
- # The HTTP encoding type with which to submit the form.
167
- attr_reader :enctype
168
-
169
- # TODO
170
- end
171
-
172
- # When using htmlform, this represents the login form information.
173
- class HTMLForms
174
- # The URL of the login page containing the login form.
175
- attr_reader :parentpage
176
- # A regular expression used to match against the response to identify
177
- # authentication failures.
178
- attr_reader :soft403
179
- # Base URL of the application for which the form authentication applies.
180
- attr_reader :webapproot
181
-
182
- # TODO
183
- end
184
-
185
- # When using ssh-key, this represents the PEM-format keypair information.
186
- class PEMKey
187
- # TODO
188
- end
270
+ xml
271
+ end
272
+
273
+ end
274
+
275
+ # When using ssh-key, this represents the PEM-format keypair information.
276
+ class PEMKey
277
+ # TODO
278
+ end
189
279
  end
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  module Nexpose
2
3
  module NexposeAPI
3
4
  include XMLUtils
@@ -208,7 +209,7 @@ module Nexpose
208
209
 
209
210
  @error = false
210
211
  @connection = connection
211
- @filters = Array.new()
212
+ @filters = []
212
213
  @template_id = template_id
213
214
  @format = format
214
215
 
@@ -326,9 +327,9 @@ module Nexpose
326
327
  @error = false
327
328
  @connection = connection
328
329
  @config_id = config_id
329
- @xml_tag_stack = Array.new()
330
- @filters = Array.new()
331
- @email_recipients = Array.new()
330
+ @xml_tag_stack = []
331
+ @filters = []
332
+ @email_recipients = []
332
333
  @name = "New Report " + rand(999999999).to_s
333
334
 
334
335
  r = @connection.execute('<ReportConfigRequest session-id="' + @connection.session_id.to_s + '" reportcfg-id="' + @config_id.to_s + '"/>')
@@ -391,7 +392,7 @@ module Nexpose
391
392
  xml += ' <Filters>'
392
393
 
393
394
  @filters.each do |f|
394
- xml += ' <' + f.type.to_s + ' id="' + f.id.to_s + '"/>'
395
+ xml += ' <filter type="' + f.type.to_s + '" id="' + f.id.to_s + '"/>'
395
396
  end
396
397
 
397
398
  xml += ' </Filters>'
@@ -518,7 +519,7 @@ module Nexpose
518
519
 
519
520
  @error = nil
520
521
  @connection = connection
521
- @report_template_summaries = Array.new()
522
+ @report_template_summaries = []
522
523
 
523
524
  r = @connection.execute('<ReportTemplateListingRequest session-id="' + connection.session_id.to_s + '"/>')
524
525
  if (r.success)
@@ -587,7 +588,7 @@ module Nexpose
587
588
 
588
589
  def initialize(name)
589
590
 
590
- @properties = Array.new()
591
+ @properties = []
591
592
  @name = name
592
593
  end
593
594
 
@@ -599,4 +600,4 @@ module Nexpose
599
600
 
600
601
  end
601
602
 
602
- end
603
+ end
data/lib/nexpose/scan.rb CHANGED
@@ -211,8 +211,8 @@ module Nexpose
211
211
  @name = name
212
212
  @templateID = templateID
213
213
  @configVersion = configVersion
214
- @schedules = Array.new()
215
- @scanTriggers = Array.new()
214
+ @schedules = []
215
+ @scanTriggers = []
216
216
 
217
217
  end
218
218
 
@@ -277,4 +277,4 @@ module Nexpose
277
277
  end
278
278
  end
279
279
 
280
- end
280
+ end
@@ -168,9 +168,9 @@ module Nexpose
168
168
  xml << %Q{ scope="#{scope}"}
169
169
  xml << %Q{ priority="#{priority}"} if (priority)
170
170
  xml << '>'
171
- #sites.each do |site|
172
- #xml << %Q{<Site id="#{site}" />}
173
- #end
171
+ sites.each do |site|
172
+ xml << %Q{<Site id="#{site}" />}
173
+ end
174
174
  xml << '</EngineConfig>'
175
175
  xml
176
176
  end
data/lib/nexpose/site.rb CHANGED
@@ -437,10 +437,10 @@ module Nexpose
437
437
  attr_reader :scanConfig
438
438
 
439
439
  def initialize()
440
- @xml_tag_stack = Array.new()
441
- @hosts = Array.new()
442
- @credentials = Array.new()
443
- @alerts = Array.new()
440
+ @xml_tag_stack = []
441
+ @hosts = []
442
+ @credentials = []
443
+ @alerts = []
444
444
  @error = false
445
445
  end
446
446
 
@@ -566,8 +566,8 @@ module Nexpose
566
566
  attr_reader :error_msg
567
567
  # The last XML request sent by this object
568
568
  attr_reader :request_xml
569
- # The last XML response received by this object
570
- attr_reader :response_xml
569
+ # The last response received by this object
570
+ attr_reader :response
571
571
  # The NSC Connection associated with this object
572
572
  attr_reader :connection
573
573
  # The Site ID
@@ -579,13 +579,24 @@ module Nexpose
579
579
  @site_id = id
580
580
  @error = false
581
581
  @connection = connection
582
- @scan_summaries = Array.new()
582
+ @scan_summaries = []
583
583
 
584
- r = @connection.execute('<SiteScanHistoryRequest' + ' session-id="' + @connection.session_id + '" site-id="' + "#{@site_id}" + '"/>')
584
+ @request_xml = '<SiteScanHistoryRequest' + ' session-id="' + @connection.session_id + '" site-id="' + "#{@site_id}" + '"/>'
585
+ r = @connection.execute(@request_xml)
586
+ @response = r
585
587
 
586
588
  if r and r.success
587
- r
588
- end
589
+ r.res.elements.each('//ScanSummary') do |summary|
590
+ scan_id=summary.attributes['scan-id'].to_i
591
+ engine_id=summary.attributes['engine-id'].to_i
592
+ name=summary.attributes['name'].to_s
593
+ start_time=summary.attributes['startTime'].to_s
594
+ end_time=summary.attributes['endTime'].to_s
595
+ status=summary.attributes['status'].to_s
596
+ scan_summary = ScanSummary.new(scan_id, engine_id, name, start_time, end_time, status)
597
+ scan_summaries << scan_summary
598
+ end
599
+ end
589
600
  end
590
601
  end
591
602
 
@@ -614,19 +625,26 @@ module Nexpose
614
625
  @site_id = site_id
615
626
  @error = false
616
627
  @connection = connection
617
- @devices = Array.new()
628
+ @devices = []
618
629
 
619
630
  r = nil
620
631
  if (@site_id)
621
632
  r = @connection.execute('<SiteDeviceListingRequest session-id="' + connection.session_id + '" site-id="' + "#{@site_id}" + '"/>')
633
+ if r.success
634
+ r.res.elements.each('SiteDeviceListingResponse/SiteDevices/device') do |d|
635
+ @devices.push(Device.new(d.attrubytes['id'], @site_id, d.attributes["address"], d.attributes["riskfactor"], d.attributes["riskscore"]))
636
+ end
637
+ end
622
638
  else
623
639
  r = @connection.execute('<SiteDeviceListingRequest session-id="' + connection.session_id + '"/>')
624
- end
625
-
626
- if (r.success)
627
- r.res.elements.each('SiteDeviceListingResponse/SiteDevices/device') do |d|
628
- @devices.push(Device.new(d.attributes['id'], @site_id, d.attributes["address"], d.attributes["riskfactor"], d.attributes['riskscore']))
629
- end
640
+ if r.success
641
+ r.res.elements.each('SiteDeviceListingResponse/SiteDevices') do |rr|
642
+ @sid = rr.attribute("site-id")
643
+ rr.elements.each('device') do |d|
644
+ @devices.push(Device.new(d.attributes['id'], @sid, d.attributes["address"], d.attributes['riskfactor'], d.attributes['riskscore']))
645
+ end
646
+ end
647
+ end
630
648
  end
631
649
  end
632
650
  end
@@ -802,7 +820,7 @@ module Nexpose
802
820
  @sender = sender
803
821
  @enabled = enabled
804
822
  @limitText = limitText
805
- @recipients = Array.new()
823
+ @recipients = []
806
824
  # Sets default vuln filter - All Events
807
825
  setVulnFilter(VulnFilter.new("50790400", 1))
808
826
  end
@@ -877,4 +895,4 @@ module Nexpose
877
895
  end
878
896
  end
879
897
  end
880
- end
898
+ end
data/lib/nexpose/util.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  module Nexpose
2
-
3
2
  module Sanitize
4
3
  def replace_entities(str)
5
4
  ret = str.dup
@@ -24,7 +23,9 @@ module Nexpose
24
23
  end
25
24
 
26
25
  opts.keys.each do |k|
27
- xml.attributes[k] = "#{opts[k]}"
26
+ if opts[k] != nil
27
+ xml.attributes[k] = "#{opts[k]}"
28
+ end
28
29
  end
29
30
 
30
31
  xml.text = data
@@ -32,4 +33,4 @@ module Nexpose
32
33
  xml
33
34
  end
34
35
  end
35
- end
36
+ end
data/nexpose.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  APP_NAME = "nexpose"
4
- VERSION = "0.0.94"
4
+ VERSION = "0.0.95"
5
5
  REVISION = "12878"
6
6
 
7
7
  Gem::Specification.new do |s|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexpose
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.94
4
+ version: 0.0.95
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-05-08 00:00:00.000000000Z
13
+ date: 2012-05-24 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: librex
17
- requirement: &28710072 !ruby/object:Gem::Requirement
17
+ requirement: &28418712 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 0.0.32
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *28710072
25
+ version_requirements: *28418712
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rex
28
- requirement: &28709796 !ruby/object:Gem::Requirement
28
+ requirement: &28418436 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: 1.0.2
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *28709796
36
+ version_requirements: *28418436
37
37
  description: This gem provides a Ruby API to the NeXpose vulnerability management
38
38
  product by Rapid7. This version is based on Metasploit SVN revision 12878
39
39
  email: