nexpose 0.8.10 → 0.8.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 81928c1e3298ba80b864e0d14499f58a9a41eae2
4
- data.tar.gz: dcbe6c5b9df95b254fa98f3eb5ec2041492d389a
3
+ metadata.gz: 9a8af56d94e621eaf5a5c7aba69a52c4b840fe72
4
+ data.tar.gz: aed5d663662dcc7364d08c3c23e80e036786b3ca
5
5
  SHA512:
6
- metadata.gz: aa9189178c6c2d497635cc871473f78277abe75374bcf32ac883303463b079b73bc5bdacdac0d8292fcfbd0d326f1d6754235fe2b3ab8d19dcbb260c651cb09e
7
- data.tar.gz: 7fc4dc7d5a376c7a6e1a0f440e48b532cb73acb1c4470973528fb228be3d8ccbfb60d1d6acd55ce9c1ee00d3aed91dea79b691b484cfddd3bd0374bef0a5690e
6
+ metadata.gz: 309661c597363464b8f47162b8f31bcf0914f699938da2772bd8554b589a3217d9b10540e36b65c1188a20555fc6c2d59e0dd68143e1ab099cf8bb54bed970ce
7
+ data.tar.gz: 60e5a8f6050b052484f774ed9a32ad47a9d1046fa8551d5e0574926990e2e3327133a2c8544a668ea4461b592f69686f98a263d35697240b677a612d1dbd37f0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in nexpose.gemspec
4
+ gemspec
data/Rakefile CHANGED
@@ -1,16 +1,5 @@
1
1
  # encoding: utf-8
2
-
3
- task :build do
4
- Rake::Task['clean'].execute
5
- puts "[*] Building nexpose.gemspec"
6
- system "gem build nexpose.gemspec &> /dev/null"
7
- end
8
-
9
- task :release => :build do
10
- puts "[*] Pushing nexpose to rubygems.org"
11
- system "gem push nexpose-*.gem &> /dev/null"
12
- Rake::Task['clean'].execute
13
- end
2
+ require 'bundler/gem_tasks'
14
3
 
15
4
  task :clean do
16
5
  system "rm *.gem &> /dev/null"
data/lib/nexpose/ajax.rb CHANGED
@@ -185,5 +185,19 @@ module Nexpose
185
185
  attr.value == '1'
186
186
  end
187
187
  end
188
+
189
+ def _row_pref_of(val)
190
+ if val.nil? || val > 100
191
+ 500
192
+ elsif val > 50
193
+ 100
194
+ elsif val > 25
195
+ 50
196
+ elsif val > 10
197
+ 25
198
+ else
199
+ 10
200
+ end
201
+ end
188
202
  end
189
203
  end
@@ -1,9 +1,6 @@
1
1
  module Nexpose
2
-
3
- # Constants
4
-
2
+ # Constants useful across the Nexpose module.
5
3
  module Scope
6
-
7
4
  GLOBAL = 'global'
8
5
  SILO = 'silo'
9
6
  end
@@ -27,7 +24,6 @@ module Nexpose
27
24
  # the application will send reports via e-mail to access-list members and
28
25
  # non-members.
29
26
  class Email
30
-
31
27
  # Send as file attachment or zipped file to individuals who are not members
32
28
  # of the report access list. One of: file|zip
33
29
  attr_accessor :send_as
@@ -164,6 +160,7 @@ module Nexpose
164
160
  end
165
161
  end
166
162
 
163
+ # Organization configuration, as used in Site and Silo.
167
164
  class Organization
168
165
  attr_accessor :name
169
166
  attr_accessor :url
@@ -178,7 +175,7 @@ module Nexpose
178
175
  attr_accessor :country
179
176
 
180
177
  def initialize(&block)
181
- instance_eval &block if block_given?
178
+ instance_eval(&block) if block_given?
182
179
  end
183
180
 
184
181
  def self.parse(xml)
@@ -14,11 +14,14 @@ module Nexpose
14
14
  # @param [Connection] console API connection to a Nexpose console.
15
15
  # @param [String] address Controller address relative to https://host:port
16
16
  # @param [Hash] parameters Parameters that need to be sent to the controller
17
- # @param [Integer] pagination size
18
- # @param [Integer] number of records to return, gets all if not specified
19
- # The following attributes need to be provided:
17
+ # The following attributes may need to be provided:
20
18
  # 'sort' Column to sort by
21
19
  # 'table-id' The ID of the table to get from this controller
20
+ # @param [Fixnum] page_size Number of records to include per page.
21
+ # Value must conform to supported defaults: -1, 10, 25, 50, 100, 500.
22
+ # @param [Fixnum] records number of records to return, gets all if not
23
+ # specified.
24
+ # @param [Boolean] post Whether to use form post or get to retrieve data.
22
25
  # @return [Array[Hash]] An array of hashes representing the requested table.
