viernes, 16 de marzo de 2012

SpyEye y sus curiosas técnicas de ocultación


A finales de 2010, ya publicamos algunas noticias acerca de la familia SpyEye (con vídeo incluido) en las que se hablaba de su interesante panel de control. Dos años después, el troyano sigue gozando de una estupenda salud, y su variante que infecta también a los teléfonos móviles, está consiguiendo un éxito importante. Hablemos ahora de sus técnicas de ocultación y algunas curiosidades.

SpyEye es un troyano bancario del tipo DIY ("hágalo usted mismo") muy popular. Su nivel de sofisticación es punta de lanza del malware actual. Sus últimas versiones incorporan la infección del móvil con sistema operativo Android o Blackberry cuando se usa el SMS como segundo canal de autenticación de algunos bancos. Así, el troyano tiene el control sobre los dos dispositivos involucrados en la transacción.

SpyEye tiene muchas "virtudes". Entre ellas, es un rookit que impide que se vean sus ficheros si se explora el sistema desde el explorador. Se suele copiar en:

C:\$recycle$

Que queda invisible al explorador. Se puede consultar sin embargo, desde la línea de comando.


Hasta aquí "normal", esto ya lo hacía Zeus desde 2006 y rootkits en años anteriores. Algo que lo diferencia de algunas versiones de Zeus, es que SpyEye es invisible también en línea de comando, gracias a que modifica el comportamiento de dos funciones de Windows a bajo nivel: NtQueryDirectoryFile y NtVdmControl.

En la captura, en el directorio $recycled$ falta un ejecutable. ¿Dónde está? Lo que vemos es el archivo de configuración. El archivo está ahí, incluso oculto para el cmd. Si intentamos copiar cualquier fichero en la misma ruta... nos dice que ese nombre ya está siendo usado.

 
Ocultación en el registro

Durante el análisis de este tipo de malware, una técnica habitual es comprobar con la herramienta Autoruns qué se arranca en Windows. Autoruns recopila de forma muy eficaz todos los puntos que pueden servir para lanzar código que se inicia con el sistema operativo. ¿Dónde se ubican estas versiones de SpyEye para lanzarse en el inicio? Mientras que Zeus trabaja en la shell del Winlogon (más "rebuscado"), esta versión de SpyEye, sorprendentemente, utiliza una zona muy común para arrancar programas en el inicio:

HKLM\Software\Microsoft\Windows\CurrentVersion\run

... pero que se oculta, tanto a los ojos la herramienta "normal" de registro (regedit), como para Autoruns. De nuevo el rootkit de este malware va un poco más allá (los rootkits como tal, insistimos, ya contiene estas técnicas desde hace tiempo). En este caso, parchea en memoria la API NtEnumerateValueKey, que usa ntdll.dll. Esto es muy eficaz, puesto que la API se encuentra a muy bajo nivel. Es decir, cualquier programador usará APIs comunes como RegEnumValue o RegOpenKey, pero estas, internamente, llamarán a NtEnumerateValueKey. Con esto consigue engañar a la inmensa mayoría de programas que quieran leer el registro... aunque no a todos

Autorunsc, el más sincero

Como curiosidad, parece que una de las versiones de SpyEye comete algún tipo de error a la hora de "parchear" en memoria la función. Así, permite que, la primera vez que se lanza Autorunsc (la versión de línea de comandos de Autorun), se pueda leer bien el registro, mientras que en sucesivas consultas... se oculta.


 
Esta imagen lo resume un poco todo. La entrada "oficial" en el registro es solo la correspondiente a ctfmon.exe. Sin embargo, existe otra que solo se puede "ver" en el resultado de Autorunsc después de la infección, volcado en un texto. Se observa la entrada:

YZ5CZHZY5D1EWA9X
     C:\$Recycle$\B8DEA5BBC55.exe /q
     c:\$recycle$\b8dea5bbc55.exe
     7678946538a76066a7d0829584eaa0e3 (MD5)
     9c36092b853526aa340239ac70f5dfb1ced1e921 (SHA-1)
     e20b15ec8f0a5cffce47923dc79934e8c6dd9295c7256881f3d399632e7eaa90
(SHA-256)

Invisible al resto de programas. Si se lanza de nuevo autorunsc y se consulta el registro... desaparecerá. El funcionamiento interno de Autorun y Autorunsc es el mismo, llaman a las mismas API de sistema para leer los valores del registro, así que solo cabe achacar el comportamiento a algún error del troyano, que subsana en sucesivas consultas.

Más curioso todavía

¿Qué hacer entonces para eludir el parcheo en memoria que hace el troyano? Como hemos dicho, lanzando autorunsc.exe la primera vez, será incapaz de ocultarse. Pero existe otro método. SpyEye no afecta a los procesos que se llamen skype.exe. Lo tiene "incrustado" en su código. No es una "puerta trasera" sino que muy probablemente, lo hará para que no le llegue tanto tráfico desde esa aplicación, que quizás no le interese. Así, si renombramos autorunsc.exe a skype.exe, el valor oculto volverá a aparecer. Se observa en la figura el incremento de tamaño del fichero de texto resultante con uno y otro nombre. El aumento de tamaño corresponde a la entrada oculta.


Igualmente, renombrando autoruns.exe a skype.exe, se ve gráficamente la entrada.


Más información:

Bypassing the SpyEye "rootkit", or how to perform a quick disinfection

Analysis of TR/Spy.SpyEye

Vídeo: Así funciona SpyEye (I)

Así funciona SpyEye (y II)


 
Sergio de los Santos
Twitter: @ssantosv

5 comentarios:

  1. ...Perdonad que me repita con el comentario: Esto sí es divulgación científica en estado puro. En una palabra "encomiable".

    ResponderEliminar
  2. Mis felicitaciones a Sergio por este excelente análisis.

    ResponderEliminar
  3. Agradecer y reconocer esta publicación, el trabajo es bueno, estoy buscando tiempo para leer el informe original, si es que me lo envian.
    No he visto ByteHero en la lista, alguien sabe si ha sido evaluado?

    ResponderEliminar
  4. Gracias por la información al equipo de una al dia y a Sergio, esto nos ayuda a ver las vulnerabilidad des los sistemas antivirus.
    Tengo una duda,
    ?se les notifica a las compañias de antivirus para actualizen sus sistemas?
    Gracias, Saludos.

    ResponderEliminar
  5. Qué buen trabajo, Felicitaciones!, nos aporta muchísimo...

    ResponderEliminar