martes, 17 de noviembre de 2009

Registro de Windows, svchost y malware

Toda esta historia comenzó hace un par de días, en una de las visitas rutinarias de mantenimiento a empresas que realizo como técnico informático. Configurando la copia de seguridad para el fichero pst, utilizado como almacén del correo electrónico por MS Outlook, me disponía a modificar el comportamiento predeterminado del explorador de Windows para que me mostrase los ficheros ocultos, y hete aquí que saltó la alarma.

A pesar de haber marcado el botón de radio correspondiente los ficheros ocultos no aparecían, y al regresar a comprobar la configuración el botón seguía como si nada hubiera pasado, es decir, aparecía marcado "No mostrar archivos y carpetas ocultos". Este comportamiento suele estar asociado a la acción de malware, constituyendo una forma burda de ocultación. La configuración de estos parámetros se realiza a nivel del registro de Windows, concretamente en la siguiente clave:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden

En su interior existe una subclave, SHOWALL, cuyo valor CheckedValue debería ser de tipo DWORD, pero que en este caso aparecía como alfanumérico. Así que la solución es simple, eliminar el valor anterior y crear uno nuevo, de tipo DWORD e igual a 1, pero claro, asegurándonos antes que el malware no esté en ejecución, sino volverá a realizar la modificación en cuanto detecte su corrección. Sabiendo lo anterior descargo y lanzo gmer, comprobando en la pestaña Processes que no haya ningún proceso oculto (aparecería resaltado en rojo) o que me resulte extraño.

Una vez confirmado modifico el registro quedando resuelto ese punto, máxime cuando ya me tocó eliminar manualmente el dichoso virus denominado genéricamente como INF/Autorun; pero debí olvidar solucionar el estropicio del registro. Lo que si no olvidé fué aplicar todas las actualizaciones de Windows XP disponibles hasta esa fecha, asegurarme que no había ningún elemento malicioso más e instalar, previo registro, el antivirus NOD32.

Por si las moscas lanzo nuevamente gmer y me encuentro otra sorpresa, en la pestaña Rootkit/Malware aparecen 4 servicios ocultos:


Reviso el log de NOD32 y advierto que hace unos días se detectó y eliminó la dll maliciosa cargada por los servicios anteriores y que se correspondía con una variante del infame Conficker:


Así que el virus fué eliminado pero no así los servicios creados para garantizar su ejecución, que son los que aparecen detectados por gmer. Elimino manualmente los servicios y confirmo nuevamente que el PC está limpio, al menos aparentemente. Como suelo hacer en estos casos recomiendo modificar todas las contraseñas utilizadas desde ese PC para acceder a cualquier servicio y que se planteen la posibilidad de reinstalar completamente el equipo, por si las moscas. Me dicen que lo pensarán y, finalizada la visita, me marcho tan contento.

Pero como soy de natural inquieto al llegar a casa me pongo a investigar sobre svchost y el porqué resulta idoneo como blanco de todo tipo de malware; éste es el resultado de mis pesquisas.

Los servicios en Windows

Se denomina así a todos aquellos procesos que pueden o no iniciarse de forma automática durante el arranque del equipo sin la necesidad de que sean lanzados de forma interactiva por un usuario, utilizando el API de Windows para interactuar con el sistema. El Service Control Manager (SCM), constituido por el proceso %SystemRoot%\system32\services.exe, sería el encargado de lanzar los servicios así configurados, accediendo para ello a la base de datos que mantiene en el registro de Windows, en concreto dentro de la clave:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

En su interior encontraremos subclaves para cada uno de los servicios que han sido registrados en el sistema mediante una llamada a la función CreateService, implementada en la dll Advapi32.dll. Como curiosidad, podemos utilizar el programa DLL Export Viewer de NirSoft para ver las funciones exportadas por una dll concreta.

Dentro de cada subclave, y por consiguiente para cada servicio, se indican valores que se corresponden con las características particulares para ese servicio. Así, por ejemplo, los drivers incluyen un valor Group que permite agruparlos en base a sus funciones. Un ejemplo para el controlador de la unidad de disquete, fdc:
ErrorControl REG_DWORD     0x00000001

Group REG_SZ System Bus Extender
Start REG_DWORD 0x00000003
Tag REG_DWORD 0x00000005
Type REG_DWORD 0x00000001
SetupDone REG_DWORD 0x00000001
DisplayName REG_SZ Controlador de la unidad de disquete
ImagePath REG_EXPAND_SZ system32\DRIVERS\fdc.sys

