Path: blob/master/spec/lib/metasploit/framework/login_scanner_spec.rb
19500 views
require 'spec_helper'1require 'metasploit/framework/login_scanner'2require 'metasploit/framework/login_scanner/http'3require 'metasploit/framework/login_scanner/smb'4require 'metasploit/framework/login_scanner/vnc'56RSpec.describe Metasploit::Framework::LoginScanner do78describe '.classes_for_service' do9subject { described_class.classes_for_service(service) }10let(:port) { nil }11let(:name) { nil }1213let(:service) do14instance_double(Mdm::Service, port: port, name: name)15end1617context "with name 'smb'" do18let(:name) { 'smb' }1920it { is_expected.to include Metasploit::Framework::LoginScanner::SMB }21it { is_expected.not_to include Metasploit::Framework::LoginScanner::HTTP }22end2324context "with port 445" do25let(:port) { 445 }2627it { is_expected.to include Metasploit::Framework::LoginScanner::SMB }28it { is_expected.not_to include Metasploit::Framework::LoginScanner::HTTP }29it { is_expected.not_to include Metasploit::Framework::LoginScanner::VNC }30end3132context "with name 'http'" do33let(:name) { 'http' }3435it { is_expected.to include Metasploit::Framework::LoginScanner::HTTP }36it { is_expected.not_to include Metasploit::Framework::LoginScanner::SMB }37it { is_expected.not_to include Metasploit::Framework::LoginScanner::VNC }38end3940[ 80, 8080, 8000, 443 ].each do |foo|41context "with port #{foo}" do42let(:port) { foo }4344it { is_expected.to include Metasploit::Framework::LoginScanner::HTTP }45it { is_expected.to include Metasploit::Framework::LoginScanner::Axis2 }46it { is_expected.to include Metasploit::Framework::LoginScanner::Tomcat }47it { is_expected.not_to include Metasploit::Framework::LoginScanner::SMB }48end49end50end5152describe '.all_http_classes' do53let(:http_classes) { described_class.all_http_classes }5455it 'returns a populated array' do56expect(http_classes).to be_a Array57expect(http_classes).to_not be_empty58end5960it 'includes HTTP classes' do61expect(http_classes).to include Metasploit::Framework::LoginScanner::TeamCity62expect(http_classes).to include Metasploit::Framework::LoginScanner::Ivanti63end6465it 'does not include non-HTTP classes' do66# Base HTTP scanner should not be present67expect(http_classes).to_not include Metasploit::Framework::LoginScanner::HTTP68expect(http_classes).to_not include Metasploit::Framework::LoginScanner::SMB69expect(http_classes).to_not include Metasploit::Framework::LoginScanner::VNC70end71end7273describe '.all_service_names' do74let(:service_names) { described_class.all_service_names }7576it 'returns a set of service names' do77expect(service_names).to be_a Set78end7980it 'returns a populated set' do81expect(service_names).to_not be_empty82end8384it 'includes common services names' do85expect(service_names).to include 'http'86expect(service_names).to include 'https'87expect(service_names).to include 'smb'88end8990it 'returns a list of valid services' do91all_scanners = service_names.flat_map do |service_name|92service = instance_double Mdm::Service, name: service_name, port: nil93classes = described_class.classes_for_service(service)94expect(classes).to_not be_empty95classes96end.uniq97expect(all_scanners).to_not be_empty9899all_scanners.each do |scanner|100# Emulate how Pro will initialize the class by passing a single configuration hash argument101options = {102bruteforce_speed: 5,103host: '192.0.2.1',104port: 1234,105stop_on_success: true106}107aggregate_failures "#{scanner} is a valid scanner" do108expect(scanner.const_defined?(:PRIVATE_TYPES)).to be(true), "for #{scanner}"109expect(scanner.const_defined?(:LIKELY_SERVICE_NAMES)).to be(true), "for #{scanner}"110expect(scanner.const_defined?(:LIKELY_PORTS)).to be(true), "for #{scanner}"111if scanner.ancestors.include?(Metasploit::Framework::LoginScanner::HTTP) && scanner != Metasploit::Framework::LoginScanner::WinRM112expect(scanner::LIKELY_SERVICE_NAMES).to include('http', 'https'), "for #{scanner}"113expect(scanner::LIKELY_PORTS).to include(80, 443, 8000, 8080), "for #{scanner}"114end115expect { scanner.new(options) }.to_not raise_error, "for #{scanner}"116end117end118end119end120end121122123