malware de NodeJS: Cómo revertir y encontrar al autor

malware de NodeJS

Cómo revertir un malware de NodeJS y encontrar al autor

Malware de NodeJS por The Devops Guy (autor)

Para dar un poco de contexto, soy un administrador de Discord en un pequeño servidor sobre desarrollo, y recientemente recibimos un informe de uno de nuestros usuarios de que alguien estaba tratando de que descargara un archivo EXE.

Lo primero que hice fue preguntarle al reportero si abrió el expediente, a lo que contestó que sí. Me dijo que el programa abrió un indicador de consola durante unos segundos y luego salió. La mayoría de las veces, esto no es bueno cuando ha descargado un archivo de una fuente que no es de confianza…

Así que agarré mi computadora y descargué el archivo (lo descargué en una máquina virtual Linux, así que si se infecta de alguna manera, puedo eliminar la máquina virtual). Hora de investigar.


Determinar el tipo de binario

Mi primera idea fue buscar lo que había en este ejecutable. Para hacerlo, usé el comando de strings como este:

> strings file.exe

El comando strings encuentra las cadenas imprimibles en un archivo binario. Es útil ver cadenas como URL o direcciones incrustadas en un archivo.

Esto devolvió un galimatías para la mayor parte del resultado, pero en algún momento, vi NodeRuntime. ¡Ahora podemos decir que es un ejecutable incluido en NodeJS!

En ese tipo de ejecutables, las fuentes siempre están presentes al final de la salida de las strings. Echemos un vistazo a esas fuentes:

function a0_0x47b121(_0x44bb58,_0x4e9d60,_0x355d77,_0x4e9d34,_0x1a193e){return a0_0x1b80(_0x1a193e- -0x1e4,_0x44bb58);

El código parece ofuscado y minimizado en una línea muy larga…

Apliqué el siguiente método para comprender la lógica detrás del código ofuscado.

Primer acercamiento: Discord

Sabía que este binario se distribuía a través de Discord DM, así que busqué si el código contenía la palabra discord con grep. ¡Bingo!

Varias funciones contienen la palabra discordlistDiscords , startDiscord , killDiscord and pwnBetterDiscord.  Esta última función parecía prometedora.

Busqué pwnBetterDiscord en Google y Github y encontré la fuente de la herramienta: https://github.com/Stanley-GF/PirateStealer.

PirateStealer

Hemos encontrado el código fuente que se usó en la aplicación incluida. Echémosle un vistazo.

Roba toda la información que puede encontrar del cliente de Discord eliminando primero al cliente de Discord y parchándolo con una carga útil de Javascript para filtrar información privada como credenciales de Discord e información de tarjetas de crédito a través de un webhook de Discord (una URL donde puede POST para enviar un mensaje a su servidor Discord).

El autor afirma que esta herramienta es solo para fines educativos, pero también vende funciones y soporte premium. Eso no parece una afirmación justa de “propósitos educativos”…

Encontrar la URL del webhook a partir del código ofuscado

El código está lleno de muchas funciones de proxy que intentan ofuscar el acceso a la función principal de ofuscación de cadenas. Gracias a que el código no está completamente ofuscado, podemos encontrar  webhook=a0_0x78da73(0x331,0x342,0x32c,0x2f1,0x324). Juguemos un juego y extraigamos todos los métodos necesarios para descifrar este código. En aras de la brevedad, cambiaré el nombre de todas las funciones ofuscadas a fn1 , fn2… y sus parámetros p1 , p2

a0_0x78da73 (llamémoslo fn1) toma 5 argumentos pero solo le importa el primero y el último:

function fn1(p1,p2,p3,p4,p5){return fn2(p5 - 0x26a,p1);}

fn2 es más complicado, con vectores de inicialización y rotaciones complejas, pero podemos pasar por alto la complejidad llamando a esta función directamente. ¡Vamos a hacer eso!

Creé un nuevo archivo llamado find_webhook.js que copia el código necesario para ejecutar fn2 y console.log(fn2(0x324 — 0x26a, 0x331)), y… ¡lo tenemos! La salida es https://ptb.discord.com/api/webhooks/abcdefg/hijklmn (salida censurada por motivos de privacidad).

Encontrar el usuario del script

Luego usé el webhook para enviarles mensajes diciéndoles que sabía lo que estaban haciendo y diciéndoles que me enviaran un mensaje privado con mi ID de discordia, con la esperanza de que me respondieran. ¡Y lo hicieron!

A partir de eso, no hay más que decir, la discusión no fue muy productiva, pero al menos pude decirles a otros servidores que teníamos en común que el malo también estaba en su servidor.

Espero que esta publicación aliente a las personas a ser más consideradas al descargar ejecutables de fuentes no confiables y ayude a otros a ver cómo podemos revertir los malware de NodeJS, que se usan cada vez más en la actualidad.


Si le interesa, puede echar un vistazo a algunos de los otros artículos que he escrito recientemente sobre Laravel:

Recent Post