Path: blob/master/modules/auxiliary/scanner/ivanti/ivanti_login.rb
27905 views
require 'metasploit/framework/credential_collection'1require 'metasploit/framework/login_scanner/ivanti_login'23class MetasploitModule < Msf::Auxiliary45include Msf::Exploit::Remote::HttpClient6include Msf::Auxiliary::AuthBrute7include Msf::Auxiliary::Report8include Msf::Auxiliary::Scanner9include Msf::Auxiliary::ReportSummary1011include Msf::Exploit::Deprecated12moved_from 'auxiliary/scanner/ivanti/login_scanner'1314def initialize(info = {})15super(16update_info(17info,18'Name' => 'Ivanti Connect Secure HTTP Scanner',19'Description' => %q{20This module will perform authentication scanning against Ivanti Connect Secure.21},22'Author' => ['msutovsky-r7'],23'License' => MSF_LICENSE,24'DefaultOptions' => {25'RPORT' => 443,26'SSL' => true27},28'Notes' => {29'Stability' => [CRASH_SAFE],30'Reliability' => [],31'SideEffects' => [IOC_IN_LOGS, ACCOUNT_LOCKOUTS]32}33)34)35register_options([36OptBool.new('ADMIN', [true, 'Select whether to target the admin login endpoint', false])37])38end3940def get_scanner(ip)41cred_collection = Metasploit::Framework::CredentialCollection.new(42blank_passwords: datastore['BLANK_PASSWORDS'],43pass_file: datastore['PASS_FILE'],44password: datastore['PASSWORD'],45user_file: datastore['USER_FILE'],46userpass_file: datastore['USERPASS_FILE'],47username: datastore['USERNAME'],48user_as_pass: datastore['USER_AS_PASS']49)50configuration = configure_http_login_scanner(51host: ip,52port: datastore['RPORT'],53cred_details: cred_collection,54stop_on_success: datastore['STOP_ON_SUCCESS'],55bruteforce_speed: datastore['BRUTEFORCE_SPEED'],56connection_timeout: datastore['HttpClientTimeout'] || 5,57use_admin_endpoint: datastore['ADMIN']58)59return Metasploit::Framework::LoginScanner::Ivanti.new(configuration)60end6162def process_credential(credential_data)63credential_combo = "#{credential_data[:username]}:#{credential_data[:private_data]}"64case credential_data[:status]65when Metasploit::Model::Login::Status::SUCCESSFUL66print_good "#{credential_data[:address]}:#{credential_data[:port]} - Login Successful: #{credential_combo}"67credential_data[:core] = create_credential(credential_data)68create_credential_login(credential_data)69return { status: :success, credential: credential_data }70else71error_msg = "#{credential_data[:address]}:#{credential_data[:port]} - LOGIN FAILED: #{credential_combo} (#{credential_data[:status]})"72vprint_error error_msg73invalidate_login(credential_data)74return { status: :fail, credential: credential_data }75end76end7778def run_scanner(scanner)79scanner.scan! do |result|80credential_data = result.to_h81credential_data.merge!(module_fullname: fullname, workspace_id: myworkspace_id)82process_credential(credential_data)83end84end8586def run_host(ip)87scanner = get_scanner(ip)88run_scanner(scanner)89end9091end929394