domingo 13 de diciembre de 2009

Analizando capturas de red

De paseo por la blogosfera orientada al análisis de la (in)seguridad de los sistemas informáticos un artículo en pentester.es confirma mis sospechas de que no existe una única forma de hacer la misma cosa o, expresado en lenguaje más popular, que todos los caminos conducen a Roma.

En este caso el detonante es la web del instituto SANS para los cursos de análisis
forense de capturas de red y más concretamente su segundo puzzle. ¿Y de qué va esto? Simple, publican una captura de red en formato pcap, nos cuentan una historia relacionada con el origen de la misma y formulan una serie de cuestiones a extraer como resultado de las pesquisas. Sirve cualquier método para resolver el reto, pero solo el más original será el llamado a erigirse como vencedor y, por lo tanto, merecedor del premio.

Yo voy a proponer aquí un método que si bién no es muy original en cuanto a que la herramienta utilizada no es propia, sí me parece válido para aprender y, lo más importante, es muy sencillo de llevar a cabo. La primera opción que utilicé fué pyflag, pero la que paso a describir me parece aún más simple.

Para gustos sabores, y si además lo preferimos más dulce, recomiendo consultar el método utilizado por Chema García (a.k.a. sch3m4) en su blog opensec; para quitarse el sombrero. Seguro que la solución de Jose Selvi también será de "chuparse los dedos", ... paciencia.

Una de entre todas las posibles

Voy a utilizar una herramienta diseñada explícitamente para estos propósitos: xplico. Relacionada, y de hecho incluida, con el proyecto DEFT Linux, un live cd orientado al análisis forense made in italy.

Desde la página del proyecto alojada en sourceforge tenemos varias opciones: el tarball para la instalación desde las fuentes, una imagen de un sistema debian 5.0 para ejecutar en VirtualBox y, el que yo he escogido, un paquete binario preparado para instalarlo en Ubuntu 9.10.

Una vez descargado y satisfechas las dependencias lo instalo con un simple:

# dpkg -i xplico_0.5.3_i386.deb

Reiniciado apache2 e iniciado el servicio si es que ya no lo estuviera:
# /etc/init.d/apache2 restart
# /etc/init.d/xplico start

accederemos al interfaz web (que por otra parte no es el único modo de ejecución), utilizando preferentemente firefox, apuntando a la siguiente url:
http://localhost:9876/

Usuario por defecto deft con password xplico y a continuación en el menú de la izquierda NewCase. Las opciones a completar pasan por el tipo de datos (fichero de captura o generar una nueva captura), nombre del caso y otros datos de interés para situar el análisis dentro de una investigación más amplia.


Una vez agregado el caso llega el momento de añadir el/los ficheros de captura así que en el menú de la izquierda NewSession e incluimos un nombre descriptivo que nos permita identificar la sesión de captura, para el caso de que hubieran varias.

Ahora subiremos a la aplicación el fichero pcap para que se ponga a trabajar, así que utilizando el formulario de upload subimos nuestra captura, evidence02.pcap, le damos un lapso de tiempo para que complete el análisis de la misma y para contemplar el resultado de nuevo a través del menú de la izquierda, Session:


En esta pantalla, y de un solo vistazo, observamos que la captura contiene una resolución de host mediante DNS y 2 correos electrónicos enviados desde la máquina de la sospechosa. Para acceder a esta información podemos utilizar nuevamente el menú de la izquierda, así que empezaremos por la resolución DNS.

Los datos aparecen listados en forma de tabla incluyendo cada una de las filas la fecha y hora de la petición, el nombre de host, su cname, la dirección IP obtenida como resultado de la consulta y por último un resumen de los campos del stream (info.xml) y la posibilidad de descargar un fichero pcap incluyendo únicamente los datos relacionados con el mismo.

Vamos ahora a analizar los correos, así que menú de la izquierda, Email. En la tabla resultante, y en orden cronológico inverso, observamos los siguientes campos relativos a cada uno de los correos enviados: fecha y hora, emisor, receptor y tamaño en bytes.

Simplemente accediendo a cada uno de los correos ya tendremos la mayor parte de las preguntas planteadas contestadas de forma inmediata:
  • ¿Cual es la dirección de correo de Ann?
    sneakyg33k@aol.com
  • ¿Cual es la dirección de correo del amante secreto de Ann?
    mistersecretx@aol.com
  • ¿Qué dos cosas le dijo Ann que llevase a su amante?
    Un bañador y un pasaporte falso
  • ¿Cual es el nombre del adjunto que Ann le envió a su amante secreto?
    secretrendezvous.docx
  • ¿En qué ciudad y país está el punto de encuentro?
    Playa del Carmen, Mejico

Para obtener los datos de usuario y contraseña utilizados por Ann para acceder a su correo electrónico utilizaremos la captura pcap que nos proporciona xplico, y un poquito (muy poco) de Wireshark.

Mediante cualquiera de los correos, personalmente he utilizado el que no incluye adjunto, situamos el cursor sobre info.xml y activamos el enlace de descarga abriendo el fichero email_1.pcap. Una vez descargado y abierto, utilizando para ello Wireshark, botón derecho sobre el primer registro, Follow TCP stream, con lo que obtendremos únicamente los datos de la sesión SMTP en texto claro.


Ahora utilizaremos el comando base64 proporcionándole como entrada la cadena de la contraseña:
# echo NTU4cjAwbHo= | base64 -d -
558r00lz

Para obtener el MD5 del adjunto, y de nuevo mediante el interfaz de xplico, lo descargaremos activando el enlace correspondiente, lo renombraremos adecuadamente, y calcularemos el digest del fichero:
# mv 3 secretrendezvous.docx
# md5sum secretrendezvous.docx
9e423e11db88f01bbff81172839e1923 secretrendezvous.docx

Por último sólo nos queda obtener la suma MD5 de la imagen embebida en el documento anterior. Si para ello tenemos en cuenta que el nuevo formato utilizado por Office 2007 está basado enteramente en XML podemos extraer cualquiera de los elementos que lo componen cual si de un fichero comprimido se tratase:
# unzip -l secretrendezvous.docx
Archive: secretrendezvous.docx
Length Date Time Name
--------- ---------- ----- ----
1495 1980-01-01 00:00 [Content_Types].xml
590 1980-01-01 00:00 _rels/.rels
1082 1980-01-01 00:00 word/_rels/document.xml.rels
2648 1980-01-01 00:00 word/document.xml
194124 1980-01-01 00:00 word/media/image1.png
6992 1980-01-01 00:00 word/theme/theme1.xml
2161 1980-01-01 00:00 word/settings.xml
260 1980-01-01 00:00 word/webSettings.xml
23084 1980-01-01 00:00 word/styles.xml
727 1980-01-01 00:00 docProps/core.xml
6603 1980-01-01 00:00 word/numbering.xml
2182 1980-01-01 00:00 word/fontTable.xml
985 1980-01-01 00:00 docProps/app.xml
--------- -------
242933 13 files
# unzip -p secretrendezvous.docx word/media/image1.png | md5sum
aadeace50997b1ba24b09ac2ef1940b7 -

Y con esto ya tenemos las respuestas que nos faltaban:
  • ¿Cual es la contraseña para el correo de Ann?
    558r00lz
  • ¿Cual es la suma MD5 del adjunto enviado por Ann a su amante secreto?
    9e423e11db88f01bbff81172839e1923
  • ¿Cual es la suma MD5 de la imagen embedida en el documento?
    aadeace50997b1ba24b09ac2ef1940b7

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

Leer más...

