dradis-nexpose 3.6.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 +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +3 -0
- data/CONTRIBUTING.md +3 -0
- data/Gemfile +19 -0
- data/LICENSE +339 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/dradis-nexpose.gemspec +35 -0
- data/lib/dradis-nexpose.rb +12 -0
- data/lib/dradis/plugins/nexpose.rb +11 -0
- data/lib/dradis/plugins/nexpose/engine.rb +9 -0
- data/lib/dradis/plugins/nexpose/field_processor.rb +89 -0
- data/lib/dradis/plugins/nexpose/formats/full.rb +152 -0
- data/lib/dradis/plugins/nexpose/formats/simple.rb +76 -0
- data/lib/dradis/plugins/nexpose/gem_version.rb +19 -0
- data/lib/dradis/plugins/nexpose/importer.rb +34 -0
- data/lib/dradis/plugins/nexpose/version.rb +13 -0
- data/lib/nexpose/endpoint.rb +81 -0
- data/lib/nexpose/node.rb +117 -0
- data/lib/nexpose/scan.rb +65 -0
- data/lib/nexpose/service.rb +101 -0
- data/lib/nexpose/vulnerability.rb +95 -0
- data/lib/tasks/thorfile.rb +26 -0
- data/spec/fixtures/files/full.xml +144 -0
- data/spec/fixtures/files/simple.xml +53 -0
- data/spec/nexpose_upload_spec.rb +154 -0
- data/spec/spec_helper.rb +13 -0
- data/templates/full_node.fields +8 -0
- data/templates/full_node.sample +65 -0
- data/templates/full_node.template +13 -0
- data/templates/full_scan.fields +5 -0
- data/templates/full_scan.sample +6 -0
- data/templates/full_scan.template +9 -0
- data/templates/full_service.fields +4 -0
- data/templates/full_service.sample +17 -0
- data/templates/full_service.template +11 -0
- data/templates/full_vulnerability.fields +13 -0
- data/templates/full_vulnerability.sample +59 -0
- data/templates/full_vulnerability.template +34 -0
- data/templates/simple_port.fields +2 -0
- data/templates/simple_port.sample +23 -0
- data/templates/simple_port.template +5 -0
- metadata +176 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<NeXposeSimpleXML version="1.0">
|
|
2
|
+
<generated>20111128T142609232</generated>
|
|
3
|
+
<devices>
|
|
4
|
+
<device address="1.1.1.1">
|
|
5
|
+
<fingerprint certainty="0.80">
|
|
6
|
+
<description>Linux 2.6.9-89.ELsmp</description>
|
|
7
|
+
<vendor>Linux</vendor>
|
|
8
|
+
<family>Linux</family>
|
|
9
|
+
<product>Linux</product>
|
|
10
|
+
<version>0.0.0</version>
|
|
11
|
+
<device-class></device-class>
|
|
12
|
+
<architecture>i686</architecture>
|
|
13
|
+
</fingerprint>
|
|
14
|
+
<vulnerabilities>
|
|
15
|
+
</vulnerabilities>
|
|
16
|
+
<services>
|
|
17
|
+
<service name="NTP" port="000" protocol="udp">
|
|
18
|
+
<fingerprint certainty="0.20">
|
|
19
|
+
<description>NTP 4.2</description>
|
|
20
|
+
<vendor></vendor>
|
|
21
|
+
<family>NTP</family>
|
|
22
|
+
<product>NTP</product>
|
|
23
|
+
<version>4.2</version>
|
|
24
|
+
</fingerprint>
|
|
25
|
+
<vulnerabilities>
|
|
26
|
+
<vulnerability id="ntpd-crypto" resultCode="VV">
|
|
27
|
+
<id type="cve">CVE-2009-1252</id>
|
|
28
|
+
<id type="bid">35017</id>
|
|
29
|
+
<id type="secunia">35137</id>
|
|
30
|
+
<id type="secunia">35138</id>
|
|
31
|
+
<id type="secunia">35166</id>
|
|
32
|
+
<id type="secunia">35169</id>
|
|
33
|
+
<id type="secunia">35243</id>
|
|
34
|
+
<id type="secunia">35253</id>
|
|
35
|
+
<id type="secunia">35308</id>
|
|
36
|
+
<id type="secunia">35336</id>
|
|
37
|
+
<id type="secunia">35388</id>
|
|
38
|
+
<id type="secunia">35416</id>
|
|
39
|
+
<id type="secunia">35630</id>
|
|
40
|
+
<id type="secunia">37470</id>
|
|
41
|
+
<id type="secunia">37471</id>
|
|
42
|
+
<id type="url">http://bugs.ntp.org/1151</id>
|
|
43
|
+
<id type="url">http://www.kb.cert.org/vuls/id/853097</id>
|
|
44
|
+
<id type="url">https://lists.ntp.org/pipermail/announce/2009-May/000062.html</id>
|
|
45
|
+
</vulnerability>
|
|
46
|
+
<vulnerability id="ntp-clock-radio, he cannot afford, wah wah wee wah" resultCode="VE">
|
|
47
|
+
</vulnerability>
|
|
48
|
+
</vulnerabilities>
|
|
49
|
+
</service>
|
|
50
|
+
</services>
|
|
51
|
+
</device>
|
|
52
|
+
</devices>
|
|
53
|
+
</NeXposeSimpleXML>
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'ostruct'
|
|
3
|
+
|
|
4
|
+
describe 'Nexpose upload plugin' do
|
|
5
|
+
before(:each) do
|
|
6
|
+
# Stub template service
|
|
7
|
+
templates_dir = File.expand_path('../../templates', __FILE__)
|
|
8
|
+
expect_any_instance_of(Dradis::Plugins::TemplateService)
|
|
9
|
+
.to receive(:default_templates_dir).and_return(templates_dir)
|
|
10
|
+
|
|
11
|
+
# Init services
|
|
12
|
+
plugin = Dradis::Plugins::Nexpose
|
|
13
|
+
|
|
14
|
+
@content_service = Dradis::Plugins::ContentService.new(plugin: plugin)
|
|
15
|
+
template_service = Dradis::Plugins::TemplateService.new(plugin: plugin)
|
|
16
|
+
|
|
17
|
+
@importer = plugin::Importer.new(
|
|
18
|
+
content_service: @content_service,
|
|
19
|
+
template_service: template_service
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
# Stub dradis-plugins methods
|
|
23
|
+
#
|
|
24
|
+
# They return their argument hashes as objects mimicking
|
|
25
|
+
# Nodes, Issues, etc
|
|
26
|
+
allow(@content_service).to receive(:create_node) do |args|
|
|
27
|
+
OpenStruct.new(args)
|
|
28
|
+
end
|
|
29
|
+
allow(@content_service).to receive(:create_note) do |args|
|
|
30
|
+
OpenStruct.new(args)
|
|
31
|
+
end
|
|
32
|
+
allow(@content_service).to receive(:create_issue) do |args|
|
|
33
|
+
OpenStruct.new(args)
|
|
34
|
+
end
|
|
35
|
+
allow(@content_service).to receive(:create_evidence) do |args|
|
|
36
|
+
OpenStruct.new(args)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe "Importer: Simple" do
|
|
41
|
+
it "creates nodes, issues, notes and an evidences as needed" do
|
|
42
|
+
|
|
43
|
+
expect(@content_service).to receive(:create_node).with(hash_including label: '1.1.1.1', type: :host).once
|
|
44
|
+
|
|
45
|
+
expect(@content_service).to receive(:create_note) do |args|
|
|
46
|
+
expect(args[:text]).to include("Host Description : Linux 2.6.9-89.ELsmp")
|
|
47
|
+
expect(args[:text]).to include("Scanner Fingerprint certainty : 0.80")
|
|
48
|
+
expect(args[:node].label).to eq("1.1.1.1")
|
|
49
|
+
end.once
|
|
50
|
+
|
|
51
|
+
expect(@content_service).to receive(:create_node) do |args|
|
|
52
|
+
expect(args[:label]).to eq('Generic Findings')
|
|
53
|
+
expect(args[:parent].label).to eq("1.1.1.1")
|
|
54
|
+
OpenStruct.new(args)
|
|
55
|
+
end.once
|
|
56
|
+
|
|
57
|
+
expect(@content_service).to receive(:create_node) do |args|
|
|
58
|
+
expect(args[:label]).to eq('udp-000')
|
|
59
|
+
expect(args[:parent].label).to eq("1.1.1.1")
|
|
60
|
+
OpenStruct.new(args)
|
|
61
|
+
end.once
|
|
62
|
+
|
|
63
|
+
expect(@content_service).to receive(:create_note) do |args|
|
|
64
|
+
expect(args[:text]).to include("#[Id]#\nntpd-crypto")
|
|
65
|
+
expect(args[:text]).to include("#[host]#\n1.1.1.1")
|
|
66
|
+
expect(args[:node].label).to eq("udp-000")
|
|
67
|
+
end.once
|
|
68
|
+
|
|
69
|
+
expect(@content_service).to receive(:create_note) do |args|
|
|
70
|
+
expect(args[:text]).to include("#[Id]#\nntp-clock-radio")
|
|
71
|
+
expect(args[:text]).to include("#[host]#\n1.1.1.1")
|
|
72
|
+
expect(args[:node].label).to eq("udp-000")
|
|
73
|
+
end.once
|
|
74
|
+
|
|
75
|
+
@importer.import(file: 'spec/fixtures/files/simple.xml')
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
describe "Importer: Full" do
|
|
80
|
+
it "creates nodes, issues, notes and an evidences as needed" do
|
|
81
|
+
|
|
82
|
+
expect(@content_service).to receive(:create_node).with(hash_including label: "Nexpose Scan Summary").once
|
|
83
|
+
expect(@content_service).to receive(:create_note) do |args|
|
|
84
|
+
expect(args[:text]).to include("#[Title]#\nUSDA_Internal (4)")
|
|
85
|
+
expect(args[:node].label).to eq("Nexpose Scan Summary")
|
|
86
|
+
end.once
|
|
87
|
+
|
|
88
|
+
expect(@content_service).to receive(:create_node).with(hash_including label: "1.1.1.1", type: :host).once
|
|
89
|
+
expect(@content_service).to receive(:create_note) do |args|
|
|
90
|
+
expect(args[:text]).to include("#[Host]#\n1.1.1.1")
|
|
91
|
+
expect(args[:node].label).to eq("1.1.1.1")
|
|
92
|
+
end.once
|
|
93
|
+
|
|
94
|
+
expect(@content_service).to receive(:create_node) do |args|
|
|
95
|
+
expect(args[:label]).to eq("123/udp (open)")
|
|
96
|
+
expect(args[:parent].label).to eq("1.1.1.1")
|
|
97
|
+
OpenStruct.new(args)
|
|
98
|
+
end.once
|
|
99
|
+
expect(@content_service).to receive(:create_note) do |args|
|
|
100
|
+
expect(args[:text]).to include("#[Title]#\nService name: NTP")
|
|
101
|
+
expect(args[:node].label).to eq("123/udp (open)")
|
|
102
|
+
end.once
|
|
103
|
+
|
|
104
|
+
expect(@content_service).to receive(:create_node) do |args|
|
|
105
|
+
expect(args[:label]).to eq("161/udp (open)")
|
|
106
|
+
expect(args[:parent].label).to eq("1.1.1.1")
|
|
107
|
+
OpenStruct.new(args)
|
|
108
|
+
end.once
|
|
109
|
+
expect(@content_service).to receive(:create_note) do |args|
|
|
110
|
+
expect(args[:text]).to include("#[Title]#\nService name: SNMP")
|
|
111
|
+
expect(args[:node].label).to eq("161/udp (open)")
|
|
112
|
+
end.once
|
|
113
|
+
|
|
114
|
+
expect(@content_service).to receive(:create_node).with(hash_including label: "Definitions").once
|
|
115
|
+
|
|
116
|
+
expect(@content_service).to receive(:create_issue) do |args|
|
|
117
|
+
expect(args[:text]).to include("#[Title]#\nApache HTTPD: error responses can expose cookies (CVE-2012-0053)")
|
|
118
|
+
expect(args[:id]).to eq("ntp-clock-variables-disclosure")
|
|
119
|
+
OpenStruct.new(args)
|
|
120
|
+
end.once
|
|
121
|
+
|
|
122
|
+
expect(@content_service).to receive(:create_issue) do |args|
|
|
123
|
+
expect(args[:text]).to include("#[Title]#\nApache HTTPD: ETag Inode Information Leakage (CVE-2003-1418)")
|
|
124
|
+
expect(args[:id]).to eq("ntp-clock-variables-disclosure")
|
|
125
|
+
OpenStruct.new(args)
|
|
126
|
+
end.once
|
|
127
|
+
|
|
128
|
+
expect(@content_service).to receive(:create_node).with(hash_including label: "1.1.1.1", type: :host).once
|
|
129
|
+
|
|
130
|
+
expect(@content_service).to receive(:create_evidence) do |args|
|
|
131
|
+
expect(args[:content]).to include("n/a")
|
|
132
|
+
expect(args[:issue].id).to eq("ntp-clock-variables-disclosure")
|
|
133
|
+
expect(args[:node].label).to eq("1.1.1.1")
|
|
134
|
+
end.once
|
|
135
|
+
|
|
136
|
+
@importer.import(file: 'spec/fixtures/files/full.xml')
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Regression test for github.com/dradis/dradis-nexpose/issues/1
|
|
140
|
+
it "populates solutions regardless they are wrapped in paragraphs or lists" do
|
|
141
|
+
expect(@content_service).to receive(:create_issue) do |args|
|
|
142
|
+
expect(args[:text]).to include("#[Solution]#\nApache HTTPD >= 2.0 and < 2.0.65")
|
|
143
|
+
OpenStruct.new(args)
|
|
144
|
+
end.once
|
|
145
|
+
|
|
146
|
+
expect(@content_service).to receive(:create_issue) do |args|
|
|
147
|
+
expect(args[:text]).to include("#[Solution]#\nYou can remove inode information from the ETag header")
|
|
148
|
+
OpenStruct.new(args)
|
|
149
|
+
end.once
|
|
150
|
+
|
|
151
|
+
@importer.import(file: 'spec/fixtures/files/full.xml')
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
require 'nokogiri'
|
|
4
|
+
|
|
5
|
+
require 'combustion'
|
|
6
|
+
|
|
7
|
+
Combustion.initialize!
|
|
8
|
+
|
|
9
|
+
RSpec.configure do |config|
|
|
10
|
+
# Filter which specs to run
|
|
11
|
+
config.filter_run :focus => true
|
|
12
|
+
config.run_all_when_everything_filtered = true
|
|
13
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<node
|
|
2
|
+
address="10.0.0.1"
|
|
3
|
+
status="alive"
|
|
4
|
+
device-id="211"
|
|
5
|
+
hardware-address="00:de:ad:be:ef:00">
|
|
6
|
+
|
|
7
|
+
<names>
|
|
8
|
+
<name>iPad.local</name>
|
|
9
|
+
<name>Ted's iPad</name>
|
|
10
|
+
</names>
|
|
11
|
+
|
|
12
|
+
<fingerprints>
|
|
13
|
+
<os
|
|
14
|
+
certainty="1.00"
|
|
15
|
+
device-class="Server"
|
|
16
|
+
vendor="Microsoft"
|
|
17
|
+
family="Windows"
|
|
18
|
+
product="Windows Server 2003, Standard Edition"
|
|
19
|
+
version="SP2"
|
|
20
|
+
arch="x86_64"/>
|
|
21
|
+
|
|
22
|
+
<os
|
|
23
|
+
certainty="0.85"
|
|
24
|
+
device-class="General"
|
|
25
|
+
vendor="Microsoft"
|
|
26
|
+
family="Windows"
|
|
27
|
+
product="Windows Server 2003"
|
|
28
|
+
version="SP2"/>
|
|
29
|
+
</fingerprints>
|
|
30
|
+
|
|
31
|
+
<software>
|
|
32
|
+
<fingerprint
|
|
33
|
+
certainty="1.00"
|
|
34
|
+
software-class="General"
|
|
35
|
+
vendor="Sun"
|
|
36
|
+
family="Java"
|
|
37
|
+
product="JRE"
|
|
38
|
+
version="1.6.0.22"/>
|
|
39
|
+
|
|
40
|
+
<fingerprint
|
|
41
|
+
certainty="1.00"
|
|
42
|
+
software-class="General"
|
|
43
|
+
vendor="Sun"
|
|
44
|
+
family="Java"
|
|
45
|
+
product="JRE"
|
|
46
|
+
version="1.6.0.24"/>
|
|
47
|
+
</software>
|
|
48
|
+
|
|
49
|
+
<tests>
|
|
50
|
+
<test status="not-vulnerable" id="cifs-generic-0001">
|
|
51
|
+
<Paragraph>
|
|
52
|
+
<Paragraph>Running vulnerable CIFS service.</Paragraph>
|
|
53
|
+
Was not able to authenticate to the CIFS service with no credentials.
|
|
54
|
+
</Paragraph>
|
|
55
|
+
</test>
|
|
56
|
+
|
|
57
|
+
<test status="vulnerable" id="cifs-generic-0001">
|
|
58
|
+
<Paragraph>
|
|
59
|
+
<Paragraph>Something vulnerable or bad.</Paragraph>
|
|
60
|
+
Stuff
|
|
61
|
+
</Paragraph>
|
|
62
|
+
</test>
|
|
63
|
+
</tests>
|
|
64
|
+
<endpoints/>
|
|
65
|
+
</node>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<service name="CIFS Name Service">
|
|
2
|
+
<fingerprints>
|
|
3
|
+
<fingerprint certainty="1.00" product="Windows Server 2003 R2 5.2"/>
|
|
4
|
+
</fingerprints>
|
|
5
|
+
|
|
6
|
+
<configuration>
|
|
7
|
+
<config name="advertised-name-1">DC1 (Computer Name)</config>
|
|
8
|
+
<config name="advertised-name-2">localdomain (Domain Name)</config>
|
|
9
|
+
<config name="advertised-name-3">xxxxx (File Server Service)</config>
|
|
10
|
+
<config name="advertised-name-4">TOR (Browser Service Elections)</config>
|
|
11
|
+
<config name="advertised-name-count">4</config>
|
|
12
|
+
<config name="mac-address">00:de:ad:be:ef:00</config>
|
|
13
|
+
</configuration>
|
|
14
|
+
|
|
15
|
+
<tests>
|
|
16
|
+
</tests>
|
|
17
|
+
</service>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
vulnerability.added
|
|
2
|
+
vulnerability.cvss_score
|
|
3
|
+
vulnerability.cvss_vector
|
|
4
|
+
vulnerability.description
|
|
5
|
+
vulnerability.modified
|
|
6
|
+
vulnerability.nexpose_id
|
|
7
|
+
vulnerability.pci_severity
|
|
8
|
+
vulnerability.published
|
|
9
|
+
vulnerability.references
|
|
10
|
+
vulnerability.severity
|
|
11
|
+
vulnerability.solution
|
|
12
|
+
vulnerability.tags
|
|
13
|
+
vulnerability.title
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<vulnerability
|
|
2
|
+
id="CIFS-GENERIC-0001"
|
|
3
|
+
title="No password on CIFS Administrator account"
|
|
4
|
+
severity="8"
|
|
5
|
+
pciSeverity="5"
|
|
6
|
+
cvssScore="7.5"
|
|
7
|
+
cvssVector="(AV:N/AC:L/Au:N/C:P/I:P/A:P)"
|
|
8
|
+
published="19970101T000000000"
|
|
9
|
+
added="20041101T000000000"
|
|
10
|
+
modified="20111117T000000000">
|
|
11
|
+
|
|
12
|
+
<description>
|
|
13
|
+
<ContainerBlockElement>
|
|
14
|
+
<Paragraph>
|
|
15
|
+
Windows systems come with an administration account, "Administrator" in the default
|
|
16
|
+
installation. Furthermore, a Unix system administrator may choose the username "Administrator"
|
|
17
|
+
when configuring SAMBA. A common password used for this account is "" (no password). It is best
|
|
18
|
+
practice to remove default accounts, if possible. For accounts required by the system,
|
|
19
|
+
the default password should be changed.
|
|
20
|
+
</Paragraph>
|
|
21
|
+
|
|
22
|
+
<Paragraph>
|
|
23
|
+
This account grants full access to the system, making it most critical to secure.
|
|
24
|
+
</Paragraph>
|
|
25
|
+
</ContainerBlockElement>
|
|
26
|
+
</description>
|
|
27
|
+
|
|
28
|
+
<references>
|
|
29
|
+
<reference source="CVE">CVE-1999-0504</reference>
|
|
30
|
+
<reference source="CVE">CVE-1999-0506</reference>
|
|
31
|
+
<reference source="SANS-04">W5</reference>
|
|
32
|
+
</references>
|
|
33
|
+
|
|
34
|
+
<tags>
|
|
35
|
+
<tag>CIFS/SMB/NetBIOS</tag>
|
|
36
|
+
<tag>Default Account</tag>
|
|
37
|
+
<tag>Samba</tag>
|
|
38
|
+
<tag>UNIX</tag>
|
|
39
|
+
<tag>Windows</tag>
|
|
40
|
+
</tags>
|
|
41
|
+
|
|
42
|
+
<solution>
|
|
43
|
+
<ContainerBlockElement>
|
|
44
|
+
<Paragraph>
|
|
45
|
+
Choose a better password for the administrator account. A good
|
|
46
|
+
password should consist of a mix of lower- and upper-case characters,
|
|
47
|
+
numbers, and punctuation and should be at least 8 characters long.
|
|
48
|
+
</Paragraph>
|
|
49
|
+
|
|
50
|
+
<Paragraph>
|
|
51
|
+
In addition, the default account name of "Administrator" should be
|
|
52
|
+
changed to something less obvious. This will make simple brute force attempts
|
|
53
|
+
harder, as the malicious user must use other means to find the account name.
|
|
54
|
+
In all cases, the password should be changed to a well thought out (hard
|
|
55
|
+
to crack) value.
|
|
56
|
+
</Paragraph>
|
|
57
|
+
</ContainerBlockElement>
|
|
58
|
+
</solution>
|
|
59
|
+
</vulnerability>
|