En 2009, se llevó a cabo una conferencia científica internacional en Houston, EE.UU. Participaron los principales científicos de varios países. Como suele suceder al terminar estos eventos, los organizadores les envían a los participantes un CDROM con las presentaciones y fotografías de la conferencia. Ni remotamente se imaginaban los destinatarios del CDROM que mientras disfrutaban de las imágenes y recuerdos de su participación, un troyano con respaldo gubernamental se estaba activando en secreto en sus equipos.
Presentación de diapositivas del CD
Curiosamente, al parecer la mayoría de los asistentes llevaron lapicero y papel en lugar de laptops.
Autorun que auto-levanta
El disco contiene dos ficheros en la carpeta raíz; autorun.inf y autorun.exe. Esto es común en muchos CDROMs. El fichero autorun.inf sólo ejecuta el principal EXE desde la carpeta raíz. Y luce así:
icon=PresentationShow.exe,0
Más interesante es el binario autorun.exe, que posee los siguientes atributos:
Fecha de compilación | 2009.12.23 13:37:33 (GMT) |
Tamaño | 62464 bytes |
MD5 | 6fe6c03b938580ebf9b82f3b9cd4c4aa |
Al iniciarse, el programa verifica los privilegios actuales del usuario. Si el usuario actual no tiene permisos administrativos, intentará elevar los privilegios mediante tres diferentes exploits que abusan de vulnerabilidades en el núcleo de Windows. Estas vulnerabilidades se repararon con los siguientes parches de Microsoft:
- MS09-025
- MS12-034
- MS13-081
Considerando la fecha en que se envió el CDROM, significa que dos de los exploits eran día-cero. Es notable que el código intente diferentes variantes de exploits del núcleo (o kernel exploits), y en un bucle, una por una, hasta que una de ellas tenga éxito. El conjunto de exploits de la muestra en el CDROM incluye sólo tres exploits, pero este paquete de explotación soporta la ejecución de hasta 10 exploits distintos, uno tras otro. No queda claro si esto significa que también existe un programa malicioso que contenga 10 exploits para escalar privilegios (EoP), o si sólo se trata de una limitación lógica.
El código posee cargas separadas para Windows NT 4.0, 2000, XP, Vista y Windows 2008, incluyendo variantes para ciertas versiones del paquete de servicio. En realidad, se ejecuta dos veces: primero, para escalar privilegios temporalmente, y después para agregar al usuario actual al grupo de administradores locales del equipo, para la persistencia de los privilegios elevados.
Si estas acciones eran exitosas, el módulo iniciaba otro ejecutable del disco, mostrando la presentación de diapositivas con imágenes de la conferencia de Houston.
Al final, justo antes de finalizar la ejecución, el código corre un procedimiento adicional que realiza algunas comprobaciones especiales. Si la fecha de ejecución cae antes del 1œ de julio del 2010 y no se detecta la presencia de Bitdefender Total Security 2009/2010 o de algún producto de Comodo, procede a cargar un archivo DLL adicional, llamado “show.dll” desde el disco, espera siete segundos, desmonta el DLL y sale.
Si la fecha cae después del 1œ de julio de 2010, o si cualquiera de los productos mencionados está instalado, suspende inmediatamente la ejecución.
El “Show” comienza: DoubleFantasy entra en escena
El cargador principal y la herramienta de elevación de privilegios, “autorun.exe” activa un descargador especial, que en realidad es un instalador de implantes DoubleFantasy del grupo Equation. Este instalador se guarda como “show.dll” en la carpeta “Presentación” del CDROM.
El fichero DLL posee los siguientes atributos:
Fecha de compilación | 2009.03.20 17:42:21 (GMT) |
Tamaño | 151’552 bytes |
MD5 | ef40fcf419954226d8c029aac8540d5a |
Nombre de fichero | show.dll |
Breve descripción | Instalador de DoubleFantasy |
Primero encuentra los datos en la sección de recursos, descomprime (UCL) y descifra con XOR los datos de configuración de uno de los recursos.
Después crea las siguientes llaves de registro:
- HKEY_LOCAL_MACHINESoftwareClassesCLSID{6AF33D21-9BC5-4f65-8654-B8059B822D91}
- HKEY_LOCAL_MACHINESoftwareClassesCLSID{6AF33D21-9BC5-4f65-8654-B8059B822D91}Version
De ahí define el valor (Default) para la sub-llave “Version” como “008.002.000.003”, identificando la versión del implante.
También intenta auto-eliminarse en el próximo reinicio, lo cual falla si se inicia desde el CD.
Al ser ejecutado por el paquete de explotación "Autorun.exe", el programa ya posee privilegios de administrador gracias a uno de los tres exploits. Sin embargo, el código vuelve a verificar si se está siendo ejecutado con privilegios de administrador, e intenta elevarlos mediante dos vulnerabilidades del núcleo:
- MS09-025
- MS12-034
Esto indica que el instalador DoubleFantasy está diseñado para ejecutarse independientemente del disco de Houston con su “Autorun.exe”. En realidad, también hemos observado el uso independiente del instalador DoubleFantasy en otros casos.
El instalador verifica la presencia de soluciones de seguridad mediante una lista de llaves y valores de registro guardados en la sección de recursos. Revisa las llaves de una forma delicada y "sin llamar la atención" enumerándolas en lugar de acceder directamente a ellas. Esta es la lista de las llaves de nivel superior revisadas:
- HKLMSoftwareKasperskyLabprotectedAVP7profilesBehavior_Blockingprofilespdmsettings
- HKLMSoftwareKasperskyLabAVP6profilesBehavior_Blockingprofilespdmsettings
- HKLMSoftwareAgnitumOutpost Firewall
- HKLMSoftwarePWI, Inc.
- HKLMSoftwareNetwork IceBlackIce
- HKLMSoftwareS.N.Safe&Software
- HKLMSoftwarePCToolsThreatFire
- HKLMSoftwareProSecurity
- HKLMSoftwareDiamond Computer Systems
- HKLMSoftwareGentleSecurityGeSWall
Si cualquiera de ellas está presente, el instalador marcará el sistema al definir una llave de registro especial:
HKEY_LOCAL_MACHINESoftwareClassesCLSID {6AF33D21-9BC5-4f65-8654-B8059B822D91}MiscStatus
Esta señal tendrá el formato {CE0F7387-0BB5-E60B-xxxx-xxxxxxxxxxxx} como el valor (Default) de los datos y la ejecución concluirá.
Si no ha detectado ninguna solución de seguridad, procederá a descomprimir (UCL) y descifrar con XOR la carga útil, que se extrae en %system%ee.dll.
Curiosamente, el DLL se carga utilizando su propio cargador personalizado en lugar de utilizar la llamada API estándar del sistema, LoadLibrary.
El módulo parece estar compilado con un conjunto de componentes o bibliotecas que realizan lo siguiente:
- Elevación de privilegios (parece ser una versión temprana de la misma librería utilizada en autorun.exe).
- Detección de soluciones de seguridad.
- Análisis y descompresión de recursos.
- Carga de archivos PE.
Este librería de código soporta Win9x y la familia Windows NT desde NT4.0 a NT6.x. Es importante notar que estas librerías no están muy bien fusionadas. Por ejemplo, no se utilizan ciertas partes del código.
Así se ve el bloque de configuración decodificado de DoubleFantasy:
Bloque de configuración decodificado de DoubleFantasy
Algunos de los servidores C&C de la configuración de DoubleFantasy:
- 81.31.34.175 (República Checa)
- 195.128.235.231 (Italia)
El malware DoubleFantasy copiado en el equipo de su víctima tiene las siguientes propiedades:
Fecha de compilación | 2009.03.31 15:32:42 (GMT) |
Tamaño | 69632 bytes |
MD5 | b8c0eb946de83fe8440fefbacf7de4a2 |
Nombre de fichero | ee.dll |
Breve descripción | Implante DoubleFantasy |
Vale la pena remarcar que tanto el instalador como el malware parecen haberse compilado varios meses antes que el “autorun.exe” incluido en el CDROM, lo que sugiere que los implantes más o menos genéricos. También deja entrever que el “autorun.exe” probablemente se compiló especialmente para el ataque a través del CDROM.
El implante DoubleFantasy del grupo Equation es un troyano validador que envía a los atacantes información básica sobre el sistema. También les permite cargar una plataforma troyana más sofisticada, como EquationDrug o GrayFish. En general, una vez que se instala una de estas plataformas sofisticadas, los atacantes eliminan el implante DoubleFantasy. En caso de que la víctima no sea la adecuada, por ejemplo, si se trata de un investigador de malware, los atacantes sencillamente eligen desinstalar el implante DoubleFantasy y limpiar el equipo de la víctima.
En realidad, hay varias versiones conocidas de la carga útil de DoubleFantasy. El disco de Houston usó la versión 8.2.0.3, mientras que otras versiones se propagaban principalmente a través de exploits-de-web.
Al descifrar los bloques de configuración de todas las muestras conocidas de DoubleFantasy, obtuvimos los siguientes números internos de las versiones:
- 8.1.0.4 (MSREGSTR.EXE)
- 008.002.000.006
- 008.002.001.001
- 008.002.001.004
- 008.002.001.04A (subversión "IMIL3.4.0-IMB1.8.0")
- 008.002.002.000
- 008.002.003.000
- 008.002.005.000
- 008.002.006.000
- 011.000.001.001
- 012.001.000.000
- 012.001.001.000
- 012.002.000.001
- 012.003.001.000
- 012.003.004.000
- 012.003.004.001
- 013.000.000.000
Curiosamente, las versiones más populares son la 8 y la 12:
Describiremos algunas de las versiones que logramos descubrir, incluyendo 8.2.0.3, 8.1.0.4 y 12.2.0.1.
Carga útil de DoubleFantasy v.8.2.0.3
Md5 | b8c0eb946de83fe8440fefbacf7de4a2 |
Tamaño | 69’632 bytes |
Tipo | Win32 GUI DLL |
Marca de tiempo | Mar 31.03.2009 14:32:42 (GMT) |
Nombres de fichero | ee.dll, actxprxy32.dll |
Este módulo utiliza una técnica conocida como secuestro DLL COM que permite cargar el código en diferentes procesos.
Inicialización
En primer lugar, verifica si el módulo en ejecución se llama “ee.dll”; de ser así, procede con los pasos finales de la instalación:
- Intenta encontrar los ajustes de configuración en la llave de registro HKEY_LOCAL_MACHINESoftwareClassesCLSID{6AF33D21-9BC5-4f65-8654-B8059B822D91}TypeLib, en valor "DigitalProductId". Si este valor existe, lo decodifica con base64 y lo descifra con RC6 (con una llave hexadecimal de 16 bytes: 66 39 71 3C 0F 85 99 81 20 19 35 43 FE 9A 84 11).
- Si la llave no se encuentra en el registro, carga la configuración desde un recurso.
- Se auto-copia en una de las dos variantes de los nombres de archivo. Después sustituye uno de los componentes del sistema al renombrar y remplazar el original.
Fichero original | Llave de registro | Valor de registro | Nuevo valor (Variante 1) | Nuevo valor (Variante 2) |
linkinfo.dll | HKLMSystemCurrentControlSet ControlSessionManagerKnownDLLs | LINKINFO | LI.DLL | LINK32.DLL |
hgfs1.dll | HKLMSYSTEMCurrentControlSet Serviceshgfsnetworkprovider | ProviderPath | hgfs32.dll | hgfspath.dll |
midimap.dll | HKLMSOFTWAREMicrosoft Windows NTCurrentVersionDrivers32 | midimapper | midimapper.dll | midimap32.dll |
actxprxy.dll | HKCRCLSID {C90250F3-4D7D-4991-9B69-A5C5BC1C2AE6} InProcServer32 | (Default) | actxprxy32.dll | actxprxyserv.dll |
- Fija el valor 64-bit de config al valor (Default) de la llave HKEY_LOCAL_MACHINESoftwareClassesCLSID{6AF33D21-9BC5-4f65-8654-B8059B822D91}TypeLib en el formato {8C936AF9-243D-11D0-xxxx-xxxxxxxxxxxx}, parece que después se usa como un identificador de la víctima cuando esta se conecta al servidor C&C.
- Define el valor (Default) de la llave HKEY_LOCAL_MACHINESoftwareClassesCLSID{6AF33D21-9BC5-4f65-8654-B8059B822D91}Version al string "008.002.000.003" .
- Tras la creación de una llave, procede con pasos adicionales para establecer derechos de KEY_ALL_ACCESS al grupo ‘Todos’.
- Actualiza la hora de inicio, codifica y vuelve a escribir config en el valor de registro HKEY_LOCAL_MACHINESoftwareClassesCLSID{6AF33D21-9BC5-4f65-8654-B8059B822D91}DigitalProductId.
Si ocurre un error, fija el valor “0” a la llave HKEY_LOCAL_MACHINESoftwareClassesCLSID{6AF33D21-9BC5-4f65-8654-B8059B822D91}MiscStatus(Default). El valor de registro {CE0F7387-0BB5-E60B-8B4E-xxxxxxxxxxxx} entonces contiene un código de error cifrado con xor.
Si ocurre un error de inicialización, si el proceso de hosting es “explorer.exe” o “avp.exe”, suprime todas las excepciones y continúa con la ejecución. Esto podría significar que si hubiera errores en estos procesos, no hay que suspenderlos por ellos.
Para secuestrar correctamente los objetos COM remplazados, el código exporta un conjunto de funciones vinculadas a los ficheros DLL originales.
CompareLinkInfoReferents = linkinfo.CompareLinkInfoReferents
CompareLinkInfoVolumes = linkinfo.CompareLinkInfoVolumes
CreateLinkInfo = linkinfo.CreateLinkInfo
DestroyLinkInfo = linkinfo.DestroyLinkInfo
DisconnectLinkInfo = linkinfo.DisconnectLinkInfo
DllCanUnloadNow = actxprxy.DllCanUnloadNow
DllGetClassObject = actxprxy.DllGetClassObject
DllRegisterServer = actxprxy.DllRegisterServer
DllUnregisterServer = actxprxy.DllUnregisterServer
DriverProc = midimap.DriverProc
GetCanonicalPathInfo = linkinfo.GetCanonicalPathInfo
GetLinkInfoData = linkinfo.GetLinkInfoData
GetProxyDllInfo = actxprxy.GetProxyDllInfo
IsValidLinkInfo = linkinfo.IsValidLinkInfo
NPAddConncection = hgfs1.NPAddConncection
NPAddConncection3 = hgfs1.NPAddConncection3
NPCancelConncection = hgfs1.NPCancelConncection
NPCloseEnum = hgfs1.NPCloseEnum
NPEnumResource = hgfs1.NPEnumResource
NPFormatNetworkName = hgfs1.NPFormatNetworkName
NPGetCaps = hgfs1.NPGetCaps
NPGetConnection = hgfs1.NPGetConnection
NPGetResourceInformation = hgfs1.NPGetResourceInformation
NPGetResourceParent = hgfs1.NPGetResourceParent
NPOpenEnum = hgfs1.NPOpenEnum
ResolveLinkInfo = linkinfo.ResolveLinkInfo
modMessage = midimap.modMessage
modmCallback = midimap.modmCallback
Los implantes ejecutan periódicamente verificaciones comparando con un archivo especial definido en config. Si ese archivo ha cambiado desde la última verificación, o ha transcurrido al menos una semana desde la última verificación, hace lo siguiente:
- Comprueba la conectividad mediante dominios públicos (especificados en config, como "www.microsoft.com" y "www.yahoo.com") usando peticiones HTTP POST.
- Si dispone de acceso a Internet, se conecta a una o dos IPs o hostnames de C&Cs (especificados en config: i.e. 81.31.34.175 y 195.128.235.23). Prueba los puertos estándar HTTP/HTTPS, 80 y 443 respectivamente.
- Envía una petición POST al C&C con encabezados adicionales “EIag: 0d1975bfXXXXXXXX9c:eac’,0Dh,0Ah", donde XXXX XXXX – es parte del identificador de la víctima.
- Solicita datos adicionales: identificador de la víctima, versión, y direccion MAC. Los datos se cifran con RC6 y se codifican con Base64 (Llave RC6: 8B 4C 25 04 56 85 C9 75 06 33 C0 5E C2 08 31 F6).
El código de comunicación con el C&C realiza lo siguiente:
- Se decodifican los datos recibidos con Base64 y se descifran con RC6. El resultado se interpreta como un comando de puerta trasera.
- Los resultados de la ejecución del comando se envían al C&C. De ahí intenta traer el siguiente comando desde el servidor.
- Se auto-desinstala si no puede conectarse al servidor C&C dentro de 180 días (configurable).
La puerta trasera soporta los siguientes comandos:
Código Cmd | Nombre del comando | Descripción |
Download&Run Group | ||
J (0x4a) | Create File | Crea un archivo vacío; si el archivo ya existe obtiene su tamaño. |
D (0x44) | Append File | Agrega un trozo de datos a un fichero (creado por “J” cmd). |
V (0x56) | Run or Copy |
Verifica el CRC16 del fichero recibido por el comando D; lo elimina si la verificación falla.
Carga DLL usando un cargador personalizado y llama a la exportación “dll_u”. |
Upload Group | ||
K (0x4b) | Get File Size | Obtiene el tamaño del archivo. |
S (0x53) | Read File | Lee el archivo especificado por el comando ‘K’ y lo envía al C&C. Puede eliminar el archivo después de la transferencia (bajo cierta condición). |
Service Group | ||
` (0x60) | Get Info | Recopila informacion (direcciones IP y MAC, versión del implante, servidor proxy del sistema, propietario y organización de la registración de Windows, versión de Windows e ID del producto, idioma local y país, ruta del directorio de Windows, tipo de conexión, lista de todas las sub-llaves de HKLMSoftware). |
p (0x70) | Set Victim ID | Se prepara para cambiar el identificador de la víctima. |
u (0x75) | Set Interval | Cambia el intervalo de conexión con el C&C (siete días por defecto). |
v (0x76) | Set C&C IP | Cambia la dirección IP primaria del C&C. |
x (0x78) | Set File Path | Cambia la ruta y nombre del archivo-bajo-inspección. |
(0x80) | Read File | Elimina el archivo especificado en el comando. |
B (0x42) | Reset Victim ID | Cambia la identification de la víctima a la definida por el comando Set Victim ID Subcmd 0 – volver a conectarse con el C&C Subcmd 1 – restaurar el contexto RC6 Subcmd 2 – desinstalar |
Carga útil de DoubleFantasy v.8.1.0.4
Localización | %System%MSREGSTR.EXE |
MD5 | 9245184228af33d3d97863daecc8597e |
Tamaño | 31’089 |
Tipo | Win32 GUI EXE |
Marca de tiempo | Mie 22.03.2006 18:25:55 (GMT) |
Info de versión | Descripción del archivo Registro del software Derechos de autor Copyright © Microsoft Corp. 1993-1995 Nombre de la compañía Microsoft Corporation Versión del fichero 4.00.950 Nombre interno MSREGSTR Nombre original del fichero MSREGSTR.EXE |
En comparación con la versión 8.2, la versión 8.1 implementa las mismas tareas de forma un poco diferente.
Diferencias:
- Este es un archivo EXE que se ejecuta como un proceso de servicio.
- Los datos de configuración guardados en lo sobrescrito (overlay) del archivo, en lugar de en recursos.
- Se usan otras llaves de registro como almacenamiento de config – conjunto de sub-llaves bajoš HKLMSoftwareMicrosoftWindows CurrentVersionSetupCommon
- No se usa el cifrado RC6 ni la codificación Base64. Los datos del tráfico de red se envían en texto plano o se cifran con XOR.
- La cantidad de comandos a distancia soportados consiste de tan sólo cuatro.
- El tipo de codificación del comando es diferente.
- Soporta la familia Windows 9x.
Carga útil de DoubleFantasy v.12.2.0.1
Localización | %System%actxprxy32.dll |
MD5 | 562be0b1930fe5de684c2c530619d659769d099781220004540a8f6697a9cef1 |
Tamaño | 151552 |
Tipo | Win32 GUI DLL |
Marca de tiempo | Mie 04.08.2004 07:55:07 (GMT), probablemente falsa |
La implementación de la versión 12.2 es similar a la de la versión 8.2, aunque tiene el doble de tamaño debido a la adición de una librería grande nueva.
El propósito principal de esta nueva librería es robar los nombres de usuario y contraseñas de:
- Internet Explorer en ejecución o la memoria del navegador Firefox;
- la configuración proxy de Internet Explorer, guardada en el registro de Windows;
- el almacenamiento protegido de Windows (hasta Windows XP);
- el subsistema de autenticación de Windows (Vista+).
Además de los navegadores, la librería también puede inyectar código malicioso y leer la memoria de otros procesos para obtener y descifrar las contraseñas de los usuarios. La misma librería también se usa dentro del orquestador principal EQUATIONDRUG y los módulos TRIPLEFANTASY.
La librería recopila las credenciales robadas y después las prueba cuando accede al servidor proxy mientras se conecta a Internet, y si la prueba tiene éxito, las credenciales válidas se cifran con RC6 y codifican con BASE64 para su uso posterior.
En esta versión la llave de cifrado de datos RC6 es:
66 39 71 3C 0F 85 99 81 20 19 35 43 FE 9A 84 11
La llave de cifrado de tráfico RC6 es:
32 EC 89 D8 0A 78 47 22 BD 58 2B A9 7F 12 AB 0C
Los datos robados del usuario se guardan en el registro de Windows como valor @WriteHeader, dentro de dos llaves aleatorias en el nodo HKLMSOFTWAREClassesCLSID {77032DAA-B7F2-101B-A1F0-01C29183BCA1}Containers.
Resumen
El disco CDROM utilizado en el ataque de Houston representa una operación rara e inusual para el grupo Equation. Suponemos que estos ataques están diseñados sólo para víctimas importantes que de otra forma eran inalcanzables, por ejemplo, a través de un vector de ataque basado en el uso de Internet. Esto queda confirmado por el hecho de que la librería de explotación contenía tres exploits, dos de los cuales era día-cero en ese entonces.
El programa malicioso DoubleFantasy es el primer paso en la infección de una víctima por el grupo Equation. Una vez que la víctima ha sido confirmada mediante comunicación con la puerta trasera y la verificación de varios parámetros del sistema, se instala un sistema de programas maliciosos más sofisticados, como EquationDrug o Grayfish.
En próximas entregas continuaremos describiendo las familias de programas maliciosos más sofisticados que utiliza el grupo Equation: EquationDrug y GrayFish.
Grupo Equation: de Houston con amor