martes 8 de diciembre de 2009

Automatizando los volcados de memoria

Pues resulta que andaba yo revisando uno de los PCs traídos de un cliente para ser reparado en taller, y tal como tengo por costumbre, y por eso de ir aprendiendo, me disponía a utilizar windd para volcar la memoria del sistema en un fichero. En esas me encontraba cuando apareció por allí mi compañero, una grandísima persona y aún mejor administrador de sistemas Linux, interesándose por mis maniobras. Después de contarle un poco por encima lo que aquí acabo de describir y verme consultar la ayuda del comando en un par de ocasiones me dijo - yo personalmente, cuando tengo que repetir una tarea al menos dos veces, siempre me genero un script.

Análisis de objetivos

Como suele pasarme con las palabras de mi compañero, no suelo darles importancia en el momento, pero siempre acaban influenciándome. Dándole vueltas al tema me planteé los siguientes requerimientos para el script:

  • Recibirá como argumento la letra de unidad en la que almacenar el volcado resultante.

  • Debería poder detectar si en la unidad indicada hay sufiente espacio disponible para almacenar el volcado, por lo tanto tiene que ser capaz de averiguar la cantidad de memoria física de que dispone el equipo.

  • Tiene que poder detectar el tipo de sistema operativo, 32 ó 64 bits, para lanzar la versión de windd adecuada.

  • El resultado debería almacenarse en un directorio con un nombre significativo y el nombre del fichero debería ser lo suficientemente particular como para no sobreescribir ninguno existente, o ser susceptible de ser sobreescrito.

Si a todo lo anterior le sumamos la posibilidad de ejecutarlo con el menor número de modificaciones en las diferentes versiones NT del sistema operativo Windows, el primer "lenguaje" que me vino a la mente fue "batch scripting", así que lo primero tener a mano los "Assorted NT/2000/XP CMD.EXE Script Tricks", mantenidos por el profesor Timo Salmi.

Descomponiendo el problema en partes mas pequeñas

Empezaré primero tratando de determinar el número de bits del sistema operativo en el que se ejecuta el script. Tal y como sugieren en el siguiente enlace, quedaría algo así:
@echo off & setlocal enableextensions

if "%PROCESSOR_ARCHITECTURE%" == "x86" (
if NOT DEFINED "%PROCESSOR_ARCHITEW6432%" (
echo Sistema de 32 bits
) else (
echo Sistema de 64 bits
)
) else (
echo Sistema de 64 bits
)

Otra alternativa sería la mencionada en el siguiente artículo de la base de conocmientos de Microsoft, How To Check If Computer Is Running A 32 Bit or 64 Bit Operating System, el cual se basa en la comprobación de la siguiente clave del registro:
HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0

y más concretamente en el valor asociado al parametro Platform ID. Sin embargo descarto de inmediato éste método debido a su limitada universalidad (sólo sirve para sistemas W2k y W2k3).

Una vez salvado este punto continúo, por ejemplo, obteniendo la cantidad de memoria física de que dispone el sistema, utilizando para ello el comando integrado systeminfo y algo de parseo de los resultados. Así que añado las siguientes líneas al script:
for /f "tokens=6,7" %%a in (
'systeminfo^|find "Cantidad total de memoria"') do (
set memory_=%%a
set units_=%%b)
echo Memoria total = %memory_% %units_%

Y ya de seguido procedo utilizando el comando fsutil para obtener el espacio libre de una unidad concreta indicada directamente en el script para simplificar así el proceso:
set drive_=C:
for /f "tokens=2 delims=:" %%a in (
'fsutil volume diskfree %drive_%^|
findstr /i /c:"bytes libres"') do (
set totalSizeBytes_=%%a)
if defined totalSizeBytes_ echo Espacio libre en %drive_% %totalSizeBytes_% bytes
if not defined totalSizeBytes_ echo %drive_% The size could not be resolved

El resultado obtenido ejecutando el "programa" en mi portatil sería:
C:\Users\javi\Desktop\pruebas>testsystem.bat
Sistema de 32 bits
Memoria total = 2.047 MB
Espacio libre en C: 17223503872 bytes

La solución encontrada sería "casi perfecta", pero el problema es que me gustaría poder ejecutar el script también en sistemas Windows 2000 y éstos no disponen ni del comando systeminfo ni del comando fsutil. Si además tenemos en cuenta que no es posible realizar
operaciones aritméticas desde la línea de comandos de Windows sin utilizar herramientas de terceros decido currarme yo mismo un programa para suplir estas carencias.

El API de Windows y yo

Si partimos de la base de que no soy programador ni de lejos, pero que me encanta probar y aprender además de ser un experto en cortar, pegar y encajar, seguro que el código es infinitamente mejorable. De hecho os invito a descargarlo, modificarlo y arreglarlo, pero eso sí, compartiendo aquí vuestras mejoras para que aprendamos todos.

Para generar el ejecutable yo he utilizado MS Visual C++ 2008 Express Edition, entorno que puede descargarse de forma gratuita desde la web de Microsoft; el tipo de proyecto es una aplicación de consola Win32. Para los más impacientes he incluido una versión ya compilada junto con el resto de los ficheros que acompañan esta entrada.

Su funcionamiento es muy simple, tal y como puede apreciarse por la escueta ayuda que muestra al invocarlo sin indicar ningún parametro:
C:\Users\javi\Desktop\mkmemdmp>mkmemdmp.exe
Usage: mkmemdmp.exe <drive>

Example: mkmemdmp.exe C:

Básicamente su función es la de comprobar si el volcado de memoria a realizar cabe en la unidad indicada y lanzar el batch script adecuado en función del sistema operativo en que se ejecute.

Como fuentes de documentación he utilizado los siguientes enlaces:

MEMORYSTATUSEX Structure
GlobalMemoryStatusEx Function
Driver Installation for 32-bit and 64-bit Platforms
GetSystemWow64Directory Function
SYSTEM_INFO Structure
GetSystemInfo Function
PROCESS_INFORMATION Structure
STARTUPINFO Structure
Processes: How can I start a process?

Otro poquito de batch scripting

Ya tengo el programa, el cual se encarga de hacer las comprobaciones oportunas y lanzar en consecuencia el script adecuado, dump32.bat para sistemas de 32 bits o dump64.bat para sistemas de 64 bits, indicándole la unidad a utilizar para almacenar los resultados.

El script en primer lugar comprueba si ya existe el directorio almacén, creándolo en caso contrario utilizando para ello el nombre de máquina:
set dir_=%1
set dir_=%dir_%memdmp_%COMPUTERNAME%

if not exist %dir_% (
mkdir %dir_%
)

A continuación genera de forma automática los nombres para los ficheros, tanto para el de volcado como para el de log, utilizando una combinación de la fecha y hora en que se ejecuta:
for /f "tokens=1-3 delims=./-" %%f in ("%date%") do (
set filename_=%%h%%g%%f
)
for /f "tokens=1-3 delims=:, " %%i in ("%time%") do (
set filenamedmp_=%filename_%_%%i%%j%%k.dmp
set filenamelog_=%filename_%_%%i%%j%%k.log
)

Ya por último lanza la herramienta windd, la verdadera estrella de la función, almacenando sus mensajes de salida en el fichero de log y mostrando los parámetros utilizados para ejecutarla. Por defecto el volcado se obtiene en formato raw y se genera el hash SHA1 del mismo.

Juntándolo todo

