lunes, 14 de noviembre de 2011

Patch Bindiffing (I)

Todos sabemos, más que nada por lo mediáticos que son, lo que son las vulnerabilidades/exploits 0-day, que son vulnerabilidades descubiertas por alguien que no notifica al creador del producto, sino que utiliza el exploit para su propio provecho, o simplemente lo publica en full-disclosure, antes de que pueda prepararse un parche.

Otro tipo de exploits que podamos encontrar son los 1-day. La explotabilidad de los 1-day está muy estrechamente relacionada con la lentitud de algunas personas o entidades en aplicar los parches de seguridad. Una vez que el fabricante del producto saca un parche, aunque no proporcione mucha información acerca de la vulnerabilidad, dicho parche es analizado para obtener toda esa información, y de este modo poder tener un exploit funcional para dicha vulnerabilidad. Si esto se consigue en un día o en unos pocos días (de ahí su nombre), podemos decir casi con seguridad que habrá muchas potenciales víctimas que no tendrán parcheados sus sistemas.

Para ejemplificar esto, vamos a utilizar la vulnerabilidad MS-11-083, publicada por Microsoft la semana pasada y que, según parece, podría provocar ejecución remota de código mediante el envio de paquetes UDP en sistemas Windows 7 y Windows 2008.

Para poder hacer un Bindiffing, lo primero que tenemos que hacer es obtener dos binarios sobre los que hacer el diffing, ¿verdad? ¿cómo conseguimos esto? Siguiendo estos pasos:
  1. Instalamos un Windows 7 (en este caso) en una máquina virtual y lo actualizamos hasta que nos aparezca para actualizar el parche en cuestión que queremos analizar. Éste no lo instalamos.
  2. Nos descargamos e instalamos en la máquina el RegShot o alguna herramienta similar, que nos sirva para tomar snapshot fichero a fichero de todo el sistema.
  3. Hacemos un Snapshot completo de la máquina virtual.
  4. Lanzamos RegShot para hacer un Snapshot de todos los ficheros. Por comodidad, ya que sabemos que es un parche de sistema, le podemos decir que busque solo en C:\Windows, que siempre irá más rápido que hacer Snapshot de todo el disco. Elegimos la opción "shot and save" para que nos guarde el snapshot en un fichero, ya que este parche necesita reiniciar y sino perderemos el estado.


  5. Instalamos el parche. Nos pedirá que reiniciemos.
  6. Volvemos a lanzar RegShot, pero esta vez en la opción "1st shot" elegimos "load" y cargamos el snapshot que hicimos antes de reiniciar. Hacemos el segundo shot (2nd shot, shot) y cuando acabe pulsamos sobre "Compare" para que nos saque las diferencias.
En otro tipo de parches puede resultar mucho más inmediato ver los ficheros modificados, pero en este caso, con un reinicio de por medio, va a haber muchísimos registros y ficheros modificados. Veremos un montón de temporales del parche que acabamos de instalar, prefetchs, ficheros de logs, y un montón de registros, pero debemos pasar de toda esa "paja" e intentar ir a la sección de ficheros modificados y buscar aquellos que estén en un path que nos hagan ver que se trata de un fichero del sistema:

[...]
----------------------------------
Files [attributes?] modified:133
----------------------------------
[...]
C:\Windows\System32\drivers\tcpip.sys
C:\Windows\System32\LogFiles\Scm\729f4f57-2181-4edb-bb11-79c7914d10dc
C:\Windows\System32\LogFiles\Scm\9b75c702-ea13-406a-badb-6c588ee4375b
C:\Windows\System32\LogFiles\Scm\a1cfa52f-06f2-418d-addb-cd6456d66f43
C:\Windows\System32\LogFiles\Scm\a316e645-1c56-45a6-bd6a-7dca79778090
[...]


El resultado tiene sentido, vemos que ha modificado el driver tcpip.sys, que presumiblemente es el que contiene la vulnerabilidad. En este caso solo he podido apreciar un fichero (aunque hay gente por ahí que habla de dos, pero yo en Windows 7 solo he visto uno), así que lo que nos queda ahora por hacer es copiarlo fuera de la máquina virtual, y llamarlo tcpip-new.sys para diferenciarlo del original.


Para finalizar, restauramos el Snapshot de la máquina virtual al estado previo a la aplicación del parche que queremos analizar y buscamos estos mismos ficheros que hemos encontrado que han sido modificados, en este caso tcpip.sys, y lo copiamos de nuevo fuera de la máquina virtual, esta vez con el nombre tcpip-old.sys, para no confundirlo con el anterior.

Una vez hecho esto, ya tenemos la version anterior y posterior al parche de los ficheros modificados pero... ¿cómo sabemos ahora que cambios concretos se han hecho a cada fichero?

Lo veremos en el próximo post.

5 comentarios :

Adrián dijo...

Muy chulo ;)

Alguien dijo...

Noooo.. se acabó en la parte más interesante!!

Excelente, esperando la continuación...

Saludos.

Gabriel dijo...

Haber como sigue esto :D

Anónimo dijo...

Joder que termina en lo mejor...
Esperando como un loco la siguiente parte

Jose Selvi dijo...

El lunes a primera hora de la mañana tenéis la segunda parte ;)

Lamento haber tardado, pero me pilló fuera de la ciudad asistiendo a las SOURCE Conferences en Barcelona y me resultó imposible escribirlo antes.