risu 1.6.2 → 1.6.3
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
- data/Gemfile.ci +1 -3
- data/NEWS.markdown +36 -4
- data/README.markdown +2 -2
- data/Rakefile +0 -1
- data/bin/risu +0 -1
- data/lib/risu.rb +2 -1
- data/lib/risu/base/schema.rb +34 -16
- data/lib/risu/base/template_manager.rb +2 -0
- data/lib/risu/cli/application.rb +48 -19
- data/lib/risu/models.rb +1 -0
- data/lib/risu/models/attachment.rb +36 -0
- data/lib/risu/models/host.rb +49 -49
- data/lib/risu/models/item.rb +25 -24
- data/lib/risu/models/plugin.rb +4 -4
- data/lib/risu/models/policy.rb +4 -4
- data/lib/risu/models/report.rb +1 -1
- data/lib/risu/parsers.rb +1 -0
- data/lib/risu/parsers/nessus/nessus_sax_listener.rb +54 -20
- data/lib/risu/parsers/nessus/postprocess.rb +36 -0
- data/lib/risu/parsers/nessus/postprocess/java.rb +234 -0
- data/lib/risu/parsers/nessus/postprocess/risk_score.rb +101 -0
- data/lib/risu/templates/executive_summary_detailed.rb +14 -7
- data/lib/risu/templates/findings_host.rb +5 -5
- data/lib/risu/templates/malicious_process_detection.rb +137 -0
- data/lib/risu/templates/technical_findings.rb +4 -4
- data/risu.gemspec +1 -2
- metadata +10 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e68cad1b3c4a774e7910aac3401b6b55ffa5ab48
|
4
|
+
data.tar.gz: 42d63e62cc61a230495a6b3c1e69c9f6165e52cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7651b038bae3dbe3d27c82431a1125ff41b1309fe91ace6464d4c1e2794bbac0779b998a002e8487fd6a35ed40c792863b835aad5b565f8d6ebeb5df3e46651e
|
7
|
+
data.tar.gz: be5aa294863a70be65695e165db193185519ad263d8bc517a95df13cd047b198c56673845cf734516185ebfe42c69859e2da9c71d302cdb32f5b746bf89ccec4
|
data/Gemfile.ci
CHANGED
data/NEWS.markdown
CHANGED
@@ -1,7 +1,39 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
#1.6.3 (October 01, 2013)
|
4
|
+
- Rails 4.0 compatibility, backwards rails compatibility doesn't exist. You will need to update any plugins using old Rails APIs
|
5
|
+
- Support for Ruby less than 1.9.3 also doesn't exist
|
6
|
+
- Schema
|
7
|
+
- Changed size of ServerPreferences.value to text instead of string. Pull Request from [alanjones]
|
8
|
+
- Changed size of HostProperties.value to text instead of string. Pull Request from [alanjones]
|
9
|
+
- Changed size of References.value to text instead of string. Pull Request from [alanjones]
|
10
|
+
- Models
|
11
|
+
- Policy Model
|
12
|
+
- Added policy_comments
|
13
|
+
- HostProperty Model
|
14
|
+
- Added patch-summary-total-cves
|
15
|
+
- Added patch-summary-cve-num-{HASH}
|
16
|
+
- Added patch-summary-cves-{HASH}
|
17
|
+
- Added patch-summary-txt-{HASH}
|
18
|
+
- Plugin Model
|
19
|
+
- Added script_version
|
20
|
+
- Added d2_elliot_name
|
21
|
+
- Added exploit_framework_d2_elliot
|
22
|
+
- Attachment Model ***NEW***
|
23
|
+
- New Model for attachment meta-data
|
24
|
+
- Please note this is just the hash of the attachment, the real attachment is not in the .nessus file.
|
25
|
+
- Templates
|
26
|
+
- Added initial malicious process detection template based on plugin #59275,
|
27
|
+
it is rough at the moment but good for viewing all the findings. It requires
|
28
|
+
that local checks were run, for the plugin to fire during the Nessus scan.
|
29
|
+
- Wiki
|
30
|
+
- New page for installing on [Kali Linux](https://github.com/arxopia/risu/wiki/Kali-Linux-Risu-Installation-Guide)
|
31
|
+
- Post Processing (Alpha Support)
|
32
|
+
- Started to develop a method for doing post processing on all the findings
|
33
|
+
- Initial RiskScore plugin to calculate a risk score for Plugins / Findings / Hosts
|
34
|
+
|
3
35
|
#1.6.2 (March 13, 2013)
|
4
|
-
- pci_compliance template -
|
36
|
+
- pci_compliance template - Corrected a bug that prevented it from working. Reported by [jkordish]
|
5
37
|
- Added Report.extra to contain any extra risu.config yaml settings to be passed to a report
|
6
38
|
- Check for nil before using it!
|
7
39
|
- It will contain all tags in the report: section of the config file
|
@@ -47,11 +79,11 @@
|
|
47
79
|
- os_windows_2k12
|
48
80
|
- not_is_windows_2k12
|
49
81
|
- Changed the wording `other_os_graph_text` to indicate that its just a percentage of the non windows computers
|
50
|
-
- Added 'bios_uuid' Property
|
82
|
+
- Added 'bios_uuid' Property
|
51
83
|
- Reference Model
|
52
|
-
- Added cert-cc,
|
84
|
+
- Added cert-cc,
|
53
85
|
- Added apple-sa
|
54
|
-
- Added icsa
|
86
|
+
- Added icsa
|
55
87
|
- Added msvr
|
56
88
|
- Plugin Model
|
57
89
|
- cvss_base_score is now a float in the schema, this change should be transparent
|
data/README.markdown
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Risu is [Nessus](http://www.nessus.org) parser, that converts the generated reports into a [ActiveRecord](http://api.rubyonrails.org/classes/ActiveRecord/Base.html) database, this allows for easy report generation and vulnerability verification.
|
4
4
|
|
5
|
-
Version **1.6.
|
5
|
+
Version **1.6.3** is the current release.
|
6
6
|
|
7
7
|
## Requirements
|
8
8
|
|
@@ -55,7 +55,7 @@ Any database that ActiveRecord supports should work. Risu has been tested with [
|
|
55
55
|
|
56
56
|
|
57
57
|
# Viewing Data
|
58
|
-
The data can be viewed with a query browser available for your database.
|
58
|
+
The data can be viewed with a query browser available for your database.
|
59
59
|
|
60
60
|
## Generating Reports
|
61
61
|
To generate a report please execute the following after the the data is parsed into the database.
|
data/Rakefile
CHANGED
data/bin/risu
CHANGED
data/lib/risu.rb
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
|
27
27
|
module Risu
|
28
28
|
APP_NAME = "risu"
|
29
|
-
VERSION = "1.6.
|
29
|
+
VERSION = "1.6.3"
|
30
30
|
GRAPH_WIDTH = 750
|
31
31
|
EMAIL = "risu@arxopia.com"
|
32
32
|
CONFIG_FILE = "./risu.cfg"
|
@@ -56,6 +56,7 @@ require 'risu/cli'
|
|
56
56
|
require 'risu/exceptions'
|
57
57
|
require 'risu/models'
|
58
58
|
require 'risu/parsers'
|
59
|
+
require 'risu/parsers/nessus/postprocess'
|
59
60
|
require 'risu/renderers'
|
60
61
|
|
61
62
|
include Risu::Models
|
data/lib/risu/base/schema.rb
CHANGED
@@ -34,7 +34,7 @@ module Risu
|
|
34
34
|
def self.up
|
35
35
|
create_table :policies do |t|
|
36
36
|
t.string :name
|
37
|
-
t.
|
37
|
+
t.text :comments
|
38
38
|
t.string :owner
|
39
39
|
t.string :visibility
|
40
40
|
end
|
@@ -42,7 +42,7 @@ module Risu
|
|
42
42
|
create_table :server_preferences do |t|
|
43
43
|
t.integer :policy_id
|
44
44
|
t.string :name
|
45
|
-
t.
|
45
|
+
t.text :value, limit: 4294967295
|
46
46
|
end
|
47
47
|
|
48
48
|
create_table :plugins_preferences do |t|
|
@@ -78,18 +78,20 @@ module Risu
|
|
78
78
|
t.string :fqdn
|
79
79
|
t.string :netbios
|
80
80
|
t.text :notes
|
81
|
+
t.integer :risk_score
|
81
82
|
end
|
82
83
|
|
83
84
|
create_table :host_properties do |t|
|
84
85
|
t.integer :host_id
|
85
86
|
t.string :name
|
86
|
-
t.
|
87
|
+
t.text :value, limit: 4294967295
|
87
88
|
end
|
88
89
|
|
89
90
|
create_table :items do |t|
|
90
91
|
t.integer :host_id
|
91
92
|
t.integer :plugin_id
|
92
|
-
t.
|
93
|
+
t.integer :attachment_id
|
94
|
+
t.text :plugin_output, limit: 4294967295
|
93
95
|
t.integer :port
|
94
96
|
t.string :svc_name
|
95
97
|
t.string :protocol
|
@@ -104,6 +106,8 @@ module Risu
|
|
104
106
|
t.string :cm_compliance_check_name
|
105
107
|
t.string :cm_compliance_result
|
106
108
|
t.string :cm_compliance_output
|
109
|
+
t.integer :real_severity
|
110
|
+
t.integer :risk_score
|
107
111
|
end
|
108
112
|
|
109
113
|
create_table :plugins do |t|
|
@@ -134,6 +138,11 @@ module Risu
|
|
134
138
|
t.string :stig_severity
|
135
139
|
t.string :fname
|
136
140
|
t.string :always_run
|
141
|
+
t.string :script_version
|
142
|
+
t.string :d2_elliot_name
|
143
|
+
t.string :exploit_framework_d2_elliot
|
144
|
+
t.boolean :rollup
|
145
|
+
t.integer :risk_score
|
137
146
|
end
|
138
147
|
|
139
148
|
create_table :individual_plugin_selections do |t|
|
@@ -147,7 +156,15 @@ module Risu
|
|
147
156
|
create_table :references do |t|
|
148
157
|
t.integer :plugin_id
|
149
158
|
t.string :reference_name
|
150
|
-
t.
|
159
|
+
t.text :value
|
160
|
+
end
|
161
|
+
|
162
|
+
create_table :attachments do |t|
|
163
|
+
t.integer :item_id
|
164
|
+
t.string :name
|
165
|
+
t.string :type
|
166
|
+
t.string :ahash
|
167
|
+
t.text :value
|
151
168
|
end
|
152
169
|
|
153
170
|
create_table :versions do |t|
|
@@ -166,23 +183,23 @@ module Risu
|
|
166
183
|
t.string :value
|
167
184
|
end
|
168
185
|
|
169
|
-
#Index's for speed increases
|
186
|
+
#Index's for speed increases, possibly have these apply after parsing @todo
|
170
187
|
add_index :items, :host_id
|
171
188
|
add_index :items, :plugin_id
|
172
189
|
add_index :references, :plugin_id
|
173
190
|
|
174
191
|
#Default data for service descriptions
|
175
192
|
#@todo Unused ATM, might be better to use a yaml file tho..
|
176
|
-
ServiceDescription.create :name => "www", :description => ""
|
177
|
-
ServiceDescription.create :name => "cifs", :description => ""
|
178
|
-
ServiceDescription.create :name => "smb", :description => ""
|
179
|
-
ServiceDescription.create :name => "netbios-ns", :description => ""
|
180
|
-
ServiceDescription.create :name => "snmp", :description => ""
|
181
|
-
ServiceDescription.create :name => "ftp", :description => ""
|
182
|
-
ServiceDescription.create :name => "epmap", :description => ""
|
183
|
-
ServiceDescription.create :name => "ntp", :description => ""
|
184
|
-
ServiceDescription.create :name => "dce-rpc", :description => ""
|
185
|
-
ServiceDescription.create :name => "telnet", :description => ""
|
193
|
+
# ServiceDescription.create :name => "www", :description => ""
|
194
|
+
# ServiceDescription.create :name => "cifs", :description => ""
|
195
|
+
# ServiceDescription.create :name => "smb", :description => ""
|
196
|
+
# ServiceDescription.create :name => "netbios-ns", :description => ""
|
197
|
+
# ServiceDescription.create :name => "snmp", :description => ""
|
198
|
+
# ServiceDescription.create :name => "ftp", :description => ""
|
199
|
+
# ServiceDescription.create :name => "epmap", :description => ""
|
200
|
+
# ServiceDescription.create :name => "ntp", :description => ""
|
201
|
+
# ServiceDescription.create :name => "dce-rpc", :description => ""
|
202
|
+
# ServiceDescription.create :name => "telnet", :description => ""
|
186
203
|
end
|
187
204
|
|
188
205
|
# Deletes all of the database tables created
|
@@ -202,6 +219,7 @@ module Risu
|
|
202
219
|
drop_table :service_descriptions
|
203
220
|
drop_table :patches
|
204
221
|
drop_table :host_properties
|
222
|
+
drop_table :attachments
|
205
223
|
end
|
206
224
|
end
|
207
225
|
end
|
data/lib/risu/cli/application.rb
CHANGED
@@ -41,6 +41,7 @@ module Risu
|
|
41
41
|
|
42
42
|
@options[:debug] = false
|
43
43
|
@options[:list_templates] = false
|
44
|
+
@options[:rollup] = false
|
44
45
|
|
45
46
|
@template_manager = Risu::Base::TemplateManager.new "risu/templates"
|
46
47
|
end
|
@@ -224,6 +225,13 @@ module Risu
|
|
224
225
|
opts = OptionParser.new do |opt|
|
225
226
|
opt.banner = "#{APP_NAME} v#{VERSION}\nJacob Hammack\nhttp://www.arxopia.com\n\n"
|
226
227
|
opt.banner << "Usage: #{APP_NAME} [options] [files_to_parse]"
|
228
|
+
opt.separator('')
|
229
|
+
opt.separator("Parse Options")
|
230
|
+
|
231
|
+
opt.on('--post-process', 'Preform post processing on the data') do |option|
|
232
|
+
@options[:post_process] = option
|
233
|
+
end
|
234
|
+
|
227
235
|
opt.separator('')
|
228
236
|
opt.separator("Reporting Options")
|
229
237
|
|
@@ -411,36 +419,57 @@ module Risu
|
|
411
419
|
end
|
412
420
|
end
|
413
421
|
|
422
|
+
# Preforms PostProcessing on the dataset
|
423
|
+
#
|
424
|
+
def process_post_processing
|
425
|
+
if @options[:post_process] != false
|
426
|
+
|
427
|
+
puts "[*] Preforming Post Processing"
|
428
|
+
|
429
|
+
#Calculate all RiskScores
|
430
|
+
puts "\t[*] Calculating RiskScore for all vulnerabilities"
|
431
|
+
score = Risu::Parsers::Nessus::PostProcess::RiskScore.new
|
432
|
+
score.run()
|
433
|
+
|
434
|
+
#Clean up java patches
|
435
|
+
#puts "\t[*] Rolling up Oracle Java vulnerabilities"
|
436
|
+
#java = Risu::Parsers::Nessus::PostProcess::Java.new
|
437
|
+
#java.run()
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
414
441
|
# Handles the parsing of a single file
|
415
442
|
#
|
416
443
|
# @param file The to parse
|
417
444
|
def parse_file file
|
418
445
|
begin
|
419
|
-
|
420
|
-
|
446
|
+
puts "[*] Parsing #{file}..."
|
447
|
+
tstart = Time.new
|
421
448
|
|
422
|
-
|
423
|
-
|
424
|
-
|
449
|
+
if File.exists?(file) == false
|
450
|
+
raise Risu::Exceptions::InvalidDocument, "[!] Document does not exist - #{file}"
|
451
|
+
end
|
425
452
|
|
426
|
-
|
427
|
-
|
453
|
+
nessus_doc = Risu::Parsers::Nessus::NessusDocument.new file
|
454
|
+
nexpose_doc = Risu::Parsers::Nexpose::NexposeDocument.new file
|
428
455
|
|
429
|
-
|
430
|
-
|
456
|
+
if nessus_doc.valid? == true
|
457
|
+
nessus_doc.parse
|
431
458
|
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
459
|
+
puts "[*] Fixing IP Address field"
|
460
|
+
nessus_doc.fix_ips
|
461
|
+
elsif nexpose_doc.valid? == true
|
462
|
+
nexpose_doc.parse
|
436
463
|
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
464
|
+
puts "[*] Fixing IP Address field"
|
465
|
+
nexpose_doc.fix_ips
|
466
|
+
else
|
467
|
+
raise Risu::Exceptions::InvalidDocument, "[!] Invalid Document - #{file}"
|
468
|
+
end
|
469
|
+
|
470
|
+
process_post_processing()
|
442
471
|
|
443
|
-
|
472
|
+
printf "[*] Finished parsing %s. Parse took %.02f seconds\n", file, Time.now - tstart
|
444
473
|
rescue Interrupt => i
|
445
474
|
puts "[!] Parse canceled!"
|
446
475
|
exit(1)
|
data/lib/risu/models.rb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Copyright (c) 2010-2013 Arxopia LLC.
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of the Arxopia LLC nor the names of its contributors
|
13
|
+
# may be used to endorse or promote products derived from this software
|
14
|
+
# without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
17
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
# DISCLAIMED. IN NO EVENT SHALL ARXOPIA LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
|
20
|
+
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
21
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
22
|
+
# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
23
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
24
|
+
#OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
25
|
+
#OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
|
27
|
+
module Risu
|
28
|
+
module Models
|
29
|
+
|
30
|
+
# Patch Model
|
31
|
+
#
|
32
|
+
class Attachment < ActiveRecord::Base
|
33
|
+
belongs_to :item
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/risu/models/host.rb
CHANGED
@@ -51,7 +51,7 @@ module Risu
|
|
51
51
|
#
|
52
52
|
# @return [Array] With all the Ip's in sorted order
|
53
53
|
def sorted
|
54
|
-
hosts = Host.where("ip is not NULL").order("ip").
|
54
|
+
hosts = Host.where("ip is not NULL").order("ip").to_a
|
55
55
|
|
56
56
|
#Sort the ips in natural order.
|
57
57
|
hosts.sort! do |a,b|
|
@@ -69,7 +69,7 @@ module Risu
|
|
69
69
|
# @return [String] of hosts \n delimited
|
70
70
|
def ip_list
|
71
71
|
ips = Array.new
|
72
|
-
hosts = Host.where("ip is not NULL").order("ip").
|
72
|
+
hosts = Host.where("ip is not NULL").order("ip").to_a
|
73
73
|
|
74
74
|
hosts.each do |host|
|
75
75
|
ips << host.ip if host.ip != nil
|
@@ -258,7 +258,7 @@ module Risu
|
|
258
258
|
# @return [ActiveRecord::Relation] with the query results
|
259
259
|
def not_os_windows_8
|
260
260
|
where("os NOT LIKE '%Windows 8%'")
|
261
|
-
end
|
261
|
+
end
|
262
262
|
|
263
263
|
# Queries for hosts with a Windows Operating System that are not 2000,
|
264
264
|
# XP, 2003, Vista, 2008 or 7
|
@@ -396,7 +396,7 @@ module Risu
|
|
396
396
|
:background_colors => %w(white white)
|
397
397
|
}
|
398
398
|
|
399
|
-
Item.risks_by_host(limit).
|
399
|
+
Item.risks_by_host(limit).to_a.each do |item|
|
400
400
|
ip = Host.find_by_id(item.host_id).name
|
401
401
|
# count = Item.where(:host_id => item.host_id).where("severity IN (?)", [2,3]).count
|
402
402
|
count = Item.where(:host_id => item.host_id).where(:severity => 4).count
|
@@ -421,15 +421,15 @@ module Risu
|
|
421
421
|
:background_colors => %w(white white)
|
422
422
|
}
|
423
423
|
|
424
|
-
linux = Host.os_linux.
|
425
|
-
osx = Host.os_osx.
|
426
|
-
freebsd = Host.os_freebsd.
|
427
|
-
netbsd = Host.os_netbsd.
|
428
|
-
cisco = Host.os_cisco.
|
429
|
-
vxworks = Host.os_vxworks.
|
430
|
-
esx = Host.os_vmware_esx.
|
431
|
-
aix = Host.os_aix.
|
432
|
-
other = Host.os_other.
|
424
|
+
linux = Host.os_linux.to_a.count
|
425
|
+
osx = Host.os_osx.to_a.count
|
426
|
+
freebsd = Host.os_freebsd.to_a.count
|
427
|
+
netbsd = Host.os_netbsd.to_a.count
|
428
|
+
cisco = Host.os_cisco.to_a.count
|
429
|
+
vxworks = Host.os_vxworks.to_a.count
|
430
|
+
esx = Host.os_vmware_esx.to_a.count
|
431
|
+
aix = Host.os_aix.to_a.count
|
432
|
+
other = Host.os_other.to_a.count
|
433
433
|
|
434
434
|
g.data("Linux", linux) unless linux == 0
|
435
435
|
g.data("OSX", osx) unless osx == 0
|
@@ -462,16 +462,16 @@ module Risu
|
|
462
462
|
:background_colors => %w(white white)
|
463
463
|
}
|
464
464
|
|
465
|
-
nt = Host.os_windows_nt.
|
466
|
-
w2k = Host.os_windows_2k.
|
467
|
-
xp = Host.os_windows_xp.
|
468
|
-
w2k3 = Host.os_windows_2k3.
|
469
|
-
vista = Host.os_windows_vista.
|
470
|
-
w2k8 = Host.os_windows_2k8.
|
471
|
-
w2k12 = Host.os_windows_2k12.
|
472
|
-
w7 = Host.os_windows_7.
|
473
|
-
w8 = Host.os_windows_8.
|
474
|
-
other = (Host.os_windows.os_windows_other).
|
465
|
+
nt = Host.os_windows_nt.to_a.count
|
466
|
+
w2k = Host.os_windows_2k.to_a.count
|
467
|
+
xp = Host.os_windows_xp.to_a.count
|
468
|
+
w2k3 = Host.os_windows_2k3.to_a.count
|
469
|
+
vista = Host.os_windows_vista.to_a.count
|
470
|
+
w2k8 = Host.os_windows_2k8.to_a.count
|
471
|
+
w2k12 = Host.os_windows_2k12.to_a.count
|
472
|
+
w7 = Host.os_windows_7.to_a.count
|
473
|
+
w8 = Host.os_windows_8.to_a.count
|
474
|
+
other = (Host.os_windows.os_windows_other).to_a.count
|
475
475
|
|
476
476
|
g.data("NT", nt) if nt >= 1
|
477
477
|
g.data("2000", w2k) if w2k >= 1
|
@@ -481,7 +481,7 @@ module Risu
|
|
481
481
|
g.data("Server 2008", w2k8) if w2k8 >= 1
|
482
482
|
g.data("Server 2012", w2k12) if w2k12 >= 1
|
483
483
|
g.data("7", w7) if w7 >= 1
|
484
|
-
g.data("8", w8) if w8 >= 1
|
484
|
+
g.data("8", w8) if w8 >= 1
|
485
485
|
g.data("Other Windows", other) if other >= 1
|
486
486
|
|
487
487
|
StringIO.new(g.to_blob)
|
@@ -491,16 +491,16 @@ module Risu
|
|
491
491
|
#@todo comment
|
492
492
|
#
|
493
493
|
def windows_os_graph_text
|
494
|
-
nt = Host.os_windows_nt.
|
495
|
-
w2k = Host.os_windows_2k.
|
496
|
-
xp = Host.os_windows_xp.
|
497
|
-
w2k3 = Host.os_windows_2k3.
|
498
|
-
vista = Host.os_windows_vista.
|
499
|
-
w2k8 = Host.os_windows_2k8.
|
500
|
-
w2k12 = Host.os_windows_2k12.
|
501
|
-
w7 = Host.os_windows_7.
|
502
|
-
w8 = Host.os_windows_8.
|
503
|
-
other = (Host.os_windows.os_windows_other).
|
494
|
+
nt = Host.os_windows_nt.to_a.count
|
495
|
+
w2k = Host.os_windows_2k.to_a.count
|
496
|
+
xp = Host.os_windows_xp.to_a.count
|
497
|
+
w2k3 = Host.os_windows_2k3.to_a.count
|
498
|
+
vista = Host.os_windows_vista.to_a.count
|
499
|
+
w2k8 = Host.os_windows_2k8.to_a.count
|
500
|
+
w2k12 = Host.os_windows_2k12.to_a.count
|
501
|
+
w7 = Host.os_windows_7.to_a.count
|
502
|
+
w8 = Host.os_windows_8.to_a.count
|
503
|
+
other = (Host.os_windows.os_windows_other).to_a.count
|
504
504
|
|
505
505
|
windows_os_count = nt + w2k + xp + w2k3 + vista + w7 + w8 + w2k8 + w2k12 + other
|
506
506
|
|
@@ -533,7 +533,7 @@ module Risu
|
|
533
533
|
return text
|
534
534
|
end
|
535
535
|
|
536
|
-
#
|
536
|
+
#
|
537
537
|
# @todo comments
|
538
538
|
#
|
539
539
|
def unsupported_os?
|
@@ -634,15 +634,15 @@ module Risu
|
|
634
634
|
text = "This graph shows the percentage of the different Non-Windows based operating systems " +
|
635
635
|
"found on the #{Report.title} network.\n\n"
|
636
636
|
|
637
|
-
linux = Host.os_linux.
|
638
|
-
osx = Host.os_osx.
|
639
|
-
freebsd = Host.os_freebsd.
|
640
|
-
netbsd = Host.os_netbsd.
|
641
|
-
cisco = Host.os_cisco.
|
642
|
-
vxworks = Host.os_vxworks.
|
643
|
-
esx = Host.os_vmware_esx.
|
644
|
-
aix = Host.os_aix.
|
645
|
-
other = Host.os_other.
|
637
|
+
linux = Host.os_linux.to_a.count
|
638
|
+
osx = Host.os_osx.to_a.count
|
639
|
+
freebsd = Host.os_freebsd.to_a.count
|
640
|
+
netbsd = Host.os_netbsd.to_a.count
|
641
|
+
cisco = Host.os_cisco.to_a.count
|
642
|
+
vxworks = Host.os_vxworks.to_a.count
|
643
|
+
esx = Host.os_vmware_esx.to_a.count
|
644
|
+
aix = Host.os_aix.to_a.count
|
645
|
+
other = Host.os_other.to_a.count
|
646
646
|
|
647
647
|
other_os_count = linux + osx + freebsd + netbsd + cisco + vxworks + esx + aix + other
|
648
648
|
|
@@ -653,10 +653,10 @@ module Risu
|
|
653
653
|
|
654
654
|
#todo add other os's here
|
655
655
|
|
656
|
-
text << "#{linux_percent.to_i}% of the non-windows network
|
657
|
-
text << "#{aix_percent.to_i}% of the non-windows network
|
658
|
-
text << "#{freebsd_percent.to_i}% of the non-windows network
|
659
|
-
text << "#{vmware_percent.to_i}% of the non-windows network
|
656
|
+
text << "#{linux_percent.to_i}% of the non-windows network are running an Linux based operating system. " if linux_percent >= 1
|
657
|
+
text << "#{aix_percent.to_i}% of the non-windows network are running an AIX based operating system. " if aix_percent >= 1
|
658
|
+
text << "#{freebsd_percent.to_i}% of the non-windows network are running an FreeBSD based operating system. " if freebsd_percent >= 1
|
659
|
+
text << "#{vmware_percent.to_i}% of the non-windows network are running an VMware based operating system. " if vmware_percent >= 1
|
660
660
|
|
661
661
|
text << "\n\n"<< unsupported_os_aix if aix > 0
|
662
662
|
text << "\n\n" << unsupported_os_freebsd if freebsd > 0
|
@@ -668,7 +668,7 @@ module Risu
|
|
668
668
|
# @todo comments
|
669
669
|
#
|
670
670
|
def top_n_vulnerable(n)
|
671
|
-
hosts = Item.risks_by_host(Host.
|
671
|
+
hosts = Item.risks_by_host(Host.count).count
|
672
672
|
hosts = hosts.sort_by {|k, v| v}
|
673
673
|
hosts.reverse!
|
674
674
|
|