Para que todo funcione correctamente crearemos primero el directorio mkmemdmp y moveremos allí el ejecutable mkmemdmp.exe y los scripts dump32.bat y dump64.bat. Ahora descargaremos el paquete windd y extraeremos en el directorio anterior los binarios de 32 y 64 bits incluyendo sus drivers correspondientes:
C:\mkmemdmp>dir
El volumen de la unidad C es SYSTEM
El número de serie del volumen es: B00D-25C9

Directorio de C:\mkmemdmp

08/12/2009 22:03 <DIR> .
08/12/2009 22:03 <DIR> ..
08/12/2009 21:46 1.379 dump32.bat
08/12/2009 19:03 1.375 dump64.bat
07/12/2009 21:19 9.216 mkmemdmp.exe
13/11/2009 13:02 92.088 win32dd.exe
13/11/2009 13:02 50.872 win32dd.sys
13/11/2009 13:02 101.304 win64dd.exe
13/11/2009 13:02 58.296 win64dd.sys
7 archivos 314.530 bytes
2 dirs 17.214.128.128 bytes libres

Suponiendo ahora que pretendemos almacenar el volcado y los ficheros resultantes en la unidad C: el comando a ejecutar sería:
C:\mkmemdmp>mkmemdmp.exe C:

+---------------------------------------------------------------+
| - Neo System Forensics - |
| http://neosysforensics.blogspot.com |
+---------------------------------------------------------------+

Script para volcado automatizado de la memoria fisica del sistema
Detecta y utiliza la version adecuada de la herramienta windd (*)

Fichero de dmp generado:
C:\memdmp_OSIRIS\20091208_220938.dmp

Fichero de log generado:
C:\memdmp_OSIRIS\20091208_220938.log

Comando windd utilizado:
win32dd.exe /a /s 1 /f C:\memdmp_OSIRIS\20091208_220938.dmp

(*) windd - Kernel land physical memory acquisition
Copyright (c) 2007 - 2009, Matthieu Suiche <http://www.msuiche.net>
Copyright (c) 2008 - 2009, MoonSols <http://www.moonsols.com>

Y el contenido del directorio con los resultados sería:
C:\mkmemdmp>dir ..\memdmp_OSIRIS
El volumen de la unidad C es SYSTEM
El número de serie del volumen es: B00D-25C9

Directorio de C:\memdmp_OSIRIS

08/12/2009 22:09 <DIR> .
08/12/2009 22:09 <DIR> ..
08/12/2009 22:10 2.147.155.968 20091208_220938.dmp
08/12/2009 22:10 2.589 20091208_220938.log
2 archivos 2.147.158.557 bytes
2 dirs 12.927.860.736 bytes libres


Correción 09/12/2009:

Para que el binario compilado incluido en el paquete comprimido funcione, es necesario tener instalado el Microsoft Visual C++ 2008 Redistributable Package (x86).

Código, scripts y ejecutable: mkmemdmp.zip

Leer más...

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.

Leer más...

martes 27 de octubre de 2009

Volatility 1.3.2 is out!

Vía echo6 me entero de la noticia. Parece que después de un intenso trabajo de desarrollo ya tenemos una nueva versión estable del framework para el análisis de volcados de memoria de sistemas Windows.

Si somos realmente intrépidos podremos descargar la rama de desarrollo utilizando subversion desde el sitio en Google Code. En cualquier caso seguro que estarán encantados de que informemos sobre cualquier posible bug derivado de su uso.

Destacar la gran labor que está llevando a cabo Jamie Levy en la parte de documentación, disponible también en el sitio de Google y donde, ¡atención!, aparecemos enlazados :)

Leer más...

jueves 22 de octubre de 2009

Crónica de una infección, día 3

Parece que olvidé extraer de la máquina virtual infectada los ficheros con la traza del malware, léase el log de Process Monitor (Logfile.PML) y la captura de Wireshark (malware.pcap). No repetiré aquí como montar el disco creado por Vmware Server, en todo caso siempre puedo consultar mis notas.

Después de advertir el tamaño del log de Process Monitor (casi 92MB), advierto que las pistas obtenidas en cuanto a nuevos ficheros y claves del registro creadas en el sistema junto con varias operaciones lógicas, serán cruciales para seguirle los pasos al engendro.

Del tirón con Process Monitor

Comenzaré con lo más obvio, así que voy a crear un filtro que me muestre sólo la actividad relacionada con el proceso malware. Pulso en el icono del embudo, conocido emblema de las tierras de Wadalbertia, menú Filter, opcion Filter... establezco Process Name en el primer campo, is como condición logica, malware.exe para el tercer campo e Include como acción, Add para seleccionarlo y OK para ejecutarlo, o lo que es lo mismo:


La salida sigue siendo extensa, pero como premio dos eventos para el timeline: inicio y fín del proceso de instalación para el bicho, o mejor le llamaremos "mulero" que queda como más mejor. Selecciono el campo Time of Day de la primera ocurrencia, botón derecho "Highlight '29/09/09 22:42:26,2578790'" y establezco el primer marcado, repitiendo el proceso con la última ocurrencia. Pero no, parece que al final del log aparecen cierres de handles posteriores a la finalización del proceso; mi marcado deberia estar en la operacion "Process Exit" asociada a malware.exe, asi que corrijo y sigo.


Probaré ahora utilizando la lista de nuevos ficheros creados como base para el filtro. En concreto explotaré la ruta "C:\Archivos de programa\MailSkinner" y para ello menú Filter, o embudito, "Path begins with", nuestra ruta, "then Include" botón OK.

La primera operación que parece interesante es IRP_MJ_CREATE, concretamente la que incluye en el campo Detail la cadena "OpenResult: Created", o lo que es lo mismo, elemento creado correctamente. Como antes nuevo marcado mediante botón derecho "Highlight '29/09/2009 22:42:33,2751790'". También marcaré la operacion de establecimiento de permisos de acceso y mactimes, que traducido al lenguaje del sistema operativo será IRP_MJ_SET_INFORMATION.

Y aprovechando el tirón, marcado también en las dos operaciones para las siguientes rutas:

C:\Archivos de programa\MailSkinner\anim_0.gif
C:\Archivos de programa\MailSkinner\MailSkinner.exe
C:\Archivos de programa\MailSkinner\anim_help.gif
C:\Archivos de programa\MailSkinner\OLSkinner.dll
C:\Archivos de programa\MailSkinner\uninst.exe

Para seguir con la investigación deshago el filtro asociado a la ruta con menú Filter, o embudito, seleccionando la entrada adecuada de la lista de operaciones; primero Remove y luego OK.

Voy ahora con las modificaciones del registro provocadas por el proceso malware.exe. Aprovecharé los filtros preconfigurados, a los que accedo con los 5 primeros botones de la barra de herramientas empezando por la derecha, o con los 5 últimos empezando por la izquierda, que tanto monta monta tanto Isabel como Fernando:
  • Show Registry Activity
  • Show File System Activity
  • Show Network Activity
  • Show Process and Thread Activity
  • Show Profiling Events


Sólo pulso el del registro y aún así todavía será necesario procesar demasiada información; mejor intentaré acotar más. Si consulto la lista obtenida del uso de regshot, advierto que las claves interesantes contienen la cadena MailSkinner, así que agrego filtro: "Path contains MailSkinner" y aplico con OK. Pero no contento con esto, dos filtros más, los cuales aplicaré a la vez: "Operation is RegCreateKey", "Operation is RegSetValue" y OK. Intentaré no alargar la narración, pero sin olvidar marcar las claves del registro obtenidas con regshot.