Ahora un ejemplo para un servicio asociado a un ejecutable concreto, en este caso para el adaptador de rendimiento de WMI:
Type             REG_DWORD     0x00000010

Start REG_DWORD 0x00000003
ErrorControl REG_DWORD 0x00000001
ImagePath REG_EXPAND_SZ C:\WINDOWS\system32\wbem\wmiapsrv.exe
DisplayName REG_SZ Adaptador de rendimiento de WMI
DependOnService REG_MULTI_SZ RPCSS
DependOnGroup REG_MULTI_SZ
ObjectName REG_SZ LocalSystem
Description REG_SZ Proporciona información de la biblioteca
de rendimiento desde los proveedores HiPerf
de WMI.

El parámetro Start determina el tipo de inicio para el servicio, y los valores posibles son:
SERVICE_BOOT_START(0)

SERVICE_SYSTEM_START(1)
SERVICE_AUTO_START(2)
SERVICE_DEMAND_START(3)
SERVICE_DISABLED(4)

Los números indicados entre paréntesis están en formato decimal, por lo que será preciso convertir el valor Start de la clave del registro para identificar el tipo de arranque del servicio. El primer tipo de inicio provoca la carga del driver en memoria durante el arranque; el segundo provoca la carga del driver durante la inicialización del kernel, justo después de que se hayan cargado los anteriores. Los dos siguientes tipos de inicio ya son gestionados por el SCM, siendo automático el primero y bajo demanda el segundo. El último indica que el servicio está deshabilitado.

El parámetro Type será el que permita distinguir el tipo de servicio del que se trata, valga la redundancia, y por lo tanto será un valor presente para todos ellos. Los diferentes tipos existentes y vigentes en la actualidad son:
SERVICE_KERNEL_DRIVER(1)

SERVICE_FILE_SYSTEM_DRIVER(2)
SERVICE_RECOGNIZER_DRIVER(8)
SERVICE_WIN32_OWN_PROCESS(16)
SERVICE_WIN32_SHARE_PROCESS(32)

Como antes, los números indicados entre paréntesis están en formato decimal. Los tres primeros que aparecen en la lista anterior se corresponderían con drivers de dispositivo, quedando los 2 últimos para los servicios puros y, por lo tanto gestionados por el SCM, siendo ambos valores mútuamente excluyentes. Para los servicios lanzados dentro del proceso svchost el tipo sería SERVICE_WIN32_SHARE_PROCESS.

SvcHost

La mayoría de servicios se ejecutan dentro de un proceso propio, pero otros comparten un mismo proceso, con el consecuente ahorro de recursos. El proceso genérico conocido como Service Host (SvcHost) contiene múltiples servicios, pudiéndose ejecutar múltiples instancias de este proceso, y ésta es la razón de que aparezca repetido dentro de la lista mostrada por el Administrador de Tareas. En concreto, y tal como menciona Harlan Carvey, se ejecuta dos o más veces en Windows 2000, 5 o más veces en Windows XP y 7 o más veces bajo Windows 2003.

Las diferentes instancias de svchost se corresponden con las diferentes agrupaciones de servicios, las cuales pueden consultarse en otra rama del registro existente a tal efecto:
HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Svchost

Dentro de esta clave encontraremos múltiples valores correspondiendo cada uno de ellos a un grupo. El contenido de este valor, definido como una cadena REG_MULTI_SZ, contiene una lista con todos los servicios pertenecientes a dicho grupo. Las agrupaciones estándar para un sistema Windows XP son:
HTTPFilter

LocalService
NetworkService
netsvcs
DcomLaunch
rpcss
imgsvc
termsvcs

Y, como ejemplo, los servicios contenidos dentro del grupo LocalService serian:
Alerter

WebClient
LmHosts
RemoteRegistry
upnphost
SSDPSRV

Estos servicios se implementan como dlls e incluyen un valor ImagePath, igual para todos los miembros del grupo, con el comando svchost de inicialización:
HKLM\SYSTEM\CurrentControlSet\Services\Alerter

 
ImagePath: %SystemRoot%\system32\svchost.exe -k LocalService

y deberían incluir un valor ServiceDll dentro de una subclave Parameters:
HKLM\SYSTEM\CurrentControlSet\Services\Alerter\Parameters

 
ServiceDll: %SystemRoot%\system32\alrsvc.dll

Pero como una imagen vale más que mil palabras vamos a ver los servicios que se ejecutan dentro de un proceso svchost en un sistema Windows XP en ejecución. Primero utilizaremos el comando integrado tasklist:


