Macrorisión – Windows XP/2k3 0bay
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: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: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