Vuelvo a deshacer los filtros para mostrar todas las operaciones relacionadas con el proceso malware.exe, así que menú Filter, o embudito, Filter... y selecciono las ocurrencias que no sean "Process Name is malware.exe" pulsando Remove en cada ocasión y aplicando finalmente con OK.

Para obtener las marcas de tiempo asociadas a los marcados que he ido estableciendo, menú Filter Highlight o Ctrl + H, benditos atajos. Agrando la ventana de diálogo para que muestre todos de un solo vistazo y repaso las marcas de tiempo que llevo hasta ahora y que conforman el timeline para el proceso de infección:


Seguiré con el binario MailSkinner, por lo que deshago el filtro para malware.exe y lo reutilizo indicando ahora MailSkinner.exe. Como antes, establezco los primeros marcados en "Process Start" y "Process Exit".

Aprovecho la lista de ficheros obtenida con fileverifier++ para generar un nuevo filtro:


Y una vez establecido el punto de marcado deshago el filtro asociado a la ruta para, utilizando los botones de la barra de herramientas y dejando solo el del registro, encontrarme uno más, el que establece el inicio automático de la aplicación MailSkinner:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"MailSkinner"="c:\archivos de programa\mailskinner\mailskinner.exe"

Apunte parar recordar: en el fichero obtenido previamente con regshot la ruta comenzaba en HKEY_USERS, seguía con el SID del usuario al que correspondía y finalizaba de forma similar a la anterior. Esto es porque la ruta HKCU (HKEY_CURRENT_USER) siempre apunta en tiempo real a la configuración para el usuario al que corresponde la sesión actualmente iniciada en el sistema. De otra forma, en este caso estabamos logueados como Administrador y realmente HKCU es un enlace en memoria apuntando a "HKU\SID_del_Administrador".

Vuelvo a resetear los filtros y me quedo únicamente con "Process Name is MailSkinner.exe then Include" y le agrego otro más, "Path contains uwyoq.exe then Include". Como premio a la insistencia tres puntos de marcado, el momento de creación y escritura del binario en disco, con un tamaño de 270.336 bytes, y el instante en que se lanzó el proceso.

Sitúo el cursor en la línea donde se registra la creación del fichero en disco y elimino todos los filtros para advertir, sorpresa, un fichero temporal que resulta sospechoso:
  C:\WINDOWS\Temp\244843.htm

Botón derecho sobre cualquiera de las apariciones del fichero, Include, Path y aprendo un nuevo modo de generar filtros. Si desplazo el cursor hacia arriba encuentro varias operaciones de escritura en disco para el fichero anterior hasta que este alcanza, atención, el mismo tamaño que el bichito analizado. Resumen:
  1. MailSkinner.exe crea el fichero 244843.htm
  2. Iexplore.exe crea y completa en su cache el fichero bin[1].htm
  3. Iexplore.exe sobreescribe el fichero 244843.htm utilizando como origen bin[1].htm
  4. MailSkinner.exe utiliza 244843.htm como origen para crear el ejecutable uwyoq.exe

Llega el momento de pensar un poco; si iexplore ha creado un fichero en la caché eso es señal inequívoca de que en algún momento realizo una conexión TCP/IP para obtener su contenido; como además tengo la captura del sniffer seguro que puedo extraer el ejecutable, así que vamos a poner en marcha otra utilísima aplicación.

Ahora le toca a Networkminner

Lo primero descargarlo, y una vez desempaquetado lanzo el ejecutable NetworkMiner.exe. El programa puede actuar como sniffer seleccionando el adaptador desde el desplegable y pulsando Start, pero en este caso ya tengo una captura, malware.pcap, que es la que quiero analizar. Menú File, Open o Ctrl + O, y selecciono la traza del bicho.

La pestaña inicial, Hosts, muestra un resumen de todas las máquinas que aparecen en cualquiera de las conexiones registradas, e incluye, siempre que sea posible, la identificación del sistema operativo, OS fingerprinting, utilizando las bases de datos de p0f, ettercap y satori.


Me adelanto a la pestaña Sessions para analizar las sesiones establecidas por la máquina infectada, véase 192.168.198.133, y localizo dos sesiones HTTP con dos máquinas distintas. La trama capturada que constituye el inicio de cada una de las sesiones y que también aparece indicada me permite localizarla dentro de la pestaña Frames y observar la información que agrega cada una de las capas del modelo TCP/IP. Pero como casi que voy a ir al grano, a través de la pestaña Files localizo uno que se parece mucho al que busco, aunque un poco más grande (270.390 bytes).

Lo seleccciono y con botón derecho puedo abrirlo directamente, lo cual no parece lo más prudente, o abrir la carpeta en la cual NetworkMiner se ha encargado de volcarlo. Una vez allí tiro de editor hexadecimal, HDD Hex Editor Neo concretamente, para eliminar todo lo que sobra:


Como me temía, el fichero ya tiene el mismo tamaño que uwyoq.exe. Para asegurarme definitivamente calculo el md5 por ejemplo, con md5deep:
C:\binaries>md5deep.exe bin.php.C868054A.octet-stream
9b900c774f0ea4d52b5ad1332cd5fe0a C:\binaries\bin.php.C868054A.octet-stream

El hash de uwyoq.exe lo saco utilizando FTK Imager, agregando como elemento de evidencia el disco de la máquina virtual infectada. Lo encuentro en system32, botón derecho 'Exportar lista hash de archivos...'. Como resultado un CSV que abro con OpenOffice, conteniendo el mismo md5.

Finalizando el timeline

Regreso ahora al log de process monitor para seguir al proceso uwyoq.exe. Primero deshago todos los filtros y establezco "Process Name is uwyoq.exe then Include", boton Add y OK. Mecánicamente resalto dos nuevos puntos de marcado, el inicio y fín del proceso, correspondiendo este último al momento en que decidí acabar el experimento y lo maté (aka un "KILL uwyoq.exe").

Siguiendo un procedimiento se me antoja lógico establezco sucesivamente filtros para los ficheros que restan de la lista de fileverifier++ tal que filtro-marco-elimino-filtro. El orden:
C:\WINDOWS\system32\uwyoq.dat 
C:\WINDOWS\system32\uwyoq_nav.dat
C:\WINDOWS\system32\uwyoq_navps.dat

Una vez localizados comienzo a buscar el momento en que se agrega al registro la clave de autoinicio para el malware. Deshago todos los filtros y nuevamente dejo únicamente pulsado el botón "Show Registry Activity", y añado "Path contains uwyoq then Include", aplico y localizo el punto exacto estableciendo el último marcado.

Aún quedan muchos cabos sueltos como, por ejemplo el propósito del resto de ficheros obtenidos con NetworkMiner, pero creo que por el momento ya tengo bastante. Ahora a completar el timeline, proceso que no he sido capaz de automatizar. La única forma que se me ocurre y me ha funcionado ha sido anotar manualmente los valores de tiempo para cada uno de los marcados a lo largo del registro de process monitor y utilizarlos después para crear tambien manualmente los correspondientes filtros, aplicarlos todos a la vez y guardar el resultado en formato CSV.

Apunte parar recordar: descubro tarde una funcionalidad más de Process Monitor; a través del menu Tools, Process Tree... o directamente Ctrl + T me muestra un cuadro de diálogo con el árbol de procesos y sus relaciones. Si además desmarco "Only show processes still running at end of current trace" aparecen todos los que, en algún momento, estuvieron en ejecución durante la captura de la traza.

Y así certifica el que suscribe asegurando que tal fué lo que pasó; pronto más, e intentaré que mejor.

Leer más...

lunes 12 de octubre de 2009

Crónica de una infección, día 2

