Random IRC quote :      <mrnobody1> si solo pudieses followear a una persona <mrnobody1> a quien pondrías, a Ggonzalez o a [censored] <matalaz> a mi

Macrorisión – Windows XP/2k3 0bay

Buenas noches,Kartoffel

Esta misma tarde leyendo con Rubén el blog de Symantec nos encontrábamos una entrada interesante.  Elia Florio nos avisaba sobre un nuevo 0day encontrado In The Wild, después de conjeturar un rato sobre la salida censurada de la captura de pantalla que se muestra en el blog, recaímos en una frase de Elia : «At the moment, it’s still not clear how the driver is used by Windows because this file does not have the typical Microsoft file properties present in other Windows system files». No son muchos los drivers que cumplen esta condición en una instalación de Windows normal, así que nos pusimos manos a la obra, después de un rato dimos con el siguiente código en el driver secdrv.sys, el cual pertenece a la proteccion SafeDisc propietaria de Macrovision y ha sido desarrollado por la misma empresa.

.text:00015E2C                 cmp     [ebp+var_10], 0CA002813h
.text:00015E33                 jz      short loc_15E69

Como podéis ver el código de la IOCTL nos indica que se está utilizando METHOD_NEITHER, en estos casos es necesario realizar una verificación de los parámetros recibidos ya que el I/O manager nos deja el asunto en nuestras manos y si no se tiene cuidado se pueden producir fallos graves.

En el driver no se realiza ninguna comprobación sobre el buffer de entrada, con lo cual sería posible sobreescribir memoria (incluso del kernel) siempre que cumpliera con ciertas condiciones que se esperan sobre este buffer (código de operacion, magics o similares), pero en este caso Macrorisión nos pone la cosa fácil escribiendo también en el buffer de salida :

.text:00015ED9                 call    dword ptr [eax+10h] ; Internal Dispatcher
.text:00015EDC                 mov     [ebp+var_1C], eax
.text:00015EDF                 cmp     [ebp+var_1C], 0Ah
.text:00015EE3                 jz      short loc_15EFC
.text:00015EE5                 mov     eax, [ebp+arg_4]
.text:00015EE8                 mov     dword ptr [eax], 0C0000001h
.text:00015EEE                 mov     eax, [ebp+arg_4]
.text:00015EF1                 and     dword ptr [eax+4], 0
.text:00015EF5                 mov     eax, 0C0000001h
.text:00015EFA                 jmp     short loc_15F21
.text:00015EFC ; —————————————————————————
.text:00015EFC
.text:00015EFC loc_15EFC:                              ; CODE XREF: sub_15E12+D1j
.text:00015EFC                 mov     ecx, [ebp+var_4]
.text:00015EFF                 mov     esi, [ebp+var_C]
.text:00015F02                 mov     eax, [ebp+arg_0]
.text:00015F05                 mov     edi, [eax+3Ch]  ; Output Buffer (Irp->UserBuffer)
.text:00015F08                 mov     eax, ecx
.text:00015F0A                 shr     ecx, 2
.text:00015F0D                 rep movsd  ; Inline memcpy
.text:00015F0F                 mov     ecx, eax
.text:00015F11                 and     ecx, 3
.text:00015F14                 rep movsb

Una vez visto esto y haciendo uso de Kartoffel Rubén programó un bonito exploit para la vaca que ríe.

A pesar de que no existe parche para la vulnerabilidad, publicamos esta información esperando que sea de ayuda para administradores e investigadores ya que se está explotando ITW. De cualquier manera el exploit únicamente demuestra la posibilidad de ejecución de código pero dudo que sea de utilidad para la scriptkiddería 🙂

Un saludo,

Mario

5 Comentarios para “Macrorisión – Windows XP/2k3 0bay”

  1. Comment por Nahuel | 10/18/07 at 5:46 pm

    La verdad los felicito a Ruben y a vos, no dejan de sorprenderme!. Y son los culpables de que a mi me gusten los drivers!.

    Saludos.

  2. Comment por Tora | 10/18/07 at 8:58 pm

    Yo es que soy muy corto, así que eso de «the typical Microsoft file properties» no me dice mucho. ¿Qué tienen los demás que no tenga secdrv.sys?

    ¿No será porque es negro, verdad? (Ali-G like)

    Saludos, cracks!

  3. Comment por Ruben | 10/18/07 at 9:50 pm

    Tora no es nada del otro mundo, botón derecho-> propiedades->PestañaVersion. Vamos que toda esa información está dentro de los recursos del propio fichero.Se puede sacar mediante API o como se le ocurrió a Mario para hacerlo rápidamente añadiendo a «detalles» en el explorer los campos adecuados y ordenando los ficheros por esos campos.

    Como dijo ese gran poeta: «R E S P E C T O!»

  4. Comment por 63546464 | 11/05/07 at 4:48 pm

    kl;l;

  5. Comment por alleandro | 05/31/12 at 4:40 pm

    La verdad los felicito a Ruben y a vos, no dejan de sorprenderme!. Y son los culpables de que a mi me gusten los drivers!

Se han cerrado los comentarios