risu 1.6.2 → 1.6.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|