Continuando por donde lo dejé llega el momento de la infección, autoinfección o como quiera que deba llamársele, que al final el resultado va a ser el mismo. Ya tengo todo lo que necesito en el directorio C:\analisis, incluyendo el programa fileverifier++ (C:\analisis\fv), regshot (C:\analisis\regshot) y las utilidades de sysinternals que he escogido para estas labores (C:\analisis\sysinternals).

Dentro de ese mismo directorio además tengo un fichero con las sumas md5 para el sistema "limpio" (C:\analisis\fv\baseline.01.txt) y una instantánea del registro, también en las mismas condiciones (C:\analisis\baseline.regshot.01.hiv).

Por último, y también en esa ubicación, he extraido el contenido del fichero descargado de offensivecomputing, con nombre malware. Así que vamos con la acción. Ah, casi olvido mencionar que, cuando terminé la instalación de Windows en la máquina virtual agregué las VMware-tools. Tendré que tener más cuidado a partir de ahora e intentar registrar detalladamente cada uno de mis pasos, mejor que sobre a que falte.

Comienza la batalla

'Colgando la herreruza en mano diestra y asida toledana en la siniestra enfilo al sarraceno plantado en el centro de la arena doblando el gesto en mala gana, pués tanto es al matar ser hábil con las armas como asustar con traza y semblante'.

No he podido evitarlo y he dejado volar mi prosa en forma de homenaje, a fín de cuentas éste
es mi diario y hago con él lo que me place. Pero mejor vuelvo a la tierra y continúo con lo que me trae liado.

No puedo evitar sentir cierto nerviosismo, y sin querer mi mente vuela al pasado, cuando todo el PC consituía para mí un insondable misterio; pero no tan lejano, apenas unos 10 años. En aquel entonces, y atraido de rebote por el mundo de la informática por cuestiones que no vienen ahora al caso, me dedicaba a saturar mi conexión a internet descargando cualquier manual que incluyera la palabra hacker, proviniera de fuentes de dudosa reputación o destacara multitud de calaveras estampadas sobre fondos negros, negros como los supuestos y arcanos conocimientos que pretendían desvelar.

El día en cuestión estrenaba mi flamante antivirus, y tras unos pocos clics guiado por un asistente de instalación finalizaba la primera actualización de la base de datos de firmas. En ese momento el miedo se apoderaba de mí cuando una onerosa advertencia clamaba numerosas infecciones, destacando entre ellas una variante del famosos CIH, del cual todavía conservo una copia en un diskette de 3,5. Y mírame ahora, provocando lo que entonces parecía el fín de mis sueños informáticos.

Inicio el proceso y para ello lanzo antes procmon (aka Process Monitor), el cual se pone de inmediato a registrar cualquier evento que se produzca en el sistema. Inicio también Wireshark y accedo al menú Capture, Interfaces... seleccionando como tal "VMware Accelerated AMD PCNet Adapter (Microsoft's Packet Scheduler) 192.168.198.133" y pulsando a continuación el botón Start para comenzar con el registro de conexiones. Temo que de momento voy a prescindir del resto de aplicaciones dado que tengo la intuición de que con lo anterior tendré más que suficiente.

La instalación del bicho comienza solicitando el idioma, donde dejo la opción predeterminada a Español. Siguiente, acepto las condiciones de licencia, dejo el directorio de instalación por defecto continuando con Instalar para realizar el proceso que, tras pulsar Finalizar, muestra un mensaje de felicitación indicando que ya podemos utilizar las características de MailSkinner y abre el navegador predeterminado llevándome a la web de los desarrolladores, cuyo dominio parece no estar actualmente activo.

Regreso al intefaz de Wireshark, menú Capture y detengo el registro de conexiones con la opción Stop, tras lo que guardo el resultado con File, Save As... en el directorio C:\analisis y nombre malware.pcap, cerrando por último la aplicación.

Procedo de forma similar ahora con procmon y para ello, en el menú File, desmarco Capture Events lo que detendrá el registro de eventos. Para guardar los resultados, también el menú File escojo Save y en el cuadro de diálogo marco All events y Native Process Monitor Format (PML) utilizando como destino el directorio C:\analisis\sysinternals.

Ahora, y seguro de tener ya el bicho suelto procedo a obtener las sumas md5 de todos los ficheros del sistema. Utilizo fileverifier++, como antes, ejecutándolo en la forma siguiente:

C:\analisis\fv>fvc -a Md5 -f MD5SUM -c -r C:\ > baseline.02.txt
Error: Error opening file "C:\\pagefile.sys"
Error: Error opening file "C:\\Documents and Settings\Administrador\NTUSER.DAT"
Error: Error opening file "C:\\Documents and
Settings\Administrador\ntuser.dat.LOG"
Error: Error opening file "C:\\Documents and
Settings\Administrador\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat"
Error: Error opening file "C:\\Documents and
Settings\Administrador\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat.LOG"
Error: Error opening file "C:\\Documents and
Settings\Administrador\Configuracion local\Temp\Perflib_Perfdata_13c.dat"
Error: Error opening file "C:\\Documents and Settings\LocalService\NTUSER.DAT"
Error: Error opening file "C:\\Documents and
Settings\LocalService\ntuser.dat.LOG"
Error: Error opening file "C:\\Documents and
Settings\LocalService\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat"
Error: Error opening file "C:\\Documents and
Settings\LocalService\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat.LOG"
Error: Error opening file "C:\\Documents and
Settings\NetworkService\NTUSER.DAT"
Error: Error opening file "C:\\Documents and
Settings\NetworkService\ntuser.dat.LOG"
Error: Error opening file "C:\\Documents and
Settings\NetworkService\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat"
Error: Error opening file "C:\\Documents and
Settings\NetworkService\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat.LOG"
Error: Error opening file "C:\\WINDOWS\system32\config\default"
Error: Error opening file "C:\\WINDOWS\system32\config\default.LOG"
Error: Error opening file "C:\\WINDOWS\system32\config\SAM"
Error: Error opening file "C:\\WINDOWS\system32\config\SAM.LOG"
Error: Error opening file "C:\\WINDOWS\system32\config\SECURITY"
Error: Error opening file "C:\\WINDOWS\system32\config\SECURITY.LOG"
Error: Error opening file "C:\\WINDOWS\system32\config\software"
Error: Error opening file "C:\\WINDOWS\system32\config\software.LOG"
Error: Error opening file "C:\\WINDOWS\system32\config\system"
Error: Error opening file "C:\\WINDOWS\system32\config\system.LOG"
Error: Error opening file "C:\\WINDOWS\Temp\Perflib_Perfdata_7c8.dat"

Aparecen los mismos errores que para la captura inicial, así que parece que no voy del todo mal. El siguiente paso es el estado del registro por lo que lanzo regshot y, como antes, incluyo las siguientes opciones:
  • En Scan dir, indico C:
  • En Output path C:\analisis
  • En Add comment into the log esta vez lo dejo vacio
Continúo con 1st shot, Shot and Save... y como directorio y nombre del fichero indico:
C:\analisis\baseline.regshot.02.hiv

Creo que ya lo tengo todo, así que detengo la máquina virtual mediante el interfaz de vmware server y, desde el sistema operativo anfitrión, procedo a recuperar los ficheros de registro. Esto no resulta difícil dado que tengo instalado el Virtual Disk Development Kit y, lo más
importante para que funcione correctamente en Windows Vista, deshabilitado UAC.

El procedimiento para montar el disco virtual asignándole la letra de unidad Z: es tal cual sigue:
C:\Users\javi>cd \

