Path: blob/master/lib/metasploit/framework/key_collection.rb
27899 views
module Metasploit::Framework1class KeyCollection < Metasploit::Framework::CredentialCollection2attr_accessor :key_data3attr_accessor :key_path4attr_accessor :private_key5attr_accessor :error_list6attr_accessor :ssh_keyfile_b6478# Override CredentialCollection#has_privates?9def has_privates?10@key_data.present?11end1213def realm14nil15end1617def valid?18@error_list = []19@key_data = Set.new2021if @private_key.present?22results = validate_private_key(@private_key)23elsif @key_path.present?24results = validate_key_path(@key_path)25else26@error_list << 'No key path or key provided'27raise RuntimeError, 'No key path or key provided'28end2930if results[:key_data].present?31@key_data.merge(results[:key_data])32else33@error_list.concat(results[:error_list]) if results[:error_list].present?34end3536@key_data.present?37end3839def validate_private_key(private_key)40key_data = Set.new41error_list = []42begin43if Net::SSH::KeyFactory.load_data_private_key(private_key, @password, false).present?44key_data << private_key45end46rescue StandardError => e47error_list << "Error validating private key: #{e}"48end49{key_data: key_data, error_list: error_list}50end5152def validate_key_path(key_path)53key_data = Set.new54error_list = []5556if File.file?(key_path)57key_files = [key_path]58elsif File.directory?(key_path)59key_files = Dir.entries(key_path).reject { |f| f =~ /^\x2e|\x2epub$/ }.map { |f| File.join(key_path, f) }60else61return {key_data: nil, error: "#{key_path} Invalid key path"}62end6364key_files.each do |f|65begin66if read_key(f).present?67key_data << File.read(f)68end69rescue StandardError => e70error_list << "#{f}: #{e}"71end72end73{key_data: key_data, error_list: error_list}74end757677def each78prepended_creds.each { |c| yield c }7980if @user_file.present?81File.open(@user_file, 'rb') do |user_fd|82user_fd.each_line do |user_from_file|83user_from_file.chomp!84each_key do |key_data|85yield Metasploit::Framework::Credential.new(public: user_from_file, private: key_data, realm: realm, private_type: :ssh_key)86end87end88end89end9091if @username.present?92each_key do |key_data|93yield Metasploit::Framework::Credential.new(public: @username, private: key_data, realm: realm, private_type: :ssh_key)94end95end96end9798def each_key99@key_data.each do |data|100yield data101end102end103104def read_key(file_path)105@cache ||= {}106@cache[file_path] ||= Net::SSH::KeyFactory.load_private_key(file_path, password, false)107@cache[file_path]108end109end110end111112113