23
26
  #
24
27
  # Example usage:
@@ -41,8 +44,11 @@ module Nexpose
41
44
 
42
45
  response = request.(parameters)
43
46
  data = JSON.parse(response)
44
- total = records || data['totalRecords']
47
+
48
+ # Don't attept to grab more records than there are.
49
+ total = data['totalRecords']
45
50
  return [] if total == 0
51
+ total = records.nil? ? total : [records, total].min
46
52
 
47
53
  rows = []
48
54
  parameters['results'] = page_size
@@ -8,7 +8,7 @@ module Nexpose
8
8
 
9
9
  # Whether control scanning in enabled. A feature tied to ControlsInsight
10
10
  # integration.
11
- attr_accessor :control_scanning
11
+ attr_reader :control_scanning
12
12
 
13
13
  # XML document representing the entire configuration.
14
14
  attr_reader :xml
@@ -19,7 +19,7 @@ module Nexpose
19
19
  @xml = xml
20
20
 
21
21
  @asset_exclusions = HostOrIP.parse(xml)
22
- @control_scanning = _get_control_scanning(xml)
22
+ @control_scanning = parse_control_scanning_from_xml(xml)
23
23
  end
24
24
 
25
25
  # Returns true if controls scanning is enabled.
@@ -27,6 +27,11 @@ module Nexpose
27
27
  control_scanning
28
28
  end
29
29
 
30
+ # Enables/disables controls scanning
31
+ def control_scanning=(enabled)
32
+ add_control_scanning_to_xml(xml, enabled)
33
+ end
34
+
30
35
  # Save any updates to this settings object to the Nexpose console.
31
36
  #
32
37
  # @param [Connection] nsc Connection to a Nexpose console.
@@ -39,8 +44,8 @@ module Nexpose
39
44
  risk_model.add_attribute('recalculation_duration', 'do_not_recalculate')
40
45
  end
41
46
 
42
- _replace_exclusions(xml, asset_exclusions)
43
- _set_control_scanning(xml, control_scanning)
47
+ replace_exclusions(xml, asset_exclusions)
48
+ add_control_scanning_to_xml(xml, control_scanning)
44
49
 
45
50
  response = AJAX.post(nsc, '/data/admin/global-settings', xml)
46
51
  XMLUtils.success? response
@@ -85,8 +90,10 @@ module Nexpose
85
90
  new(REXML::Document.new(response))
86
91
  end
87
92
 
93
+ private
94
+
88
95
  # Internal method for updating exclusions before saving.
89
- def _replace_exclusions(xml, exclusions)
96
+ def replace_exclusions(xml, exclusions)
90
97
  xml.elements.delete('//ExcludedHosts')
91
98
  elem = xml.root.add_element('ExcludedHosts')
92
99
  exclusions.each do |exclusion|
@@ -95,7 +102,7 @@ module Nexpose
95
102
  end
96
103
 
97
104
  # Internal method for parsing XML for whether control scanning in enabled.
98
- def _get_control_scanning(xml)
105
+ def parse_control_scanning_from_xml(xml)
99
106
  enabled = false
100
107
  if elem = REXML::XPath.first(xml, '//enableControlsScan[@enabled]')
101
108
  enabled = elem.attribute('enabled').value.to_i == 1
@@ -104,7 +111,7 @@ module Nexpose
104
111
  end
105
112
 
106
113
  # Internal method for updating control scanning before saving.
107
- def _set_control_scanning(xml, enabled)
114
+ def add_control_scanning_to_xml(xml, enabled)
108
115
  if elem = REXML::XPath.first(xml, '//enableControlsScan')
109
116
  elem.attributes['enabled'] = enabled ? '1' : '0'
110
117
  else
data/lib/nexpose/scan.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  module Nexpose
2
-
3
2
  class Connection
4
3
  include XMLUtils
5
4
 
@@ -110,7 +109,7 @@ module Nexpose
110
109
  # @param [HostName|IPRange] asset Asset to append to XML.
111
110
  #
112
111
  def _append_asset!(xml, asset)
113
- if asset.kind_of? Nexpose::IPRange
112
+ if asset.is_a? Nexpose::IPRange
114
113
  xml.add_element('range', { 'from' => asset.from, 'to' => asset.to })
115
114
  else # Assume HostName
116
115
  host = REXML::Element.new('host')
@@ -227,6 +226,26 @@ module Nexpose
227
226
  end
228
227
  end
229
228
 