C:\>cd "%ProgramFiles%\VMware\VMware Virtual Disk Development Kit\bin"

C:\Program Files\VMware\VMware Virtual Disk Development Kit\bin>vmware-mount.exe
Z: "D:\Maquinas Virtuales\Windows XP SP3\Windows XP SP3-000001.vmdk"
C:\Program Files\VMware\VMware Virtual Disk Development Kit\bin>vmware-mount.exe

Z:\ => D:\Maquinas Virtuales\Windows XP SP3\Windows XP SP3-000001.vmdk

Y ahora utilizando mi socorrida gui, entendiendo por tal el Explorador de archivos de Windows Vista, recupero los ficheros adecuados, es decir:
C:\analisis\fv\baseline.01.txt
C:\analisis\fv\baseline.02.txt
C:\analisis\baseline.regshot.01.hiv
C:\analisis\baseline.regshot.02.hiv

Como de momento no necesito más ficheros mejor desmonto el disco virtual:
C:\Program Files\VMware\VMware Virtual Disk Development Kit\bin>vmware-mount.exe
/d Z:

y continúo la campaña...

Descubriendo a los infiltrados

Comenzaré identificando los ficheros creados por el bicho, y para ello se me ocurre comparar las sumas md5 para los resultados de fileverifier++. Dado que existe un estado inicial y un estado posterior a la infección debería poder detectarlos fácilmente. Para esta tarea tengo dos opciones, una de línea de comandos y otra en modo gráfico.

La opción de línea de comandos pasa por utilizar fc, aka file compare, tal como sigue:
C:\>fc /L /W baseline.01.txt baseline.02.txt > diferencias.txt

Si abro el fichero resultante observo como las diferencias aparecen por bloques, indicando las líneas que no coinciden precedidas del nombre del fichero en el que se encuentran. Pero para hacerlo un poco mas visual voy a utilizar ahora windiff.

El binario podemos encontrarlo junto a las herramientas de soporte incluidas en el CD de instalación a partir de Windows 2000 y hasta Windows XP y la versión para servidores, Windows 2003. Para los más vagos o, que como yo, están utilizando Windows Vista, podremos descargarla desde aquí.

Una vez desempaquetado y ejecutado, menú File, Compare Files... y abro primero baseline.01.txt y luego baseline.02.txt. Aparece un mensaje indicando que, efectivamente, los ficheros son diferentes. Para ver estas diferencias pulso Expand, y para limpiar un poco la salida facilitando así su análisis menú Options y desmarco Show Identical Lines y en el menú, View Picture.

Las líneas correspondientes al primer fichero van precedidas del simbolo <! y las del segundo por !>. Para poder tratar los resultados mediante el menú Edit, Edit Composite File se abrirá el editor de textos establecido por defecto con el contenido mostrado por la aplicación. Una vez eliminada la paja descubro los ficheros generados como resultado de la instalación del malware:
 !> 1a8e612eaf5fd2c0cef092f13c0d6c03 ?Md5*C:\\Archivos de programa\
MailSkinner\anim_0.gif
!> 84068d65550d997ad34de5370802ee43 ?Md5*C:\\Archivos de programa\MailSkinner
\anim_help.gif
!> 8c36ac4555d727a99d99ddfe3b1bf085 ?Md5*C:\\Archivos de programa\MailSkinner
\MailSkinner.exe
!> d23a7ac46be84f97dd212b1828af8dbf ?Md5*C:\\Archivos de programa\MailSkinner
\OLSkinner.dll
!> 37c4c38362eaef9fae307086d12bca5f ?Md5*C:\\Archivos de programa\MailSkinner
\uninst.exe
!> 0e701d85faf33eebbfc3b31adabeceb1 ?Md5*C:\\WINDOWS\msskinner\msbackup.dat
!> 80bc32dd690bdfc7a0e73ff608ea095d ?Md5*C:\\WINDOWS\system32\uwyoq.dat
!> 9b900c774f0ea4d52b5ad1332cd5fe0a ?Md5*C:\\WINDOWS\system32\uwyoq.exe
!> 798831331633f45a88915bf1a7018366 ?Md5*C:\\WINDOWS\system32\uwyoq_nav.dat
!> 2a71f842809fc4294ba35a1fb0386822 ?Md5*C:\\WINDOWS\system32\uwyoq_navps.dat

Y guardo lo anterior, que seguro me servirá para posteriores consultas, o quizás para comprobar que voy por buén camino, quien sabe.

Ahora analizaré las diferencias detectadas en las dos capturas del registro de Windows. Y para ello abro regshot, botón 1st shot, Load... y cargo el fichero baseline.regshot.01.hiv. Luego botón 2nd shot, Load... y cargo el fichero baseline.regshot.02.hiv. Por último pulso el botón cOmpare y como resultado se abrirá un txt en el bloc de notas con las modificaciones sufridas en el registro tras la instalación del malware. Nuevamente, una vez eliminada la paja me quedo con:
HKLM\SOFTWARE\Classes\CLSID\{180B4EE9-1795-4429-9651-F17A6515726D}\
VersionIndependentProgID\: "OutlookAddin.Addin"
HKLM\SOFTWARE\Classes\CLSID\{180B4EE9-1795-4429-9651-F17A6515726D}\
TypeLib\: "{5BAD7FAE-81F0-4439-8C1A-3E8907998047}"
HKLM\SOFTWARE\Classes\CLSID\{180B4EE9-1795-4429-9651-F17A6515726D}\
ProgID\: "OutlookAddin.Addin.1"
HKLM\SOFTWARE\Classes\CLSID\{180B4EE9-1795-4429-9651-F17A6515726D}\
InprocServer32\: "C:\Archivos de programa\MailSkinner\OLSkinner.dll"
HKLM\SOFTWARE\Classes\CLSID\{180B4EE9-1795-4429-9651-F17A6515726D}\
InprocServer32\ThreadingModel: "Apartment"
HKLM\SOFTWARE\Classes\CLSID\{180B4EE9-1795-4429-9651-F17A6515726D}\
: "Addin Class"
HKLM\SOFTWARE\Classes\Interface\{0A089E22-5736-4092-B3F8-3F0D5F345482}\
: "IEGEmailSkinnerAddin"
HKLM\SOFTWARE\Classes\TypeLib\{5BAD7FAE-81F0-4439-8C1A-3E8907998047}\
1.0\0\win32\: "C:\Archivos de programa\MailSkinner\OLSkinner.dll"
HKLM\SOFTWARE\Classes\TypeLib\{5BAD7FAE-81F0-4439-8C1A-3E8907998047}\
1.0\HELPDIR\: "C:\Archivos de programa\MailSkinner\"
HKLM\SOFTWARE\Classes\TypeLib\{5BAD7FAE-81F0-4439-8C1A-3E8907998047}\
1.0\FLAGS\: "0"
HKLM\SOFTWARE\Classes\TypeLib\{5BAD7FAE-81F0-4439-8C1A-3E8907998047}\
1.0\: "OutlookAddin 1.0 Type Library"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MailSkinner\
DisplayName: "MailSkinner"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MailSkinner\
UninstallString: "C:\Archivos de programa\MailSkinner\uninst.exe"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MailSkinner\
UninstallString2: ""C:\Archivos de programa\MailSkinner\uninst.exe" /S"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MailSkinner\
DisplayIcon: "C:\Archivos de programa\MailSkinner\MailSkinner.exe"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MailSkinner\
DisplayVersion: "1.0"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MailSkinner\
URLInfoAbout: "http://www.mailskinner.com"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MailSkinner\
Publisher: "OOO «Favorit»"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\uwyoq\
DisplayName: "Favorit"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\uwyoq\
UninstallString: ""c:\windows\system32\uwyoq.exe" -uninstall"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\uwyoq\
NoRemove: 0x00000000
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\uwyoq\
NoModify: 0x00000001
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\uwyoq\
NoRepair: 0x00000001

