cms_scanner 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/finders/interesting_files/xml_rpc.rb +1 -3
- data/app/models.rb +1 -0
- data/app/models/interesting_file.rb +0 -4
- data/app/models/version.rb +17 -0
- data/app/views/cli/core/finished.erb +0 -1
- data/app/views/cli/interesting_files/findings.erb +1 -1
- data/cms_scanner.gemspec +2 -2
- data/lib/cms_scanner.rb +1 -0
- data/lib/cms_scanner/finders.rb +2 -0
- data/lib/cms_scanner/finders/finding.rb +4 -0
- data/lib/cms_scanner/finders/independent_finders.rb +1 -1
- data/lib/cms_scanner/finders/unique_finder.rb +17 -0
- data/lib/cms_scanner/finders/unique_finders.rb +39 -0
- data/lib/cms_scanner/target.rb +1 -0
- data/lib/cms_scanner/target/platform/wordpress.rb +2 -4
- data/lib/cms_scanner/target/platform/wordpress/custom_directories.rb +1 -2
- data/lib/cms_scanner/target/server/apache.rb +3 -2
- data/lib/cms_scanner/target/server/iis.rb +1 -2
- data/lib/cms_scanner/typhoeus/response.rb +9 -0
- data/lib/cms_scanner/version.rb +1 -1
- data/spec/app/controllers/core_spec.rb +0 -2
- data/spec/app/controllers/interesting_files_spec.rb +0 -2
- data/spec/app/finders/interesting_files/fantastico_fileslist_spec.rb +0 -2
- data/spec/app/finders/interesting_files/headers_spec.rb +0 -2
- data/spec/app/finders/interesting_files/robots_txt_spec.rb +0 -2
- data/spec/app/finders/interesting_files/search_replace_db_2_spec.rb +0 -2
- data/spec/app/finders/interesting_files/xml_rpc_spec.rb +0 -2
- data/spec/app/finders/interesting_files_spec.rb +1 -2
- data/spec/app/formatters/cli_no_colour_spec.rb +0 -2
- data/spec/app/formatters/cli_spec.rb +0 -2
- data/spec/app/formatters/json_spec.rb +0 -2
- data/spec/app/models/fantastico_fileslist_spec.rb +0 -1
- data/spec/app/models/headers_spec.rb +0 -1
- data/spec/app/models/interesting_file_spec.rb +0 -2
- data/spec/app/models/robots_txt_spec.rb +0 -1
- data/spec/app/models/version_spec.rb +23 -0
- data/spec/app/models/xml_rpc_spec.rb +0 -1
- data/spec/app/views_spec.rb +0 -2
- data/spec/dummy_finding.rb +21 -0
- data/spec/dummy_independent_finders.rb +25 -0
- data/spec/dummy_unique_finders.rb +32 -0
- data/spec/lib/browser_spec.rb +0 -1
- data/spec/lib/cache/file_store_spec.rb +0 -1
- data/spec/lib/cache/typhoeus_spec.rb +0 -2
- data/spec/lib/cms_scanner_spec.rb +0 -1
- data/spec/lib/controller_spec.rb +0 -2
- data/spec/lib/controllers_spec.rb +0 -2
- data/spec/lib/finders/findings_spec.rb +1 -3
- data/spec/lib/finders/independent_finders_spec.rb +4 -6
- data/spec/lib/finders/unique_finder_spec.rb +24 -0
- data/spec/lib/finders/unique_finders_spec.rb +133 -0
- data/spec/lib/formatter_spec.rb +0 -3
- data/spec/lib/target_spec.rb +0 -2
- data/spec/lib/web_site_spec.rb +0 -3
- data/spec/output/core/finished.cli_no_colour +0 -1
- data/spec/output/interesting_files/empty.cli_no_colour +1 -0
- data/spec/output/interesting_files/findings.cli_no_colour +1 -0
- data/spec/shared_examples/browser_actions.rb +0 -2
- data/spec/shared_examples/finding.rb +21 -1
- data/spec/shared_examples/formatter_buffer.rb +0 -2
- data/spec/shared_examples/independent_finder.rb +1 -3
- data/spec/shared_examples/target/platform/php.rb +0 -1
- data/spec/shared_examples/target/platform/wordpress.rb +0 -2
- data/spec/shared_examples/target/server/apache.rb +0 -1
- data/spec/shared_examples/target/server/generic.rb +0 -1
- data/spec/shared_examples/target/server/iis.rb +0 -1
- data/spec/shared_examples/views/core.rb +0 -1
- data/spec/shared_examples/views/interesting_files.rb +0 -1
- metadata +21 -7
- data/spec/dummy_finders.rb +0 -41
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe CMSScanner::InterestingFile do
|
4
|
-
|
5
4
|
it_behaves_like CMSScanner::Finders::Finding
|
6
5
|
|
7
6
|
subject(:file) { described_class.new(url, opts) }
|
@@ -47,5 +46,4 @@ describe CMSScanner::InterestingFile do
|
|
47
46
|
end
|
48
47
|
end
|
49
48
|
end
|
50
|
-
|
51
49
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CMSScanner::Version do
|
4
|
+
it_behaves_like CMSScanner::Finders::Finding
|
5
|
+
|
6
|
+
subject(:version) { described_class.new(number, opts) }
|
7
|
+
let(:opts) { {} }
|
8
|
+
let(:number) { '1.0' }
|
9
|
+
|
10
|
+
describe '#==' do
|
11
|
+
context 'when same @number' do
|
12
|
+
it 'returns true' do
|
13
|
+
expect(version == described_class.new(number)).to be true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when not the same @number' do
|
18
|
+
it 'returns false' do
|
19
|
+
expect(version == described_class.new('3.0')).to be false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/spec/app/views_spec.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'App::Views' do
|
4
|
-
|
5
4
|
let(:target_url) { 'http://ex.lo/' }
|
6
5
|
let(:fixtures) { File.join(SPECS, 'output') }
|
7
6
|
|
@@ -9,7 +8,6 @@ describe 'App::Views' do
|
|
9
8
|
# in the expected output.
|
10
9
|
[:JSON, :CliNoColour].each do |formatter|
|
11
10
|
context "when #{formatter}" do
|
12
|
-
|
13
11
|
it_behaves_like 'App::Views::Core'
|
14
12
|
it_behaves_like 'App::Views::InterestingFiles'
|
15
13
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module CMSScanner
|
2
|
+
# Dummy Finding
|
3
|
+
class DummyFinding
|
4
|
+
include Finders::Finding
|
5
|
+
|
6
|
+
attr_reader :r
|
7
|
+
|
8
|
+
def initialize(r, opts = {})
|
9
|
+
@r = r
|
10
|
+
parse_finding_options(opts)
|
11
|
+
end
|
12
|
+
|
13
|
+
def ==(other)
|
14
|
+
r == other.r
|
15
|
+
end
|
16
|
+
|
17
|
+
def eql?(other)
|
18
|
+
r == other.r && confidence == other.confidence && found_by == other.found_by
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'dummy_finding'
|
2
|
+
|
3
|
+
module CMSScanner
|
4
|
+
module Finders
|
5
|
+
module Independent
|
6
|
+
# Dummy Test Finder
|
7
|
+
class DummyFinder < Finder
|
8
|
+
def passive(_opts = {})
|
9
|
+
DummyFinding.new('test', found_by: found_by)
|
10
|
+
end
|
11
|
+
|
12
|
+
def aggressive(_opts = {})
|
13
|
+
DummyFinding.new('test', confidence: 100, found_by: 'override')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# No aggressive result finder
|
18
|
+
class NoAggressiveResult < Finder
|
19
|
+
def passive(_opts = {})
|
20
|
+
DummyFinding.new('spotted', confidence: 10, found_by: found_by)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'dummy_finding'
|
2
|
+
|
3
|
+
module CMSScanner
|
4
|
+
module Finders
|
5
|
+
module Unique
|
6
|
+
# Dummy Test Finder
|
7
|
+
class Dummy < Finder
|
8
|
+
def passive(_opts = {})
|
9
|
+
DummyFinding.new('v1', found_by: found_by)
|
10
|
+
end
|
11
|
+
|
12
|
+
def aggressive(_opts = {})
|
13
|
+
DummyFinding.new('v1', confidence: 100, found_by: 'override')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# No aggressive result
|
18
|
+
class NoAggressive < Finder
|
19
|
+
def passive(_opts = {})
|
20
|
+
DummyFinding.new('v2', confidence: 10, found_by: found_by)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Dummy2
|
25
|
+
class Dummy2 < Finder
|
26
|
+
def aggressive(_opts = {})
|
27
|
+
DummyFinding.new('v1', confidence: 90)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/spec/lib/browser_spec.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe CMSScanner::Cache::Typhoeus do
|
4
|
-
|
5
4
|
subject(:cache) { described_class.new(cache_dir) }
|
6
5
|
|
7
6
|
let(:cache_dir) { File.join(CACHE, 'typhoeus_cache') }
|
@@ -26,5 +25,4 @@ describe CMSScanner::Cache::Typhoeus do
|
|
26
25
|
cache.set(request, response)
|
27
26
|
end
|
28
27
|
end
|
29
|
-
|
30
28
|
end
|
data/spec/lib/controller_spec.rb
CHANGED
@@ -8,7 +8,6 @@ module CMSScanner
|
|
8
8
|
end
|
9
9
|
|
10
10
|
describe CMSScanner::Controllers do
|
11
|
-
|
12
11
|
subject(:controllers) { described_class.new }
|
13
12
|
let(:controller_mod) { CMSScanner::Controller }
|
14
13
|
|
@@ -46,5 +45,4 @@ describe CMSScanner::Controllers do
|
|
46
45
|
controllers.run
|
47
46
|
end
|
48
47
|
end
|
49
|
-
|
50
48
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require '
|
2
|
+
require 'dummy_finding'
|
3
3
|
|
4
4
|
describe CMSScanner::Finders::Findings do
|
5
|
-
|
6
5
|
subject(:findings) { described_class.new }
|
7
6
|
let(:dummy) { CMSScanner::DummyFinding }
|
8
7
|
|
@@ -45,5 +44,4 @@ describe CMSScanner::Finders::Findings do
|
|
45
44
|
@expected = %w(test1 test2)
|
46
45
|
end
|
47
46
|
end
|
48
|
-
|
49
47
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require '
|
2
|
+
require 'dummy_independent_finders'
|
3
3
|
|
4
4
|
describe CMSScanner::Finders::IndependentFinders do
|
5
|
-
|
6
5
|
subject(:finders) { described_class.new }
|
7
6
|
|
8
7
|
describe '#run' do
|
@@ -18,11 +17,11 @@ describe CMSScanner::Finders::IndependentFinders do
|
|
18
17
|
|
19
18
|
before do
|
20
19
|
finders <<
|
21
|
-
CMSScanner::Finders::DummyFinder.new(target) <<
|
22
|
-
CMSScanner::Finders::NoAggressiveResult.new(target)
|
20
|
+
CMSScanner::Finders::Independent::DummyFinder.new(target) <<
|
21
|
+
CMSScanner::Finders::Independent::NoAggressiveResult.new(target)
|
23
22
|
end
|
24
23
|
|
25
|
-
describe 'method
|
24
|
+
describe 'method calls order' do
|
26
25
|
after { finders.run(mode: mode) }
|
27
26
|
|
28
27
|
[:passive, :aggressive].each do |current_mode|
|
@@ -130,5 +129,4 @@ describe CMSScanner::Finders::IndependentFinders do
|
|
130
129
|
expect(finders.findings).to be_a CMSScanner::Finders::Findings
|
131
130
|
end
|
132
131
|
end
|
133
|
-
|
134
132
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module CMSScanner
|
4
|
+
module Finders
|
5
|
+
# Dummy Class to test the module
|
6
|
+
class VersionFinderSpec
|
7
|
+
include UniqueFinder
|
8
|
+
|
9
|
+
def initialize(_target)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe CMSScanner::Finders::VersionFinderSpec do
|
16
|
+
it_behaves_like CMSScanner::Finders::IndependentFinder do
|
17
|
+
let(:expected_finders) { [] }
|
18
|
+
let(:expected_finders_class) { CMSScanner::Finders::UniqueFinders }
|
19
|
+
end
|
20
|
+
|
21
|
+
subject(:version) { described_class.new(target) }
|
22
|
+
let(:target) { CMSScanner::Target.new(url) }
|
23
|
+
let(:url) { 'http://example.com/' }
|
24
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'dummy_unique_finders'
|
3
|
+
|
4
|
+
describe CMSScanner::Finders::UniqueFinders do
|
5
|
+
subject(:finders) { described_class.new }
|
6
|
+
|
7
|
+
describe '#run' do
|
8
|
+
let(:target) { 'target' }
|
9
|
+
let(:finding) { CMSScanner::DummyFinding }
|
10
|
+
let(:unique_finders) { CMSScanner::Finders::Unique }
|
11
|
+
let(:opts) { {} }
|
12
|
+
|
13
|
+
before do
|
14
|
+
finders <<
|
15
|
+
unique_finders::Dummy.new(target) <<
|
16
|
+
unique_finders::NoAggressive.new(target) <<
|
17
|
+
unique_finders::Dummy2.new(target)
|
18
|
+
end
|
19
|
+
|
20
|
+
after do
|
21
|
+
result = finders.run(opts)
|
22
|
+
|
23
|
+
expect(result).to be_a finding
|
24
|
+
expect(result).to eql @expected
|
25
|
+
end
|
26
|
+
|
27
|
+
# Used to be able to test the calls order and returned result at the same time
|
28
|
+
let(:dummy_passive) { unique_finders::Dummy.new(target).passive(opts) }
|
29
|
+
let(:dummy_aggresssive) { unique_finders::Dummy.new(target).aggressive(opts) }
|
30
|
+
let(:noaggressive) { unique_finders::NoAggressive.new(target).passive(opts) }
|
31
|
+
let(:dummy2_aggressive) { unique_finders::Dummy2.new(target).aggressive }
|
32
|
+
|
33
|
+
context 'when :confidence_threshold <= 0' do
|
34
|
+
let(:opts) { super().merge(confidence_threshold: 0) }
|
35
|
+
|
36
|
+
context 'when :mixed mode' do
|
37
|
+
let(:opts) { super().merge(mode: :mixed) }
|
38
|
+
|
39
|
+
it 'calls all #passive then #aggressive on finders and returns the best result' do
|
40
|
+
# Maybe there is a way to factorise this
|
41
|
+
expect(finders[0]).to receive(:passive).ordered.and_return(dummy_passive)
|
42
|
+
expect(finders[1]).to receive(:passive).ordered.and_return(noaggressive)
|
43
|
+
expect(finders[2]).to receive(:passive).ordered
|
44
|
+
expect(finders[0]).to receive(:aggressive).ordered.and_return(dummy_aggresssive)
|
45
|
+
expect(finders[1]).to receive(:aggressive).ordered
|
46
|
+
expect(finders[2]).to receive(:aggressive).ordered.and_return(dummy2_aggressive)
|
47
|
+
|
48
|
+
@expected = finding.new('v1', confidence: 100, found_by: 'Dummy (passive detection)')
|
49
|
+
@expected.confirmed_by << finding.new('v1', confidence: 100, found_by: 'override')
|
50
|
+
@expected.confirmed_by << finding.new('v1', confidence: 90)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when :passive mode' do
|
55
|
+
let(:opts) { super().merge(mode: :passive) }
|
56
|
+
|
57
|
+
it 'calls #passive on all finders and returns the best result' do
|
58
|
+
expect(finders[0]).to receive(:passive).ordered.and_return(dummy_passive)
|
59
|
+
expect(finders[1]).to receive(:passive).ordered.and_return(noaggressive)
|
60
|
+
expect(finders[2]).to receive(:passive).ordered
|
61
|
+
|
62
|
+
finders.each { |f| expect(f).to_not receive(:aggressive) }
|
63
|
+
|
64
|
+
@expected = finding.new('v2', confidence: 10,
|
65
|
+
found_by: 'NoAggressive (passive detection)')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when :aggressive mode' do
|
70
|
+
let(:opts) { super().merge(mode: :aggressive) }
|
71
|
+
|
72
|
+
it 'calls #aggressive on all finders and returns the best result' do
|
73
|
+
finders.each { |f| expect(f).to_not receive(:passive) }
|
74
|
+
|
75
|
+
expect(finders[0]).to receive(:aggressive).ordered.and_return(dummy_aggresssive)
|
76
|
+
expect(finders[1]).to receive(:aggressive).ordered
|
77
|
+
expect(finders[2]).to receive(:aggressive).ordered.and_return(dummy2_aggressive)
|
78
|
+
|
79
|
+
@expected = finding.new('v1', confidence: 100, found_by: 'override')
|
80
|
+
@expected.confirmed_by << finding.new('v1', confidence: 90)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'when :confidence_threshold = 100 (default)' do
|
86
|
+
context 'when :mixed mode' do
|
87
|
+
let(:opts) { super().merge(mode: :mixed) }
|
88
|
+
|
89
|
+
it 'calls all #passive then #aggressive methods on finders and returns the '\
|
90
|
+
'result which reaches 100% confidence during the process' do
|
91
|
+
expect(finders[0]).to receive(:passive).ordered.and_return(dummy_passive)
|
92
|
+
expect(finders[1]).to receive(:passive).ordered.and_return(noaggressive)
|
93
|
+
expect(finders[2]).to receive(:passive).ordered
|
94
|
+
expect(finders[0]).to receive(:aggressive).ordered.and_return(dummy_aggresssive)
|
95
|
+
expect(finders[1]).to_not receive(:aggressive)
|
96
|
+
expect(finders[2]).to_not receive(:aggressive)
|
97
|
+
|
98
|
+
@expected = finding.new('v1', confidence: 100, found_by: 'Dummy (passive detection)')
|
99
|
+
@expected.confirmed_by << finding.new('v1', confidence: 100, found_by: 'override')
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'when :passive mode' do
|
104
|
+
let(:opts) { super().merge(mode: :passive) }
|
105
|
+
|
106
|
+
it 'calls all #passive and returns the best result' do
|
107
|
+
expect(finders[0]).to receive(:passive).ordered.and_return(dummy_passive)
|
108
|
+
expect(finders[1]).to receive(:passive).ordered.and_return(noaggressive)
|
109
|
+
expect(finders[2]).to receive(:passive).ordered
|
110
|
+
|
111
|
+
finders.each { |f| expect(f).to_not receive(:aggressive) }
|
112
|
+
|
113
|
+
@expected = finding.new('v2', confidence: 10,
|
114
|
+
found_by: 'NoAggressive (passive detection)')
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'when :aggressive mode' do
|
119
|
+
let(:opts) { super().merge(mode: :aggressive) }
|
120
|
+
|
121
|
+
it 'calls all #aggressive and returns the result which reaches 100% confidence' do
|
122
|
+
finders.each { |f| expect(f).to_not receive(:passive) }
|
123
|
+
|
124
|
+
expect(finders[0]).to receive(:aggressive).ordered.and_return(dummy_aggresssive)
|
125
|
+
expect(finders[1]).to_not receive(:aggressive)
|
126
|
+
expect(finders[2]).to_not receive(:aggressive)
|
127
|
+
|
128
|
+
@expected = finding.new('v1', confidence: 100, found_by: 'override')
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|