risu 1.4.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.
- data/KNOWNISSUES.markdown +50 -0
- data/LICENSE +25 -0
- data/NEWS.markdown +112 -0
- data/README.markdown +126 -0
- data/Rakefile +37 -0
- data/TODO.markdown +69 -0
- data/bin/risu +12 -0
- data/lib/nessusdb.rb +38 -0
- data/lib/nessusdb/cli.rb +9 -0
- data/lib/nessusdb/cli/application.rb +402 -0
- data/lib/nessusdb/cli/banner.rb +25 -0
- data/lib/nessusdb/exceptions.rb +8 -0
- data/lib/nessusdb/exceptions/invaliddocument.rb +10 -0
- data/lib/nessusdb/listener.rb +274 -0
- data/lib/nessusdb/models.rb +18 -0
- data/lib/nessusdb/models/familyselection.rb +12 -0
- data/lib/nessusdb/models/host.rb +359 -0
- data/lib/nessusdb/models/individualpluginselection.rb +14 -0
- data/lib/nessusdb/models/item.rb +183 -0
- data/lib/nessusdb/models/plugin.rb +98 -0
- data/lib/nessusdb/models/pluginspreference.rb +12 -0
- data/lib/nessusdb/models/policy.rb +17 -0
- data/lib/nessusdb/models/reference.rb +13 -0
- data/lib/nessusdb/models/report.rb +26 -0
- data/lib/nessusdb/models/serverpreference.rb +13 -0
- data/lib/nessusdb/models/version.rb +12 -0
- data/lib/nessusdb/nessusdocument.rb +66 -0
- data/lib/nessusdb/parsers.rb +8 -0
- data/lib/nessusdb/prawn_templater.rb +38 -0
- data/lib/nessusdb/schema.rb +145 -0
- data/lib/nessusdb/templates/assets.rb +21 -0
- data/lib/nessusdb/templates/cover_sheet.rb +42 -0
- data/lib/nessusdb/templates/data/nessuslogo.jpg +0 -0
- data/lib/nessusdb/templates/exec_summary.rb +56 -0
- data/lib/nessusdb/templates/executive_summary.rb +182 -0
- data/lib/nessusdb/templates/finding_statistics.rb +23 -0
- data/lib/nessusdb/templates/findings_host.rb +49 -0
- data/lib/nessusdb/templates/findings_summary.rb +68 -0
- data/lib/nessusdb/templates/findings_summary_with_pluginid.rb +68 -0
- data/lib/nessusdb/templates/graphs.rb +33 -0
- data/lib/nessusdb/templates/host_summary.rb +40 -0
- data/lib/nessusdb/templates/ms_patch_summary.rb +37 -0
- data/lib/nessusdb/templates/ms_update_summary.rb +43 -0
- data/lib/nessusdb/templates/pci_compliance.rb +66 -0
- data/lib/nessusdb/templates/technical_findings.rb +116 -0
- data/risu.gemspec +44 -0
- metadata +247 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
text Report.classification, :align => :center
|
2
|
+
text "\n"
|
3
|
+
|
4
|
+
font_size(22) { text Report.title, :align => :center }
|
5
|
+
font_size(18) {
|
6
|
+
text "Finding Statistics", :align => :center
|
7
|
+
text "\n"
|
8
|
+
text "This report was prepared by\n#{Report.author}", :align => :center
|
9
|
+
}
|
10
|
+
|
11
|
+
text "\n\n\n"
|
12
|
+
|
13
|
+
text "Scan Date:", :style => :bold
|
14
|
+
text "#{Report.scan_date}"
|
15
|
+
text "\n"
|
16
|
+
|
17
|
+
headers = ["Number of hosts","Number of risks","High Risks", "Medium Risks", "Low Risks", "Info Risks"]
|
18
|
+
data = [Host.count, Item.risks.count, Item.high_risks.count, Item.medium_risks.count, Item.low_risks.count, Item.info_risks.count]
|
19
|
+
|
20
|
+
table([headers] + [data], :header => true, :width => bounds.width) do
|
21
|
+
row(0).style(:font_style => :bold, :background_color => 'cccccc')
|
22
|
+
cells.borders = [:top, :bottom, :left, :right]
|
23
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
text Report.classification, :align => :center
|
2
|
+
text "\n"
|
3
|
+
|
4
|
+
font_size(22) { text Report.title, :align => :center }
|
5
|
+
font_size(18) {
|
6
|
+
text "Findings Summary Report", :align => :center
|
7
|
+
text "\n"
|
8
|
+
text "This report was prepared by\n#{Report.author}", :align => :center
|
9
|
+
}
|
10
|
+
|
11
|
+
text "\n\n\n"
|
12
|
+
|
13
|
+
Host.sorted.each do |host|
|
14
|
+
if host.items.high_risks_unique_sorted.all.size > 0 or host.items.medium_risks_unique_sorted.all.size > 0
|
15
|
+
font_size(20) {
|
16
|
+
text "#{host.ip} - #{host.fqdn}", :style => :bold
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
if host.items.high_risks_unique_sorted.all.size > 0
|
21
|
+
font_size(18) {
|
22
|
+
fill_color "FF0000"
|
23
|
+
text "High Findings", :style => :bold
|
24
|
+
fill_color "000000"
|
25
|
+
}
|
26
|
+
|
27
|
+
host.items.high_risks_unique_sorted.each do |item|
|
28
|
+
name = Plugin.find_by_id(item.plugin_id).plugin_name
|
29
|
+
text "#{name}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
if host.items.medium_risks_unique_sorted.all.size > 0
|
34
|
+
font_size(18) {
|
35
|
+
fill_color "FF8040"
|
36
|
+
text "Medium Findings", :style => :bold
|
37
|
+
fill_color "000000"
|
38
|
+
}
|
39
|
+
|
40
|
+
host.items.medium_risks_unique_sorted.each do |item|
|
41
|
+
name = Plugin.find_by_id(item.plugin_id).plugin_name
|
42
|
+
text "#{name}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
if host.items.high_risks_unique_sorted.all.size > 0 or host.items.medium_risks_unique_sorted.all.size > 0
|
47
|
+
text "\n"
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
text Report.classification, :align => :center
|
2
|
+
text "\n"
|
3
|
+
|
4
|
+
font_size(22) { text Report.title, :align => :center }
|
5
|
+
font_size(18) {
|
6
|
+
text "Findings Summary Report", :align => :center
|
7
|
+
text "\n"
|
8
|
+
text "This report was prepared by\n#{Report.author}", :align => :center
|
9
|
+
}
|
10
|
+
|
11
|
+
text "\n\n\n"
|
12
|
+
|
13
|
+
font_size(20) {
|
14
|
+
fill_color "FF0000"
|
15
|
+
text "High Findings", :style => :bold
|
16
|
+
fill_color "000000"
|
17
|
+
}
|
18
|
+
|
19
|
+
Item.high_risks_unique_sorted.each do |item|
|
20
|
+
name = Plugin.find_by_id(item.plugin_id).plugin_name
|
21
|
+
count = Item.where(:plugin_id => item.plugin_id).count
|
22
|
+
|
23
|
+
text "#{count} - #{name}"
|
24
|
+
end
|
25
|
+
|
26
|
+
start_new_page
|
27
|
+
|
28
|
+
font_size(20) {
|
29
|
+
fill_color "FF8040"
|
30
|
+
text "Medium Findings", :style => :bold
|
31
|
+
fill_color "000000"
|
32
|
+
}
|
33
|
+
|
34
|
+
Item.medium_risks_unique_sorted.each do |item|
|
35
|
+
name = Plugin.find_by_id(item.plugin_id).plugin_name
|
36
|
+
count = Item.where(:plugin_id => item.plugin_id).count
|
37
|
+
|
38
|
+
text "#{count} - #{name}"
|
39
|
+
end
|
40
|
+
|
41
|
+
start_new_page
|
42
|
+
|
43
|
+
font_size(20) {
|
44
|
+
fill_color "0000FF"
|
45
|
+
text "Low Findings", :style => :bold
|
46
|
+
fill_color "000000"
|
47
|
+
}
|
48
|
+
|
49
|
+
Item.low_risks_unique_sorted.each do |item|
|
50
|
+
name = Plugin.find_by_id(item.plugin_id).plugin_name
|
51
|
+
count = Item.where(:plugin_id => item.plugin_id).count
|
52
|
+
|
53
|
+
text "#{count} - #{name}"
|
54
|
+
end
|
55
|
+
|
56
|
+
#Provides nothing
|
57
|
+
#font_size(20) {
|
58
|
+
# fill_color "008000"
|
59
|
+
# text "Low Findings", :style => :bold
|
60
|
+
# fill_color "000000"
|
61
|
+
#}
|
62
|
+
#
|
63
|
+
#Item.low_risks_unique_sorted.each do |item|
|
64
|
+
# name = Plugin.find_by_id(item.plugin_id).plugin_name
|
65
|
+
# count = Item.where(:plugin_id => item.plugin_id).count
|
66
|
+
#
|
67
|
+
# text "#{count} - #{name}"
|
68
|
+
#end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
text Report.classification, :align => :center
|
2
|
+
text "\n"
|
3
|
+
|
4
|
+
font_size(22) { text Report.title, :align => :center }
|
5
|
+
font_size(18) {
|
6
|
+
text "Findings Summary Report", :align => :center
|
7
|
+
text "\n"
|
8
|
+
text "This report was prepared by\n#{Report.author}", :align => :center
|
9
|
+
}
|
10
|
+
|
11
|
+
text "\n\n\n"
|
12
|
+
|
13
|
+
font_size(20) {
|
14
|
+
fill_color "FF0000"
|
15
|
+
text "High Findings", :style => :bold
|
16
|
+
fill_color "000000"
|
17
|
+
}
|
18
|
+
|
19
|
+
Item.high_risks_unique_sorted.each do |item|
|
20
|
+
name = Plugin.find_by_id(item.plugin_id).plugin_name
|
21
|
+
count = Item.where(:plugin_id => item.plugin_id).count
|
22
|
+
|
23
|
+
text "#{count} - #{name} - #{item.plugin_id}"
|
24
|
+
end
|
25
|
+
|
26
|
+
start_new_page
|
27
|
+
|
28
|
+
font_size(20) {
|
29
|
+
fill_color "FF8040"
|
30
|
+
text "Medium Findings", :style => :bold
|
31
|
+
fill_color "000000"
|
32
|
+
}
|
33
|
+
|
34
|
+
Item.medium_risks_unique_sorted.each do |item|
|
35
|
+
name = Plugin.find_by_id(item.plugin_id).plugin_name
|
36
|
+
count = Item.where(:plugin_id => item.plugin_id).count
|
37
|
+
|
38
|
+
text "#{count} - #{name} - #{item.plugin_id}"
|
39
|
+
end
|
40
|
+
|
41
|
+
start_new_page
|
42
|
+
|
43
|
+
font_size(20) {
|
44
|
+
fill_color "0000FF"
|
45
|
+
text "Low Findings", :style => :bold
|
46
|
+
fill_color "000000"
|
47
|
+
}
|
48
|
+
|
49
|
+
Item.low_risks_unique_sorted.each do |item|
|
50
|
+
name = Plugin.find_by_id(item.plugin_id).plugin_name
|
51
|
+
count = Item.where(:plugin_id => item.plugin_id).count
|
52
|
+
|
53
|
+
text "#{count} - #{name} - #{item.plugin_id}"
|
54
|
+
end
|
55
|
+
|
56
|
+
#Provides nothing
|
57
|
+
#font_size(20) {
|
58
|
+
# fill_color "008000"
|
59
|
+
# text "Low Findings", :style => :bold
|
60
|
+
# fill_color "000000"
|
61
|
+
#}
|
62
|
+
#
|
63
|
+
#Item.low_risks_unique_sorted.each do |item|
|
64
|
+
# name = Plugin.find_by_id(item.plugin_id).plugin_name
|
65
|
+
# count = Item.where(:plugin_id => item.plugin_id).count
|
66
|
+
#
|
67
|
+
# text "#{count} - #{name}"
|
68
|
+
#end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
text Report.classification, :align => :center
|
2
|
+
text "\n"
|
3
|
+
|
4
|
+
font_size(24) { text Report.title, :align => :center }
|
5
|
+
font_size(18) {
|
6
|
+
text "This report was prepared by\n#{Report.author}", :align => :center
|
7
|
+
}
|
8
|
+
|
9
|
+
text "\n\n\n"
|
10
|
+
|
11
|
+
start_new_page
|
12
|
+
|
13
|
+
image Item.risks_by_severity_graph, :width => 500, :height => 375, :position => :center
|
14
|
+
|
15
|
+
start_new_page
|
16
|
+
|
17
|
+
image Item.risks_by_service_graph(10), :width => 500, :height => 375, :position => :center
|
18
|
+
|
19
|
+
start_new_page
|
20
|
+
|
21
|
+
image Plugin.top_by_count_graph(10), :width => 500, :height => 375, :position => :center
|
22
|
+
|
23
|
+
start_new_page
|
24
|
+
|
25
|
+
image Host.top_vuln_graph(10), :width => 500, :height => 375, :position => :center
|
26
|
+
|
27
|
+
start_new_page
|
28
|
+
|
29
|
+
image Host.other_os_graph, :width => 500, :height => 375, :position => :center
|
30
|
+
|
31
|
+
start_new_page
|
32
|
+
|
33
|
+
image Host.windows_os_graph, :width => 500, :height => 375, :position => :center
|
@@ -0,0 +1,40 @@
|
|
1
|
+
text Report.classification, :align => :center
|
2
|
+
text "\n"
|
3
|
+
|
4
|
+
font_size(22) { text Report.title, :align => :center }
|
5
|
+
font_size(18) {
|
6
|
+
text "Host Summary Report", :align => :center
|
7
|
+
text "\n"
|
8
|
+
text "This report was prepared by\n#{Report.author}", :align => :center
|
9
|
+
}
|
10
|
+
|
11
|
+
text "\n\n\n"
|
12
|
+
|
13
|
+
results = Array.new
|
14
|
+
|
15
|
+
headers = ["Hostname", "Total", "High", "Medium", "Low", "Info"]
|
16
|
+
header_widths = {0 => 137, 1 => 75, 2 => 75, 3 => 75, 4 => 75, 5 => 75}
|
17
|
+
|
18
|
+
Host.sorted.each do |host|
|
19
|
+
row = Array.new
|
20
|
+
|
21
|
+
total = Item.risks.where(:host_id => host.id).count
|
22
|
+
high = Item.high_risks.where(:host_id => host.id).count
|
23
|
+
medium = Item.medium_risks.where(:host_id => host.id).count
|
24
|
+
low = Item.low_risks.where(:host_id => host.id).count
|
25
|
+
info = Item.info_risks.where(:host_id => host.id).count
|
26
|
+
|
27
|
+
row.push(host.name)
|
28
|
+
row.push(total)
|
29
|
+
row.push(high)
|
30
|
+
row.push(medium)
|
31
|
+
row.push(low)
|
32
|
+
row.push(info)
|
33
|
+
|
34
|
+
results.push(row)
|
35
|
+
end
|
36
|
+
|
37
|
+
table([headers] + results, :header => true, :column_widths => header_widths, :row_colors => ['ffffff', 'E5E5E5']) do
|
38
|
+
row(0).style(:font_style => :bold, :background_color => 'D0D0D0')
|
39
|
+
cells.borders = [:top, :bottom, :left, :right]
|
40
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
text Report.classification, :align => :center
|
2
|
+
text "\n"
|
3
|
+
|
4
|
+
font_size(22) { text Report.title, :align => :center }
|
5
|
+
font_size(18) {
|
6
|
+
text "Missing Microsoft Patch Summary", :align => :center
|
7
|
+
text "\n"
|
8
|
+
text "This report was prepared by\n#{Report.author}", :align => :center
|
9
|
+
}
|
10
|
+
|
11
|
+
text "\n\n\n"
|
12
|
+
|
13
|
+
Item.ms_patches.each do |item|
|
14
|
+
host = Host.find_by_id(item.host_id)
|
15
|
+
|
16
|
+
if host == nil
|
17
|
+
next
|
18
|
+
end
|
19
|
+
|
20
|
+
if host.name != nil
|
21
|
+
text "Host:", :style => :bold
|
22
|
+
text host.name
|
23
|
+
end
|
24
|
+
|
25
|
+
if host.os != nil
|
26
|
+
text "OS:", :style => :bold
|
27
|
+
text host.os
|
28
|
+
end
|
29
|
+
|
30
|
+
if host.mac != nil
|
31
|
+
text "Mac:", :style => :bold
|
32
|
+
text host.mac
|
33
|
+
end
|
34
|
+
text "\n"
|
35
|
+
text item.plugin_output
|
36
|
+
text "\n"
|
37
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
text Report.classification, :align => :center
|
2
|
+
text "\n"
|
3
|
+
|
4
|
+
font_size(22) { text Report.title, :align => :center }
|
5
|
+
font_size(18) {
|
6
|
+
text "Microsoft Update Summary", :align => :center
|
7
|
+
text "\n"
|
8
|
+
text "This report was prepared by\n#{Report.author}", :align => :center
|
9
|
+
}
|
10
|
+
|
11
|
+
text "\n\n\n"
|
12
|
+
|
13
|
+
font_size(12)
|
14
|
+
|
15
|
+
results = Array.new
|
16
|
+
|
17
|
+
headers = ["Hostname","Operating System", "Windows Update Status"]
|
18
|
+
header_widths = {0 => 108, 1 => 264, 2 => 140}
|
19
|
+
|
20
|
+
Item.ms_update.each do |item|
|
21
|
+
host = Host.find_by_id(item.host_id)
|
22
|
+
|
23
|
+
if host == nil
|
24
|
+
next
|
25
|
+
end
|
26
|
+
|
27
|
+
row = Array.new
|
28
|
+
row.push(host.name)
|
29
|
+
row.push(host.os)
|
30
|
+
|
31
|
+
if item.plugin_output =~ /'Automatic Updates' are disabled/
|
32
|
+
row.push("Disabled")
|
33
|
+
else
|
34
|
+
row.push("Enabled")
|
35
|
+
end
|
36
|
+
|
37
|
+
results.push(row)
|
38
|
+
end
|
39
|
+
|
40
|
+
table([headers] + results, :header => true, :column_widths => header_widths, :row_colors => ['ffffff', '336699']) do
|
41
|
+
row(0).style(:font_style => :bold, :background_color => 'cccccc')
|
42
|
+
cells.borders = [:top, :bottom, :left, :right]
|
43
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
text Report.classification, :align => :center
|
2
|
+
text "\n"
|
3
|
+
|
4
|
+
font_size(22) { text Report.title, :align => :center }
|
5
|
+
font_size(18) {
|
6
|
+
text "PCI /DSS Complience Overview", :align => :center
|
7
|
+
text "\n"
|
8
|
+
text "This report was prepared by\n#{Report.author}", :align => :center
|
9
|
+
}
|
10
|
+
|
11
|
+
text "\n\n\n"
|
12
|
+
|
13
|
+
@hosts_count = Host.find(:all, :conditions => ["pci_dss_compliance is not null"]).count
|
14
|
+
@hosts_passed = Host.find(:all, :conditions => ["pci_dss_compliance like 'passed'"])
|
15
|
+
@hosts_failed = Host.find(:all, :conditions => ["pci_dss_compliance like 'failed'"])
|
16
|
+
|
17
|
+
font_size(20) {
|
18
|
+
text "Summary\n", :style => :bold
|
19
|
+
}
|
20
|
+
|
21
|
+
text "Of #{@hosts_count} total hosts, #{@hosts_passed.count} passed and #{@hosts_failed.count} failed."
|
22
|
+
|
23
|
+
text "\n\n"
|
24
|
+
|
25
|
+
if @hosts_passed.length > 0
|
26
|
+
font_size(20) {
|
27
|
+
fill_color "00FF00"
|
28
|
+
text "PCI / DSS Compliant Hosts", :style => :bold
|
29
|
+
fill_color "000000"
|
30
|
+
}
|
31
|
+
|
32
|
+
text "\n"
|
33
|
+
|
34
|
+
@hosts_passed.each do |host|
|
35
|
+
text "#{host.ip} / #{host.fqdn} - passed\n"
|
36
|
+
end unless @hosts_passed == nil
|
37
|
+
|
38
|
+
start_new_page
|
39
|
+
end
|
40
|
+
|
41
|
+
if @hosts_failed.length > 0
|
42
|
+
font_size(20) {
|
43
|
+
fill_color "FF0000"
|
44
|
+
text "Non PCI / DSS Compliant Hosts", :style => :bold
|
45
|
+
fill_color "000000"
|
46
|
+
}
|
47
|
+
|
48
|
+
text "\n"
|
49
|
+
|
50
|
+
@hosts_failed.each do |host|
|
51
|
+
host_id = host.id
|
52
|
+
plugin = Plugin.find(:first, :conditions => { :id => 33929 })
|
53
|
+
item = Item.find(:first, :conditions => { :host_id => host_id, :plugin_id => plugin.id })
|
54
|
+
|
55
|
+
text "#{host.ip} / #{host.fqdn} - failed\n", :style => :bold
|
56
|
+
text "Description:\n", :style => :bold
|
57
|
+
text "#{plugin.description}\n"
|
58
|
+
text "Plugin Output:\n", :style => :bold
|
59
|
+
text "#{item.plugin_output}\n"
|
60
|
+
|
61
|
+
text "\n"
|
62
|
+
|
63
|
+
end unless @hosts_failed == nil
|
64
|
+
|
65
|
+
start_new_page
|
66
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
text Report.classification, :align => :center
|
2
|
+
text "\n"
|
3
|
+
|
4
|
+
font_size(22) { text Report.title, :align => :center }
|
5
|
+
font_size(18) {
|
6
|
+
text "High and Medium Findings", :align => :center
|
7
|
+
text "\n"
|
8
|
+
text "This report was prepared by\n#{Report.author}", :align => :center
|
9
|
+
}
|
10
|
+
|
11
|
+
text "\n\n\n"
|
12
|
+
|
13
|
+
#@todo Revamping blacklisting in 1.3
|
14
|
+
#blacklist_ip = "-"
|
15
|
+
#blacklist_host_id = Host.where(:ip => blacklist_ip)
|
16
|
+
#.where("host_id != (?)", blacklist_host_id)
|
17
|
+
|
18
|
+
unique_risks = Array.new
|
19
|
+
unique_risks << Hash[:title => "High Findings", :color => "FF0000", :values => Item.high_risks_unique]
|
20
|
+
unique_risks << Hash[:title => "Medium Findings", :color => "FF8040", :values => Item.medium_risks_unique]
|
21
|
+
|
22
|
+
unique_risks.each do |h|
|
23
|
+
if h[:values].length > 1
|
24
|
+
font_size(20) {
|
25
|
+
fill_color h[:color]
|
26
|
+
text h[:title], :style => :bold
|
27
|
+
fill_color "000000"
|
28
|
+
}
|
29
|
+
|
30
|
+
text "\n"
|
31
|
+
|
32
|
+
h[:values].each do |f|
|
33
|
+
|
34
|
+
hosts = Item.where(:plugin_id => f.plugin_id)
|
35
|
+
plugin = Plugin.find_by_id(f.plugin_id)
|
36
|
+
|
37
|
+
#Check if vuln is just on the blacklisted
|
38
|
+
#if hosts.count == 1
|
39
|
+
# if hosts.first.host_id == blacklist_host_id.first.id
|
40
|
+
# next
|
41
|
+
# end
|
42
|
+
#end
|
43
|
+
|
44
|
+
|
45
|
+
references = Reference.where(:plugin_id => plugin.id).group(:value).order(:reference_name)
|
46
|
+
|
47
|
+
font_size(16) { text "#{plugin.plugin_name}\n" }
|
48
|
+
|
49
|
+
if hosts.length > 1
|
50
|
+
text "Hosts", :style => :bold
|
51
|
+
else
|
52
|
+
text "Host", :style => :bold
|
53
|
+
end
|
54
|
+
|
55
|
+
hostlist = Array.new
|
56
|
+
hosts.each do |host|
|
57
|
+
h = Host.find_by_id(host.host_id)
|
58
|
+
#if h.id != blacklist_host_id.first.id
|
59
|
+
hostlist << h.name
|
60
|
+
#end
|
61
|
+
end
|
62
|
+
|
63
|
+
text hostlist.join(', ')
|
64
|
+
|
65
|
+
if f.plugin_output != nil
|
66
|
+
text "\nPlugin output", :style => :bold
|
67
|
+
text f.plugin_output
|
68
|
+
end
|
69
|
+
|
70
|
+
if plugin.description != nil
|
71
|
+
text "\nDescription", :style => :bold
|
72
|
+
text plugin.description
|
73
|
+
end
|
74
|
+
|
75
|
+
if plugin.synopsis != nil
|
76
|
+
text "\nSynopsis", :style => :bold
|
77
|
+
text plugin.synopsis
|
78
|
+
end
|
79
|
+
|
80
|
+
if plugin.cvss_base_score != nil
|
81
|
+
text "\nCVSS Base Score", :style => :bold
|
82
|
+
text plugin.cvss_base_score
|
83
|
+
end
|
84
|
+
|
85
|
+
if plugin.exploit_available != nil
|
86
|
+
text "\nExploit Available", :style => :bold
|
87
|
+
|
88
|
+
if plugin.exploit_available == "true"
|
89
|
+
text "Yes"
|
90
|
+
else
|
91
|
+
text "No"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
if plugin.solution != nil
|
96
|
+
text "\nSolution", :style => :bold
|
97
|
+
text plugin.solution
|
98
|
+
end
|
99
|
+
|
100
|
+
if references.size != 0
|
101
|
+
text "\nReferences", :style => :bold
|
102
|
+
references.each { |ref|
|
103
|
+
ref_text = sprintf "%s: %s\n", ref.reference_name, ref.value
|
104
|
+
text ref_text
|
105
|
+
}
|
106
|
+
text "\nNessus Plugin", :style => :bold
|
107
|
+
text "http://www.tenablesecurity.com/plugins/index.php?view=single&id=#{f.plugin_id}"
|
108
|
+
end
|
109
|
+
text "\n"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
start_new_page unless h[:values] == nil
|
114
|
+
end
|
115
|
+
|
116
|
+
number_pages "<page> of <total>", :at => [bounds.right - 75, 0], :width => 150, :page_filter => :all
|