El siguiente programa que vamos a utilizar es tlist.exe, disponible con las Microsoft Debugging Tools:


Por último el más completo de todos, y por lo tanto, el que más información nos vá a brindar, Process Explorer. Una vez ejecutado obtendremos en el panel superior el árbol de procesos ejecutándose en el sistema. Si seleccionamos cualquiera de las instancias de svchost, botón derecho Properties, obtendremos en la pestaña Image la línea de comandos utilizada para lanzar el proceso (valor ImagePath):


Por ultimo, en la pestaña Services, obtendremos los diferentes servicios que forman parte del grupo, asi como las dll que se corresponden con cada uno de ellos (valores ServiceDll):


Eliminando servicios ejecutados por svchost

Ahora ya conocemos más o menos el funcionamiento de los servicios ejecutados mediante SvcHost, como éstos se implementan mediante dlls y como corren bajo el mismo proceso, compartiendo, por ende, los mismos recursos accesibles desde cualquier elemento del grupo. Llega el momento de aprender a eliminarlos manualmente.

El primer paso será detener el servicio a eliminar siempre que el sistema objetivo se encuentre en ejecución. Una vez detenido accederemos al registro, y allí lo encontraremos dentro de la clave Services. Por ejemplo, para el caso que inició todos mis devaneos las rutas concretas serían:
HKLM\SYSTEM\CurrentControlSet\Services\gjmpdyvhn

HKLM\SYSTEM\CurrentControlSet\Services\jwowfer
HKLM\SYSTEM\CurrentControlSet\Services\prgcghjwh
HKLM\SYSTEM\CurrentControlSet\Services\ymmoljyli

Pero antes ubicaremos el grupo SvcHost al que pertenecen, indicado como ya sabemos como parámetro en el valor ImagePath de cada uno de ellos. En este caso, y habitualmente, el grupo que buscamos será netsvcs. Tambien será conveniente anotar la ruta de la dll que implementa el servicio para eliminarla manualmente en el caso de que no lo haya hecho ya nuestro antivirus; ya sabemos que dicho valor estará dentro de la subclave Parameters y como contenido del valor ServiceDll.

Llega el momento de eliminar las claves mencionadas, pero antes tendremos que modificar los permisos de cada una de ellas: botón derecho sobre la clave, Permisos, y allí agregaremos el grupo Todos asignándole Control total sobre la clave:


Una vez eliminadas las claves que cuelgan de Services iremos a los grupos definidos en SvcHost, en concreto al grupo netsvcs que es al que pertenecen, y allí eliminaremos las entradas para los anteriores servicios de la lista que compone el grupo. Ya casi lo tenemos, queda un último paso.

Algunos tipos determinados de malware tambien agregan entradas dentro de la siguiente clave del registro:
HKLM\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_GJMPDYVHN

HKLM\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_JWOWFER
HKLM\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_PRGCGHJWH
HKLM\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_YMMOLJYLI

por lo que será preciso eliminarlas también, asignando antes los permisos adecuados para poder llevar a cabo el proceso.

Conclusión: ahora ya sabemos un sitio más donde podremos encontrar rastros de malware, y la forma en que éste se garantiza su ejecución automática en cada inicio del sistema; el ejemplo más conocido lo tenemos en el gusano Conficker.

Bibliografía

Windows Internals, Fifth Edition
Mark E. Rusinovich, David Solomon and Alex Ionescu
Microsoft Press

Enlaces relacionados

How Malware hides and is installed as a service on Windows NT/XP/2000/2003

How to determine what services are running under a SVCHOST.EXE process

Descripción de Svchost.exe en Windows 2000

Descripción de Svchost.exe en Windows XP Professional Edition

Y esto ha sido todo, en breve más, y mejor, espero.

5 comentarios:

Delfi dijo...

Un articulo fantástico! Muchas grácias Neofito.

Saludos

neofito dijo...

Muchas gracias, me alegro de que te haya gustado :)

Saludos

Anónimo dijo...

Buenas, me gusta tu blog, por el contenido de los artículos y porque, en mi opinión, explicas bien. Así que gracias por la información.
Un saludo

neofito dijo...

Gracias!

Saludos

Bloodday dijo...

yo pensaba que solo creaban el proceso en modo suspendido y luego se inyectaban causando confucion por la cantidad de procesos con el mismo nombre xD

muy bueno el articulo, me agrado bastante.

saludos.