HKLM\SOFTWARE\MailSkinner\grpid: "37"
HKLM\SOFTWARE\MailSkinner\InstallOpt1: "1"
HKLM\SOFTWARE\MailSkinner\installdt: "20090127"
HKLM\SOFTWARE\MailSkinner\Installer Language: "1034"
HKLM\SOFTWARE\MailSkinner\nums: ""
HKLM\SOFTWARE\MailSkinner\bnrid: ""

HKU\S-1-5-21-1078081533-2146883321-1417001333-500\Software\Microsoft\
Windows\CurrentVersion\Run\MailSkinner: "c:\archivos de programa\
mailskinner\mailskinner.exe"
HKU\S-1-5-21-1078081533-2146883321-1417001333-500\Software\Microsoft\
Windows\CurrentVersion\Run\uwyoq: ""c:\windows\system32\uwyoq.exe" uwyoq"
HKU\S-1-5-21-1078081533-2146883321-1417001333-500\Software\
MailSkinner\grpid: "37"
HKU\S-1-5-21-1078081533-2146883321-1417001333-500\Software\
MailSkinner\InstallOpt1: "1"
HKU\S-1-5-21-1078081533-2146883321-1417001333-500\Software\
MailSkinner\installdt: "20090127"
HKU\S-1-5-21-1078081533-2146883321-1417001333-500\Software\
MailSkinner\UrlMV: "http://www.mailskinner.com/?hitmail=true&grpid=37"

Como curiosidad indicar que, en base a las modificaciones sufridas por el registro de Windows, en el resultado final obtenido de regshot aparece al final una lista con los nuevos archivos generados en el sistema.

Y con todas estas pistas, y mucha, mucha paciencia mañana seguiré analizando la actividad sufrida en el sistema durante el proceso de infección, comprobando detalladamente el log de process monitor.

Leer más...

viernes 2 de octubre de 2009

Crónica de una infección, día 1

Siempre había querido escribir un diario, solo que nunca pense que tendría algo que contar. Quizás realmente siga sin tener nada interesante que escribir, pero lo cierto es que un día tenía que ser el primero, y éste es tan bueno para ello como podría serlo cualquier otro. Lo mejor será que empiece por el principio, y el principio fué hace algunas semanas, en casa de un buén amigo.

Supongo que todos los que, de alguna forma, disfrutamos haciéndoles perrerías a los ordenadores, padecemos algo de deformación profesional. En mi caso se manifiesta sintiéndome tentado a toquetear siempre que advierto el menor signo de vida palpitando en un monitor, y eso es lo que pasó. Lo último que recuerdo fué la luz intermitente de mi pendrive y un fichero comprimido en rar dentro de una carpeta con un nombre muy sugerente: malware.

Hasta ayer no recordaba esa carpeta, y menos aún el ficherito de marras, pero al final ha sido el detonante de todo esto. Una vez extraído el fichero, siempre con cuidado de no hacer doble click sobre él, solo por si las moscas, se me ocurrió pedir la ayuda de un profesional, y el primero que me vino a la mente fue VirusTotal. El concepto es sencillo, una aplicación web que permite analizar ficheros utilizando para ello diversos antivirus y que ofrece, como resultado, un completo informe sobre la posibilidad de que sea software malicioso.

Al final el ejecutable resultó ser un bicho, una variante del skintrim. Una búsqueda en google devuelve muchos resultados, análisis y descripción de sus principales características, método de infección y relatos pormenorizados del proceso de desinfección. Dado mi caracter extremadamente curioso y analizando los hechos a posteriori el proceso de accción/reacción para el hilo de mis pensamientos era totalmente previsible: mejor me infecto yo mismo y lo estudio en libertad. Pero si vamos a hacer las cosas, por lo menos hagámoslas bién, al menos lo mejor que sepamos y/o podamos.

Lo primero es disponer de un entorno de pruebas, algo así como una sandbox. Los requerimientos son simples: un entorno controlado, fácilmente recuperable y que resulte barato. La solución vino de la mano de VMware Server y un PC, con una máquina virtual; un sistema operativo virtualizado, el guest, corriendo sobre un software especializado, el hipervisor, corriendo a su vez en un sistema operativo físico, el host. No sé porque este tipo de entorno me recuerda a esas famosas muñequitas rusas, matrioskas creo que se llaman, muñecas que contienen muñecas.

Preparando la jaula

El sistema operativo anfitrión ya lo tengo, un Windows Vista Service Pack 2. La instalación del hypervisor es trivial, previo registro en la web de VMware descargo el ejecutable para la última versión disponible de VMware Server, la 2.0.1 en el momento de ensuciar este papel. Y una vez instalada, lanzado el interfaz web de la aplicación, el cual se apoya en un servidor Tomcat, y correctamente autentificado preparo la máquina virtual sobre la que instalaré el sistema operativo invitado, un Windows XP con el Service Pack 3 integrado utilizando para ello nLite.

Menú Virtual Machine, Create Virtual Machine. Una ventana y un recorrido por etapas nos ayudará en el proceso, as que cual abnegado ciclista subiendo la pared del Mortirolo comienzo en Name y Location dándole el nombre, Windows XP SP3, y ubicación, el datastore standard o lo que es lo mismo, el directorio por defecto utilizado por la aplicación para almacenar las máquinas virtuales.

Siguiente etapa, Guest Operating System, así que selecciono Windows operating system y tirando de desplegable Microsoft Windows XP Professional (32-bit). Continúo ahora, parando en Memory and Processors para establecer 512 MB y un único microprocesador, tomando ambas decisiones en base al hardware del sistema anfitrión. Y siguiendo con el hardware virtual llega el momento del espacio en disco, Hard Disk, Create a New Virtual Disk y dentro de Properties su tamaño, que seguro que con 10GB tengo más que suficiente y dado que no toco el resto de opciones el espacio será asignado conforme vaya siendo necesario.

Para abreviar, en los siguientes pasos establezco un adaptador de red en modo NAT (Network Adapter y Propierties), una unidad de CDROM asociada al dispositivo físico (CD/DVD Drive y Properties), sin unidad de diskette (Floppy Drive y Properties) y sin controladora USB (USB Controller), así aislo aún más si cabe el entorno para las pruebas.

Una vez finalizado el proceso anterior la máquina virtual arranca de forma automática, por lo que con el cd de Windows insertado en la unidad lectora comienzo el proceso de instalación, el cual no describiré aquí por ser harto conocido. Aproximádamente una hora y varios clics de ratón más tarde ya tengo una máquina virtual con Windows XP Service Pack 3, a la que añado exclusivamente los siguientes programas:


Velando armas

