Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rapid7
GitHub Repository: rapid7/metasploit-framework
Path: blob/master/spec/lib/metasploit/framework/login_scanner_spec.rb
19500 views
1
require 'spec_helper'
2
require 'metasploit/framework/login_scanner'
3
require 'metasploit/framework/login_scanner/http'
4
require 'metasploit/framework/login_scanner/smb'
5
require 'metasploit/framework/login_scanner/vnc'
6
7
RSpec.describe Metasploit::Framework::LoginScanner do
8
9
describe '.classes_for_service' do
10
subject { described_class.classes_for_service(service) }
11
let(:port) { nil }
12
let(:name) { nil }
13
14
let(:service) do
15
instance_double(Mdm::Service, port: port, name: name)
16
end
17
18
context "with name 'smb'" do
19
let(:name) { 'smb' }
20
21
it { is_expected.to include Metasploit::Framework::LoginScanner::SMB }
22
it { is_expected.not_to include Metasploit::Framework::LoginScanner::HTTP }
23
end
24
25
context "with port 445" do
26
let(:port) { 445 }
27
28
it { is_expected.to include Metasploit::Framework::LoginScanner::SMB }
29
it { is_expected.not_to include Metasploit::Framework::LoginScanner::HTTP }
30
it { is_expected.not_to include Metasploit::Framework::LoginScanner::VNC }
31
end
32
33
context "with name 'http'" do
34
let(:name) { 'http' }
35
36
it { is_expected.to include Metasploit::Framework::LoginScanner::HTTP }
37
it { is_expected.not_to include Metasploit::Framework::LoginScanner::SMB }
38
it { is_expected.not_to include Metasploit::Framework::LoginScanner::VNC }
39
end
40
41
[ 80, 8080, 8000, 443 ].each do |foo|
42
context "with port #{foo}" do
43
let(:port) { foo }
44
45
it { is_expected.to include Metasploit::Framework::LoginScanner::HTTP }
46
it { is_expected.to include Metasploit::Framework::LoginScanner::Axis2 }
47
it { is_expected.to include Metasploit::Framework::LoginScanner::Tomcat }
48
it { is_expected.not_to include Metasploit::Framework::LoginScanner::SMB }
49
end
50
end
51
end
52
53
describe '.all_http_classes' do
54
let(:http_classes) { described_class.all_http_classes }
55
56
it 'returns a populated array' do
57
expect(http_classes).to be_a Array
58
expect(http_classes).to_not be_empty
59
end
60
61
it 'includes HTTP classes' do
62
expect(http_classes).to include Metasploit::Framework::LoginScanner::TeamCity
63
expect(http_classes).to include Metasploit::Framework::LoginScanner::Ivanti
64
end
65
66
it 'does not include non-HTTP classes' do
67
# Base HTTP scanner should not be present
68
expect(http_classes).to_not include Metasploit::Framework::LoginScanner::HTTP
69
expect(http_classes).to_not include Metasploit::Framework::LoginScanner::SMB
70
expect(http_classes).to_not include Metasploit::Framework::LoginScanner::VNC
71
end
72
end
73
74
describe '.all_service_names' do
75
let(:service_names) { described_class.all_service_names }
76
77
it 'returns a set of service names' do
78
expect(service_names).to be_a Set
79
end
80
81
it 'returns a populated set' do
82
expect(service_names).to_not be_empty
83
end
84
85
it 'includes common services names' do
86
expect(service_names).to include 'http'
87
expect(service_names).to include 'https'
88
expect(service_names).to include 'smb'
89
end
90
91
it 'returns a list of valid services' do
92
all_scanners = service_names.flat_map do |service_name|
93
service = instance_double Mdm::Service, name: service_name, port: nil
94
classes = described_class.classes_for_service(service)
95
expect(classes).to_not be_empty
96
classes
97
end.uniq
98
expect(all_scanners).to_not be_empty
99
100
all_scanners.each do |scanner|
101
# Emulate how Pro will initialize the class by passing a single configuration hash argument
102
options = {
103
bruteforce_speed: 5,
104
host: '192.0.2.1',
105
port: 1234,
106
stop_on_success: true
107
}
108
aggregate_failures "#{scanner} is a valid scanner" do
109
expect(scanner.const_defined?(:PRIVATE_TYPES)).to be(true), "for #{scanner}"
110
expect(scanner.const_defined?(:LIKELY_SERVICE_NAMES)).to be(true), "for #{scanner}"
111
expect(scanner.const_defined?(:LIKELY_PORTS)).to be(true), "for #{scanner}"
112
if scanner.ancestors.include?(Metasploit::Framework::LoginScanner::HTTP) && scanner != Metasploit::Framework::LoginScanner::WinRM
113
expect(scanner::LIKELY_SERVICE_NAMES).to include('http', 'https'), "for #{scanner}"
114
expect(scanner::LIKELY_PORTS).to include(80, 443, 8000, 8080), "for #{scanner}"
115
end
116
expect { scanner.new(options) }.to_not raise_error, "for #{scanner}"
117
end
118
end
119
end
120
end
121
end
122
123