Español | English
rss facebook linkedin Twitter

Mebroot Parte II: SCSI vs Object callbacks.

En el articulo anterior veíamos como el Mebroot había parcheado el sistema para evitar ser detectado intentado leer CLASSPNP!ClassReadWrite. Ahora le toca mover ficha a los anti-rookits.

Hasta este momento de la evolución del mebroot la forma habitual de leer a bajo nivel el MBR era lanzar una IRP a la dirección de CLASSPNP!ClassReadWrite:

mov edi, pdevice_object;
mov esi, irp;
push esi;
push edi;
mov eax, addr_ClassReadWrite;
call eax;


Llegados a este punto, esto no es posible ya que addr_ClassReadWrite esta oculta por el rootkit. Las herramientas de seguridad ya no podían trabajar a nivel de disk.sys había que trabaja a más bajo nivel si querían leer el contenido original del MBR y verificar la detección del malware.

La solución aportada fue trabajar a nivel de scsi:

La figura muestra el orden en que llegan las peticiones de lectura de disco a los diferentes drivers, de modo que si las herramientas anti-rootkits envían peticiones al driver de scsi, los hooks puestos en disk.sys no afectarán a la petición de lectura de disco y podremos hacer una lectura correcta.

El problema esta en hacer llegar esta petición de lectura( IRP ) a scsi. La forma utilizada fue hacer llegar la IRP a scsi.sys a través de MJ_INTERNAL_DEVICE_CONTROL de disk.sys. Vemos que en la solución aportada todavía hay una ligera dependencia de disk.sys.

Nueva detección y nuevo sample a escena! Esta versión del Mebroot nada tenía que ver con las anteriores en la forma de ocultarse en el sistema. Si anteriormente el método utilizado para ocultar el contenido del MBR era hookear la dispatch routine de los drivers, ahora el método evoluciona. El mebroot utiliza Object callbacks para ocultarse en el sistema. Esta técnica fue comentada por Skywing y Skape en Uninformed 8.

Para poder entender que son y como funcionan los objetos en Windows una lectura recomendada es Windows 2000 Object Management.

Este nuevo sample crea un nuevo _OBJECT_TYPE_ en Device\Harddisk0\DR0 de disk.sys y hookea la función ParseProcedure en la cabecera del objeto ( estructura _object_header ). Para comprobar que se ha creado un objeto nuevo, comprobamos antes de la infección que los dos devices de disk.sys son del mismo tipo, es decir, su _OBJECT_TYPE está descrito en la misma dirección de memoria. Sin embargo una vez que una máquina es infectada volvemos a comprobar la dirección de memoria del campo OBJECT_TYPE y comprobamos que se ha creado un nuevo objeto.

+0x008 Type             : 0x81689e70   _OBJECT_TYPE -->Nuevo Object type

.......

+0x038 DeleteProcedure : 0x805a0004 void nt!IopDeleteDevice+0
+0x03c ParseProcedure : 0x81305c20 long +ffffffff81305c20--> Hook
+0x040 SecurityProcedure : 0x8059ba70 long nt!IopGetSetSecurityObject+0


El objetivo de poner estos hooks en los objetos es hacer llegar al malware todos los intentos de lectura de disco, en este caso cuando se crea un handle de Device\Harddisk0\DR0 que es un device de disk.sys( vemos que sigue dependiendo de este driver ). De este modo si se crea un handle de Device\Harddisk0\DR0 el malware pone un hook en la dispatch routine de scsi.sys que evalúa( igual que el la versión anterior) las peticiones de leer el MBR de la máquina. Una vez cerrado el dispositivo( se cierra el handle ) el mebroot quita este hook de la dispatch routine y sigue invisible en la máquina.

En resumen, el modo utilizado para ocultarse lo sigue haciendo en las dispatch routine, pero en este caso en el driver scsi.sys, que está en un nivel de profundidad mayor que disk.sys. Como novedad aporta que el hook es "dinámico", por ponerle un nombre, solo lo pone cuando detecta que se van hacer lecturas de disco. La capacidad de que este hook se ponga y se quite cuando se produzcan lecturas de disco se debe a la manipulación de los objectos comentada en Device\Harddisk0\DR0 de disk.sys.

Una técnica muy limpia y hasta ese momento efectiva...

Alonso Candado Sánchez
S21Sec e-crime

1 comentario:

Dreg dijo...

como molan estos posts!


(+34 902 222 521)


24 horas / 7 días a la semana



© Copyright S21sec 2013 - Todos los derechos reservados


login