Toca ahora escoger las herramientas para monitorizar las actividades del bicho, y como no podía ser de otra forma, Mark Russinovich y compañía tienen mucho que decir en esto. Cofundador junto con Bryce Cogswell del sitio web de sysinternals, denominación de origen adquirida en 1996 por Microsoft, es autor de numerosos documentos técnicos y herramientas que nos permitirán asomarnos a los secretos e interioridades para los sistemas operativos de la firma de Redmon. En concreto, de todas las disponibles, selecciono las siguientes:
  • Process Monitor v1.11
    Heredera de las discontinuadas Filemon y Regmon auna interesantes capacidades que nos permitirán monitorizar los entresijos del funcionamiento de Windows, y cito textualmente: "muestra en tiempo real el sistema de archivos, el Registro y la actividad de los procesos y subprocesos".

  • TCPView v2.4
    Herramienta que muestra información detallada de todos los sockets TCP/IP lanzados en el sistema, incluyendo las direcciones para los dos extremos de cada conexión; algo así como un nestat pero más avanzado.

  • Process Explorer v11.02
    Una de las utilidades más potentes de toda la suite. Es lo más parecido al Administrador de Tareas de Windows, pero multiplicando sus capacidades por 1000. Muestra el árbol de procesos ejecutándose en el sistema permitiendo alterar su ejecución, obtener volcados de depuración, listar los handles abiertos por el proceso y mucho, mucho más.
Pensando en el comportamiento habitual del malware en libertad, sin duda será muy interesante analizar en detalle todas las conexiones TCP/IP iniciadas durante la infección, y el mejor analizador que se me ocurre es Wireshark, o Ethereal, como se denominaba en sus orígenes. También será preciso instalar la librería de captura de paquetes WinPcap, incluida con el instalador del primero. Las versiones, 1.2.2 para el sniffer y 4.1 beta 5 para la librería.

Ya tengo lo necesario, o al menos eso creo, para monitorizar el proceso de infección y los momentos inmediatamente posteriores a la misma. Ahora generaré una captura del estado del sistema no infectado, de forma que, una vez haya soltado el bicho y este campe a sus anchas, pueda comparar su estado con el anterior y observar las diferencias. Creo que el primero se conoce como baseline, y para generarlo utilizaré, por una parte, la suma md5 de todos los ficheros que lo componen, y por otra el contenido del registro de Windows.

Para generar la suma MD5 utilizaré FileVerifier++, en concreto la versión de línea de comandos. Existen muchas herramientas que permiten generar esta suma, md5deep sin ir más lejos, pero me he decantado por el primero dado que se trata de un programa que utiliza directamente el API de Windows, además de la cantidad de algoritmos de generación para la suma de comprobación. Una vez descargado y extraido el contenido del paquete zip, no el instalable, para obtener el hash MD5 de todos los ficheros que componen la instalación de Windows:
C:\analisis\fv>fvc -a Md5 -f MD5SUM -c -r C:\ > baseline.01.txt
Error: Error opening file "C:\\pagefile.sys"
Error: Error opening file "C:\\Documents and Settings\Administrador\NTUSER.DAT"
Error: Error opening file "C:\\Documents and
Settings\Administrador\ntuser.dat.LOG"
Error: Error opening file "C:\\Documents and
Settings\Administrador\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat"
Error: Error opening file "C:\\Documents and
Settings\Administrador\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat.LOG"
Error: Error opening file "C:\\Documents and Settings\LocalService\NTUSER.DAT"
Error: Error opening file "C:\\Documents and
Settings\LocalService\ntuser.dat.LOG"
Error: Error opening file "C:\\Documents and
Settings\LocalService\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat"
Error: Error opening file "C:\\Documents and
Settings\LocalService\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat.LOG"
Error: Error opening file "C:\\Documents and
Settings\NetworkService\NTUSER.DAT"
Error: Error opening file "C:\\Documents and
Settings\NetworkService\ntuser.dat.LOG"
Error: Error opening file "C:\\Documents and
Settings\NetworkService\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat"
Error: Error opening file "C:\\Documents and
Settings\NetworkService\Configuracion local\Datos de
programa\Microsoft\Windows\UsrClass.dat.LOG"
Error: Error opening file "C:\\WINDOWS\system32\CatRoot2\edb.log"
Error: Error opening file "C:\\WINDOWS\system32\CatRoot2\edbtmp.log"
Error: Error opening file "C:\\WINDOWS\system32\CatRoot2\tmp.edb"
Error: Error opening file "C:\\WINDOWS\system32\config\default"
Error: Error opening file "C:\\WINDOWS\system32\config\default.LOG"
Error: Error opening file "C:\\WINDOWS\system32\config\SAM"
Error: Error opening file "C:\\WINDOWS\system32\config\SAM.LOG"
Error: Error opening file "C:\\WINDOWS\system32\config\SECURITY"
Error: Error opening file "C:\\WINDOWS\system32\config\SECURITY.LOG"
Error: Error opening file "C:\\WINDOWS\system32\config\software"
Error: Error opening file "C:\\WINDOWS\system32\config\software.LOG"
Error: Error opening file "C:\\WINDOWS\system32\config\system"
Error: Error opening file "C:\\WINDOWS\system32\config\system.LOG"
Error: Error opening file "C:\\WINDOWS\Temp\Perflib_Perfdata_79c.dat"

Los errores obtenidos como resultado parecen todos relacionados con ficheros de log abiertos en el momento de la ejecución o correspondientes a ficheros protegidos del sistema, así que no les daré importancia.

Ahora le toca el turno al contenido del registro de Windows y para ello utilizaré Regshot. Una vez descargado y extraido el ejecutable, con interfaz gráfico en este caso, especifico las siguientes opciones de ejecución:
  • En Scan dir, indico C:
  • En Output path C:\analisis
  • En Add comment into the log pongo Baseline regshot
Una vez adecuadamente configurado, 1st shot, Shot and Save... y el directorio y nombre del fichero que almacenará los resultados, el cual tendrá extensión .hiv y no será legible, al menos directamente.

Ahora que ya lo tengo todo listo, y de forma que pueda volver al estado inicial del sistema, es decir, sin estar infectado, voy a crear un snapshot de la máquina virtual. Desde el interfaz web de vmware server, y seleccionado el sistema en cuestión lanzo el comando Take snapshot desde el menú Virtual Machine.

Y ahora de caza

Solo resta obtener el bichito en cuestión, a ser posible incluyendo el lanzador o programa encargado de generar la infección. El mejor lugar para obtener malware "fresquito", sin tener que recurrir a colecciones privadas o a enviar un mensaje a un newsgroup solicitando "ayuda" es sin duda Offensive Computing. Además de incluir una extensa colección de malware perfectamente clasificado y con un potente buscador también pone a disposición de los usuarios un foro y artículos regularmente publicados incluyendo abundante información sobre el tema. Lo único que tenemos que hacer para disfrutar de todo el contenido es registrarnos, proceso totalmente gratuito y por demás recomendable.

Así que previo registro, autentificación y utilizando "skintrim" como cadena de búsqueda obtengo 20 coincidencias. Dada la cantidad de opciones no lo pienso más y descargo el primero de ellos, para el cual se incluyen los siguientes datos
descriptivos:
MD5:    730250b1891a23713851a7efda1ac05f
SHA1: cd5719ca25722316b89e9e303e49aeeec7398b29
SHA256: 70afa90f711d01b4548cbd0100dce5fd90c9d21f51abaa40dcfa9fce335c5be4
Original Submitted Filename: 730250b1891a23713851a7efda1ac05f.exe
Date Added: 2009-04-30 01:43:09.910815
Magic File Type: MS-DOS executable PE for MS Windows (GUI) Intel 80386 32-bit
Anti-Virus Results: BitDefender Trojan.Skintrim.AZV

Pulso download, parpadeo del router y en menos de 1 minuto un fichero en el Escritorio de la máquina virtual con nombre malware y password 'infected', que toda precaución es poca tratando con tan baja calaña.

Con esto ya lo tengo todo, el escenario, el enemigo, y las armas, pero malo es luchar cansado, así que mejor dejo el resto para mañana.

Leer más...