Logo de NAUTOPIA y de la Comunidad Nautópata    NAUTOPIA: Privacidad, Seguridad y Libertades Civiles    Foro Local de TARRACO, Tarragona

 

ANILLO     CONTACTAR    CULTURALIA     DOWNLOADS    KIOSKO    FORO         HOME

 

                             Translate 

 

 

 

Desbordamiento de buffer local

en SHELL32.dll . Net monitor

 

Fecha

29-5-03

Versiones probadas

  • W2000 Server Sp3 Shell32.dll versión 5.0.3502.5436

Estatus del vendedor

Microsoft fue informado hace meses, pero como lo único que hacen es darme largas pidiéndome una y otra vez que les mande el archivo de prueba, he dedicido publicarlo.

 

Descripción

Net monitor es una herramienta para analizar el tráfico que se incluye con algunas versiones de windows. El programa permite analizar archivos de captura ( .cap ) además de capturar el tráfico. Si se abre un archivo de captura con un nombre de 252 bytes net monitor se cierra con una violación de acceso. El puntero de instrucción del programa es sobreescrito con el nombre del archivo convertido a UNICODE, por lo que la causa es una corrupción de variables adyacentes en la pila ( stack ).

Para poder ejecutar código mediante este fallo, se tiene que situar el código a ejecutar en una variable de entorno del sistema, esto lo situará en una dirección de memoria que puede ser referenciada por el valor que situemos en EIP en unicode ( ~00010040 ).

En concreto el crash se produce en esta función:

77E3A294 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
77E3A298 CD 2B INT 2B
77E3A29A C2 0400 RETN 4

Tras ejecutarse la interrupción 2B, el programa parece cambiar de stack y ESP salta hasta ~6bf88. El programa se cerrará debido a que la pila está corrupta. Esa zona de memoria es sobreescrita por la segunda llamada a MultiByteToWideChar en el módulo shell32.dll.

775C059B FF7424 10 PUSH DWORD PTR SS:[ESP+10]         ( Longitud del Wide buffer = 260 bytes )
775C059F 66:890E MOV WORD PTR DS:[ESI],CX
775C05A2 8A50 02 MOV DL,BYTE PTR DS:[EAX+2]
775C05A5 80E2 34 AND DL,34
775C05A8 80FA 34 CMP DL,34
775C05AB 0F84 8AA20400 JE SHELL32.7760A83B
775C05B1 56 PUSH ESI                                                     ( Puntero a Wide buffer )
775C05B2 83C0 0E ADD EAX,0E
775C05B5 6A FF PUSH -1
775C05B7 50 PUSH EAX                                                    ( filename )
775C05B8 51 PUSH ECX
775C05B9 51 PUSH ECX
775C05BA FF15 68185977 CALL DWORD PTR DS:[<&KERNEL32.MultiByteToWideChar>]

Creo que el fallo se encuentra en esta función, ya que al hacer la conversión a Unicode se dobla el número de bytes de la cadena, por lo que al tener el archivo 252 al pasarlo a unicode queda en 504 bytes .

Esta segunda llamada a MultiByteToWideChar se hace desde GetOpenFileNameW, que se encarga de abrir el diálogo para elegir el archivo a abrir y de rellenar la estructura OpenFileName con el nombre y path del archivo elegido. La llamada a GetOpenFileNameW se completa correctamente, el crash ocurre más tarde al ejecutar la interrupción 2b. Esta interrupción ignoro qué hace, según he encontrado en google es reservada de DOS y es equivalente a un RET.

NOTA: Cualquier apunte o correción será bienvenida, ya que yo sólo soy estudiante y esto no se enseña en las clases de la universidad :D

 

Exploit

NetMonitor.bat  ( ->  netmonitor.ace  -> netmonitor .zip )

Con este script se puede generar el archivo de captura con nombre largo que provocará el fallo al ser abierto por Net monitor.

 

 

Créditos

Esta vulnerabilidad fue descubierta por David F. Madrid, redactor de Nautopía.

 

 

-Vulnerabilidades-

 

 

 

 
 

NAUTOPIA © 2003. Reservados todos los derechos.