El payload que puede tirar un código malicioso al infectar un sistema puede tener los más diversos objetivos; entre algunas de las acciones que nos podemos encontrar se encuentran los Bitcoin Miners. Los cibercriminales buscan aprovecharse de los recursos de los sistemas que infectan y así tomar el control, robar información, o como veremos en este post, minar ciertas monedas criptográficas para generarle una ganancia al atacante.

El archivo malicioso que vamos a analizar es detectado por los productos de ESET como una variante de Win32/CoinMiner.LV y utiliza diferentes técnicas para evitar ser analizado, como así también evitar ejecutarse en entornos virtuales. Cuando comenzamos el análisis de esta amenaza en un desensamblador como IDA Pro, nos encontramos con diferentes comprobaciones para saber si estaba siendo analizado con un debugger:

desensamblador

Entre las técnicas que nos encontramos están la llamada a IsDebuggerPresent, CheckRemoteDebuggerPresent y la comprobación de PEB (Process Environment Block) del proceso para ver si estaba habilitado el flag de debug. Luego de pasar las comprobaciones, el malware pasa a la sección principal, donde busca tres recursos diferentes que se encuentran en la sección .rsrsc:

recursos-directorio

De la imagen anterior podemos ver que existen los recursos RT_RCDATA 0, 1 y 2 que son cargados antes de realizar cualquier otra acción al cargar la segunda parte de este código malicioso:

GetResources Code

Más adelante, vimos que utilizaba estos recursos repetidamente a lo largo de su ejecución; luego de analizar el binario vimos que cada uno de ellos se convertía en:

  • Resource “0”: contiene la URL del pool al que se va a conectar el miner. El contenido está cifrado
  • Resource “1”: contiene la clave de cifrado para descifrar los otros dos resources
  • Resource “2”: es el más grande y contiene un archivo ejecutable cifrado

Para descifrar los recursos que están cifrados dentro del ejecutable utiliza la función con el siguiente prototipo para descifrar los recursos:

int descifrarRes(void* cifrado, void* clave, int size_clave, void* buffer)

El mismo está compuesto por algunas comprobaciones y dos xor:

xor

En forma simplificada, cada caracter descifrado se obtiene de la siguiente forma:

descifrada[i] = clave[i] XOR cifrada[(size_cifrada - 1) - 32 + (i mod 32)] XOR cifrada[i]

Es decir que en primera instancia se va tomando cada byte de la clave y se le aplica una operación de XOR. Para el segundo operando se toman los últimos 32 bytes del texto cifrado, también de a uno por vez. Cuando se pasa del final, se vuelve al comienzo del intervalo (por ello se toma el resto de la división por 32). Y luego se aplica el segundo XOR, con cada byte de la cadena cifrada, pero esta vez desde el comienzo.

Así, el resource “0” se vuelve visible:

“-a scrypt -o stratum+tcp://eu.ltcrabbit.com:3333 -u YouMother92.Miner -p x -g no -t 2”

Vemos que son los parámetros para la ejecución de un miner que se conecta a ltcrabbit.com (Litecoins) con el usuario “YouMother92.Miner” y contraseña “x”. También vemos que el algoritmo usado es scrypt, aunque el sitio también ofrece la alternativa de X11. Si bien X11 puede llegar a ser más rápido, requiere el uso intensivo de GPU. No pudiendo garantizar que la máquina infectada posea GPU, entendemos la elección de los cibercriminales de usar scrypt.

Luego se aplica la misma rutina de descifrado al resource “2”. Sin embargo, esto devuelve un contenido que tiene una capa más de cifrado, para lo cual se invoca a otra subrutina. Vemos la estructura de esta segunda función de descifrado en la siguiente imagen:

Funciones-descifrado

Luego del descifrado, queda un ejecutable en memoria que podemos volcar. El archivo resultante tiene SHA-1 igual a 5f3d01baa567d8b5e32ae933f94472d1d40aaf0e. Que no es más ni menos que una aplicación para minar Bitcoins, o Litecoins este caso. Así, y con lo que hemos visto hasta el momento, podemos suponer que el malware va a ejecutar un cliente de mining, con los parámetros y la URL que se descifraron previamente.

Sin embargo, el ejecutable que ha sido descifrado en memoria no será escrito al disco, sino que será inyectado en la imagen de otro proceso, a través de la técnica conocida como Process Replacement. Para ello, la siguiente acción que realiza el malware consiste en buscar y ejecutar “C:\Windows\Microsoft.NET\Framework\v2.0.50727\vbc.exe”.

A continuación la imagen del respectivo CreateProcess:

CreateProcess

Se observa cómo se lanza una aplicación no maliciosa (vbc.exe, el compilador de Microsoft Visual Basic) con los argumentos que vimos antes. En la misma rutina que se invoca CreateProcess también se llama a NtUnmapViewofSection, WriteProcessMemory y ResumeThread, con lo cual se remplaza la imagen de vbc.exe con el miner que se descifró en memoria. Esa rutina tiene una disposición lineal, y en la siguiente imagen mostramos una parte:

Process Replacement

Luego de esto, el miner queda trabajando bajo el nombre de vbc.exe, mientras que el malware entra en un bucle de comprobación de procesos de análisis.

Process Check

Así, cada segundo se itera por los procesos que están en memoria, buscando los que se observan en la imagen anterior. Si alguno de ellos es encontrado (es decir, si alguno de ellos está siendo ejecutado) se termina la ejecución, evitando así que se estudie el programa malicioso o el usuario se dé cuenta de que alguien está minando Litecoins con su sistema sin su permiso.

Por otro lado, resulta curioso que en la lista no aparezcan aplicaciones de monitoreo de tráfico de red, tal como Wireshark. De hecho, si capturamos el tráfico en la máquina infectada, vemos la comunicación con el servidor:

Wireshark-miner

Esta familia de malware es normalmente distribuida por otros códigos maliciosos, que además de robar información utilizan este tipo de acciones para generar otro tipo de ganancia a los atacantes. Por otro lado, en este post vimos algunas técnicas que los cibercriminales suelen utilizar para ocultar diferentes amenazas dentro de un mismo código malicioso, ya sea utilizando una imagen o simplemente ocultándolos en los recursos del programa.