229
+ # Get a history of past scans for this console, sorted by most recent first.
230
+ #
231
+ # Please note that for consoles with a deep history of scanning, this method
232
+ # could return an excessive amount of data (and take quite a bit of time to
233
+ # retrieve). Consider limiting the amount of data with the optional argument.
234
+ #
235
+ # @param [Fixnum] limit The maximum number of records to return from this call.
236
+ # @return [Array[CompletedScan]] List of completed scans, ordered by most
237
+ # recently completed first.
238
+ #
239
+ def past_scans(limit = nil)
240
+ uri = '/data/scan/global/scan-history'
241
+ rows = AJAX._row_pref_of(limit)
242
+ params = { 'sort' => 'endTime', 'dir' => 'DESC', 'startIndex' => 0 }
243
+ AJAX.preserving_preference(self, 'global-completed-scans') do
244
+ data = DataTable._get_json_table(self, uri, params, rows, limit)
245
+ data.map(&CompletedScan.method(:parse_json))
246
+ end
247
+ end
248
+
230
249
  # Export the data associated with a single scan, and optionally store it in
231
250
  # a zip-compressed file under the provided name.
232
251
  #
@@ -276,7 +295,7 @@ module Nexpose
276
295
  def import_scan(site_id, zip_file)
277
296
  data = Rex::MIME::Message.new
278
297
  data.add_part(site_id.to_s, nil, nil, 'form-data; name="siteid"')
279
- data.add_part(self.session_id, nil, nil, 'form-data; name="nexposeCCSessionID"')
298
+ data.add_part(session_id, nil, nil, 'form-data; name="nexposeCCSessionID"')
280
299
  scan = File.new(zip_file, 'rb')
281
300
  data.add_part(scan.read, 'application/zip', 'binary',
282
301
  "form-data; name=\"scan\"; filename=\"#{zip_file}\"")
@@ -316,7 +335,6 @@ module Nexpose
316
335
  # can be rather verbose and isn't useful for many automation scenarios.
317
336
  #
318
337
  class ScanData
319
-
320
338
  # The Scan ID of the Scan
321
339
  attr_reader :scan_id
322
340
  # The site that was scanned.
@@ -582,6 +600,10 @@ module Nexpose
582
600
  class CompletedScan
583
601
  # Unique identifier of a scan.
584
602
  attr_reader :id
603
+ # Site ID for which the scan was run.
604
+ attr_reader :site_id
605
+ # Final status of the scan. One of :completed, :stopped, :aborted, :unknown.
606
+ attr_reader :status
585
607
  # Start time of the scan.
586
608
  attr_reader :start_time
587
609
  # Completion time of the scan.
@@ -609,6 +631,8 @@ module Nexpose
609
631
  def self.parse_json(json)
610
632
  new do
611
633
  @id = json['scanID']
634
+ @site_id = json['siteID']
635
+ @status = CompletedScan._parse_status(json['status'])
612
636
  @start_time = Time.at(json['startTime'] / 1000)
613
637
  @end_time = Time.at(json['endTime'] / 1000)
614
638
  @duration = json['duration']
@@ -619,5 +643,19 @@ module Nexpose
619
643
  @engine_name = json['scanEngineName']
620
644
  end
621
645
  end
646
+
647
+ # Internal method to parsing status codes.
648
+ def self._parse_status(code)
649
+ case code
650
+ when 'C'
651
+ :completed
652
+ when 'S'
653
+ :stopped
654
+ when 'A'
655
+ :aborted
656
+ else
657
+ :unknown
658
+ end
659
+ end
622
660
  end
623
661
  end
@@ -0,0 +1,4 @@
1
+ module Nexpose
2
+ # The latest version of the Nexpose gem
3
+ VERSION = '0.8.11'
4
+ end
data/lib/nexpose.rb CHANGED
@@ -94,6 +94,7 @@ require 'nexpose/vuln'
94
94
  require 'nexpose/vuln_exception'
95
95
  require 'nexpose/connection'
96
96
  require 'nexpose/maint'
97
+ require 'nexpose/version'
97
98
 
98
99
  module Nexpose
99
100
 
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.8.10
4
+ version: 0.8.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - HD Moore
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2014-10-29 00:00:00.000000000 Z
14
+ date: 2014-11-04 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rex
@@ -53,6 +53,20 @@ dependencies:
53
53
  - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: 1.6.2
56
+ - !ruby/object:Gem::Dependency
57
+ name: bundler
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.3'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.3'
56
70
  description: This gem provides a Ruby API to the Nexpose vulnerability management
57
71
  product by Rapid7.
58
72
  email:
@@ -66,6 +80,7 @@ extra_rdoc_files:
66
80
  - README.markdown
67
81
  files:
68
82
  - COPYING
83
+ - Gemfile
69
84
  - README.markdown
70
85
  - Rakefile
71
86
  - lib/README.md
@@ -105,6 +120,7 @@ files:
105
120
  - lib/nexpose/ticket.rb
106
121
  - lib/nexpose/user.rb
107
122
  - lib/nexpose/util.rb
123
+ - lib/nexpose/version.rb
108
124
  - lib/nexpose/vuln.rb
109
125
  - lib/nexpose/vuln_exception.rb
110
126
  homepage: https://github.com/rapid7/nexpose-client