nessana 0.1.0 → 0.2.0
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/lib/nessana/version.rb +1 -1
- metadata +7 -36
- data/bin/nessana_old +0 -145
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ee396ef7c7de91a411465ca7cd27f2dd2ec0ae3ada00d65f2d7fd93bcf7231d1
|
|
4
|
+
data.tar.gz: f53065e4cd980ea6ea2da9127a87bede09ceaca1a7607df7f53323b4d090aa73
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 68b6913aa147d06ef5e1336fd8f694f148e2f67e58cf28b1e1e3690d7761fadbcb0addcd94fa21eafd4f7bbf4bd27f8047702451e65f434d59a66141d2b604ba
|
|
7
|
+
data.tar.gz: 0bcab82e1682510938fcaf5a69a4d3cffe2beba1af660c8417d81540dd464512dcaeaee0bf57d8e3918aba060f240a9e9c686fb190d82961ce1b9ff2cf94d808
|
data/lib/nessana/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: nessana
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kristofer Rye <kristofer.rye@gmail.com>
|
|
@@ -10,20 +10,6 @@ bindir: bin
|
|
|
10
10
|
cert_chain: []
|
|
11
11
|
date: 2019-01-22 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: asana
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - "~>"
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0.6.3
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - "~>"
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: 0.6.3
|
|
27
13
|
- !ruby/object:Gem::Dependency
|
|
28
14
|
name: fastcsv
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -58,14 +44,14 @@ dependencies:
|
|
|
58
44
|
requirements:
|
|
59
45
|
- - "~>"
|
|
60
46
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 0.
|
|
47
|
+
version: 0.9.0
|
|
62
48
|
type: :runtime
|
|
63
49
|
prerelease: false
|
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
51
|
requirements:
|
|
66
52
|
- - "~>"
|
|
67
53
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: 0.
|
|
54
|
+
version: 0.9.0
|
|
69
55
|
- !ruby/object:Gem::Dependency
|
|
70
56
|
name: codecov
|
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -80,20 +66,6 @@ dependencies:
|
|
|
80
66
|
- - "~>"
|
|
81
67
|
- !ruby/object:Gem::Version
|
|
82
68
|
version: 0.1.14
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: coveralls
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - "~>"
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: 0.8.22
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - "~>"
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: 0.8.22
|
|
97
69
|
- !ruby/object:Gem::Dependency
|
|
98
70
|
name: guard
|
|
99
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -128,14 +100,14 @@ dependencies:
|
|
|
128
100
|
requirements:
|
|
129
101
|
- - "~>"
|
|
130
102
|
- !ruby/object:Gem::Version
|
|
131
|
-
version: 0.
|
|
103
|
+
version: 0.12.2
|
|
132
104
|
type: :development
|
|
133
105
|
prerelease: false
|
|
134
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
135
107
|
requirements:
|
|
136
108
|
- - "~>"
|
|
137
109
|
- !ruby/object:Gem::Version
|
|
138
|
-
version: 0.
|
|
110
|
+
version: 0.12.2
|
|
139
111
|
- !ruby/object:Gem::Dependency
|
|
140
112
|
name: rspec
|
|
141
113
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -206,7 +178,7 @@ dependencies:
|
|
|
206
178
|
- - "~>"
|
|
207
179
|
- !ruby/object:Gem::Version
|
|
208
180
|
version: 0.16.1
|
|
209
|
-
description: 'A Nessus dump parser and differ
|
|
181
|
+
description: 'A fast Nessus dump parser and differ.
|
|
210
182
|
|
|
211
183
|
'
|
|
212
184
|
email:
|
|
@@ -217,7 +189,6 @@ extra_rdoc_files: []
|
|
|
217
189
|
files:
|
|
218
190
|
- README.md
|
|
219
191
|
- bin/nessana
|
|
220
|
-
- bin/nessana_old
|
|
221
192
|
- lib/nessana.rb
|
|
222
193
|
- lib/nessana/detection.rb
|
|
223
194
|
- lib/nessana/dump.rb
|
|
@@ -248,5 +219,5 @@ requirements: []
|
|
|
248
219
|
rubygems_version: 3.0.2
|
|
249
220
|
signing_key:
|
|
250
221
|
specification_version: 4
|
|
251
|
-
summary: A Nessus dump parser and
|
|
222
|
+
summary: A Nessus dump parser and differ
|
|
252
223
|
test_files: []
|
data/bin/nessana_old
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
require 'asana'
|
|
4
|
-
require 'csv'
|
|
5
|
-
require 'json'
|
|
6
|
-
require 'logger'
|
|
7
|
-
require 'pp'
|
|
8
|
-
require 'pry'
|
|
9
|
-
require 'ruby-prof'
|
|
10
|
-
require 'ruby-prof-flamegraph'
|
|
11
|
-
require 'yaml'
|
|
12
|
-
|
|
13
|
-
require 'nessana/vulnerability'
|
|
14
|
-
require 'nessana/vulnerability_list'
|
|
15
|
-
|
|
16
|
-
result = RubyProf.profile do
|
|
17
|
-
|
|
18
|
-
$logger = Logger.new(STDOUT)
|
|
19
|
-
$logger.level = Logger::DEBUG
|
|
20
|
-
|
|
21
|
-
$file_contents = open('secrets.yml', 'rb') do |io|
|
|
22
|
-
io.read
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
$asana_access_token = YAML.load($file_contents)['ASANA_PAT']
|
|
26
|
-
|
|
27
|
-
$client = Asana::Client.new do |c|
|
|
28
|
-
c.authentication :access_token, $asana_access_token
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
workspace = $client.workspaces.find_all.select do |workspace|
|
|
32
|
-
workspace.name == 'stolaf.org'
|
|
33
|
-
end.first
|
|
34
|
-
|
|
35
|
-
project = $client.projects.find_all(workspace: workspace.id).select do |project|
|
|
36
|
-
project.name == '[Sys] Security'
|
|
37
|
-
end.first
|
|
38
|
-
|
|
39
|
-
tag = $client.tags.find_all(workspace: workspace.id).select do |tag|
|
|
40
|
-
tag.name == 'Automated [Nessana]'
|
|
41
|
-
end.first
|
|
42
|
-
|
|
43
|
-
pp project.sections
|
|
44
|
-
|
|
45
|
-
tasks = $client.tasks.find_by_tag(tag: tag.id).map do |flat_task|
|
|
46
|
-
$logger.debug "Fetching task with id=#{flat_task.id}"
|
|
47
|
-
$client.tasks.find_by_id(flat_task.id).to_h
|
|
48
|
-
end.select do |task_hash|
|
|
49
|
-
!task_hash["completed"]
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
pp tasks
|
|
53
|
-
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
printer = RubyProf::FlameGraphPrinter.new(result)
|
|
57
|
-
printer.print(STDERR, {})
|
|
58
|
-
|
|
59
|
-
__END__
|
|
60
|
-
|
|
61
|
-
output = nil
|
|
62
|
-
|
|
63
|
-
result = RubyProf.profile do
|
|
64
|
-
vulnerabilities = VulnerabilityList.from_csv(ARGV[0])
|
|
65
|
-
|
|
66
|
-
$vulnerabilities = vulnerabilities.filter_risks.filter_not_accessible
|
|
67
|
-
|
|
68
|
-
# vuln_plugin_mapping = $vulnerabilities.each_with_object({}) do |vuln, hash|
|
|
69
|
-
# cve_string = vuln.cve ? " (#{vuln.cve})" : ""
|
|
70
|
-
# puts "Adding entry for #{vuln.plugin_id}#{cve_string} on host #{vuln.host}:#{vuln.port} (#{vuln.protocol})"
|
|
71
|
-
# hash[vuln.plugin_id] ||= []
|
|
72
|
-
# hash[vuln.plugin_id].push vuln
|
|
73
|
-
# end
|
|
74
|
-
|
|
75
|
-
vulns_by_plugin = $vulnerabilities.each_with_object({}) do |vuln, hash|
|
|
76
|
-
hash[vuln.plugin_id] ||= []
|
|
77
|
-
hash[vuln.plugin_id] << vuln
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
reports = vulns_by_plugin.map do |plugin_id, vulns|
|
|
81
|
-
uniqued_titles = vulns.map do |vuln|
|
|
82
|
-
vuln.name
|
|
83
|
-
end.uniq
|
|
84
|
-
|
|
85
|
-
uniqued_cves = vulns.map do |vuln|
|
|
86
|
-
vuln.cve
|
|
87
|
-
end.uniq
|
|
88
|
-
|
|
89
|
-
uniqued_cvsss = vulns.map do |vuln|
|
|
90
|
-
vuln.cvss
|
|
91
|
-
end.uniq
|
|
92
|
-
|
|
93
|
-
uniqued_risks = vulns.map do |vuln|
|
|
94
|
-
vuln.risk
|
|
95
|
-
end.uniq
|
|
96
|
-
|
|
97
|
-
throw "Plugin #{plugin_id} produced #{uniqued_titles.count} != 1 unique titles!" unless uniqued_titles.count == 1
|
|
98
|
-
throw "Plugin #{plugin_id} produced #{uniqued_cvsss.count} != 1 unique CVSS's!" unless uniqued_cvsss.count == 1
|
|
99
|
-
throw "Plugin #{plugin_id} produced #{uniqued_risks.count} != 1 unique risks!" unless uniqued_risks.count == 1
|
|
100
|
-
|
|
101
|
-
uniqued_hosts = vulns.map do |vuln|
|
|
102
|
-
vuln.readable_host
|
|
103
|
-
end.uniq
|
|
104
|
-
|
|
105
|
-
uniqued_synopses = vulns.map do |vuln|
|
|
106
|
-
vuln.synopsis
|
|
107
|
-
end.uniq
|
|
108
|
-
|
|
109
|
-
throw "More than one unique synopsis given?" unless uniqued_synopses.count == 1
|
|
110
|
-
|
|
111
|
-
uniqued_descriptions = vulns.map do |vuln|
|
|
112
|
-
vuln.description
|
|
113
|
-
end.uniq
|
|
114
|
-
|
|
115
|
-
throw "More than one unique description given?" unless uniqued_descriptions.count == 1
|
|
116
|
-
|
|
117
|
-
uniqued_solutions = vulns.map do |vuln|
|
|
118
|
-
vuln.solution
|
|
119
|
-
end.uniq
|
|
120
|
-
|
|
121
|
-
throw "More than one unique solution given?" unless uniqued_solutions.count == 1
|
|
122
|
-
|
|
123
|
-
{
|
|
124
|
-
cvss: uniqued_cvsss.first,
|
|
125
|
-
title: "[Nessus #{plugin_id}] #{uniqued_titles.join(', ')}",
|
|
126
|
-
body: "CVE: #{uniqued_cves.first || 'N/A'}\nCVSS: #{uniqued_cvsss.first || 'N/A'}\nRisk: #{uniqued_risks.first || 'N/A'}\n\nSYNOPSIS\n\n#{uniqued_synopses.first}\n\nDESCRIPTION\n\n#{uniqued_descriptions.first.join("\n\n")}\n\nSOLUTION\n\n#{uniqued_solutions.first.join("\n\n")}\n\nThis issue was detected on #{uniqued_hosts.count} hosts: #{uniqued_hosts.join(', ')}",
|
|
127
|
-
hosts: uniqued_hosts
|
|
128
|
-
}
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
output = reports.sort do |report_a, report_b|
|
|
132
|
-
report_b[:cvss] <=> report_a[:cvss]
|
|
133
|
-
end.map do |report|
|
|
134
|
-
[report[:title], report[:body]]
|
|
135
|
-
end.to_a
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
printer = RubyProf::GraphPrinter.new(result)
|
|
139
|
-
printer.print(STDOUT, {})
|
|
140
|
-
|
|
141
|
-
CSV.open(ARGV[1], 'wb') do |csv|
|
|
142
|
-
output.each do |row|
|
|
143
|
-
csv << row
|
|
144
|
-
end
|
|
145
|
-
end
|