ESXiARGS Ransomware

ESXiArgs Ransomware (2023) – Cómo recuperar una máquina virtual sin snapshots

El pasado mes de febrero, miles de servidores ESXi se vieron afectados por un nuevo ataque ransomware (denominado ESXiARGS) dirigido a los servidores a través de un fallo de seguridad ( identificado como CVE-2021-21972, CVE-2021-21973 y CVE-2021-21974), causado por un problema de desbordamiento de memoria heap en el servicio OpenSLP. Los sistemas atacados parecen ser hipervisores ESXi en la versión 6.x y anteriores a la 6.7.

En este artículo repasaremos los pasos para recuperar máquinas virtuales que NO tienen snapshots (archivos -delta o -sesparse), sólo un archivo VMDK plano. En este punto, no parece que haya un proceso que funcione para todos para recuperar exitosamente máquinas virtuales completas o sus datos si estos tenían snapshots (-delta). Algunas personas parece que han sido capaces de recuperar máquinas virtuales que tenían instantáneas -sesparse.

Voy a asumir que ya has detenido el ataque y recuperado el control en tu Hipervisor ESXi, y centrarme únicamente en recuperar las máquinas virtuales.

Prerrequisitos para la recuperación

Advertencia

Estos pasos han funcionado para algunas personas, pero no para todas. La probabilidad de éxito depende de la cantidad del disco de la máquina virtual que haya sido encriptado, que a su vez depende de cuánto tiempo se haya estado ejecutando el programa de encripción y/o si ha fallado.

Copia de seguridad

Lo primero que hay que hacer, antes que nada, es crear una copia de seguridad de los archivos de la máquina virtual:

  • Crear una copia de la carpeta de la máquina virtual o
  • crear una carpeta de copia de seguridad dentro de la carpeta de la máquina virtual y copiar todos los archivos allí.

Eliminar archivos innecesarios

Los siguientes archivos nos son necesarios para este proceso y pueden ser eliminados sin problema. De todas formas deberías tener una copia de cada uno en la copia de seguridad que has hecho antes, por si acaso.

  • .args
  • .vmxf
  • .vmsd
  • .vmsn
  • .vmem
  • .nvram
  • .vmx – lo recuperas desde el archivo .vmx~ .

Puedes eliminar estos archivos y recuperar el archivo vmx utilizando el siguiente comando:

[root@esxihost:]$ mv VMNAME.vmx~ VMNAME.vmx
[root@esxihost:]$ rm *.args *.vmfx *.vmsd *.vmsn *.vmem *.nvram

Ahora tu carpeta debería estar un poco más vacía y limpia.

ESXiArgs – Recuperación de la Máquina Virtual

Recrear archivo VMDK

  1. Apunta el tamaño original del archivo -flat utilizando el comando ls -la:
[root@esxihost:]$ ls -la
total 92925984
drwxr-xr-x    1 root     root          1120 Feb 26 18:01 .
drwxr-xr-t    1 root     root          2100 Feb  4 15:56 ..
drwxr-xr-x    1 root     root          3500 Feb 20 16:31 BKUP
-rw-------    1 root     root  107374182912 Feb  3 10:18 VMNAME-flat.vmdk
-rw-------    1 root     root          1045 Feb  3 10:18 VMNAME.vmdk
-rwx------    1 root     root          3449 Dec  5 17:12 VMNAME.vmx
  1. Borra el archivo .vmdk existente con rm -rf xxx.vmdk:
[root@esxihost:]$ rm VMNAME.vmdk
  1. Crea un disco temporal (-flat.vmdk y .vmdk) utilizando el commando vmkfstools. Asegurate de que el tamaño que especificas es exactamente el mismo que el tamaño del archivo original que has apuntado antes:
[root@esxihost:]$ vmkfstools -c 107374182912 -d thin temp.vmdk
Create: 100% done.
  1. Debería haber dos nuevos archivos, uno temp-flat.vmdk y uno temp.vmdk. Los archivos -flat.vmdk deberían tener exactamente el mismo tamaño.
  1. Edita el archivo temp.vmdk:
    • En la línea 9, reemplaza temp-flat.vmdk por el nombre del archivo -flat original, y
    • Si tu disco NO ESTABA provisionado “thin”, elimina o comenta la línea 19 ddb.thinProvisioned. Si lo estaba, deja la línea como está.
    • Guarda el archivo.
# Disk DescriptorFile                                                                                      
version=1                                                                              
encoding="UTF-8"                                                                       
CID=fffffffe                                                                           
parentCID=ffffffff                                                                     
createType="vmfs"                                                                      
                                                                                       
# Extent description                                                                   
RW 209715201 VMFS "WebServer_2-flat.vmdk"                                              
                                                                                       
# The Disk Data Base                                                                   
#DDB                                                                                   
                                                                                       
ddb.adapterType = "lsilogic"                                                           
ddb.geometry.cylinders = "13054"                                                       
ddb.geometry.heads = "255"                                                             
ddb.geometry.sectors = "63"                                                            
ddb.longContentID = "cf65c0c190124ab5571025d1fffffffe"                                 
#ddb.thinProvisioned = "1"                                                             
ddb.uuid = "60 00 C2 94 74 7b 9f 6f-36 7e b3 ce d1 90 72 2f"                           
ddb.virtualHWVersion = "14"

En este momento deberías tener algo parecido a esto:

[root@esxihost:]$ ls -la
total 92925984
drwxr-xr-x    1 root     root          1120 Feb 26 18:01 .
drwxr-xr-t    1 root     root          2100 Feb  4 15:56 ..
drwxr-xr-x    1 root     root          3500 Feb 20 16:31 BKUP
-rw-------    1 root     root  107374182912 Feb  3 10:18 VMNAME-flat.vmdk  (ORIGINAL)
-rw-------    1 root     root          1045 Feb  3 10:18 VMNAME.vmdk       (Recreated & Edited)
-rwx------    1 root     root          3449 Dec  5 17:12 VMNAME.vmx        (Recovered from .vmx~)

Vamos ahora a probar estos archivos .vmdk y -flat.vmdk con una máquina virtual. Para ello, tendrás que hacer lo siguiente:

Crea una Maquina Virtual nueva

  1. Crea una nueva carpeta de máquina virtual (fuera de la carpeta de la máquina virtual original) llamada “Test”.
    • Puedes hacerlo a través de SSH o del navegador de Datastore.
  2. Copia los siguientes archivos a esta carpeta:
    • VMNAME.vmdk
    • VMNAME-flat.vmdk
  3. Crea una nueva máquina virtual a través de la interfaz de usuario:
    • CPU y RAM iguales o similares (no creo que haya mucha diferencia).
    • Elimina el Disco Duro por defecto, y añade un nuevo disco duro, seleccionando Disco Duro Existente. A continuación, navega a la carpeta “Test” creada anteriormente, y selecciona el archivo .vmdk que hay allí.
    • En “CD/DVD Drive 1”, selecciona Datastore ISO File y busca un live CD de Linux. En mi caso utilicé Kali Linux Live CD, que funcionó. Asegúrate de que la opción “Conectar al encender” está seleccionada.
  4. Inicia la VM.
ESXi - Create new VM

Recupera tu Partición con Testdisk

  1. Arranca el Live CD – en mi caso con interfaz gráfica – para intentar recuperar tu partición y reinstalar Grub. Estos pasos pueden variar dependiendo de las particiones que tuvieras en tu VM.
  2. Abre una terminal y usa testdisk para recuperar tu tabla de particiones. Yo seguí esta guía para recuperar mi partición Linux. NO REINICIES como se indica en esta guía.
    • Instala testdisk si no está instalado (viene incluido con Kali Linux).
    • Inicia testdisk.
    • Selecciona la opción No Log y procede.
    • Seleccione el disco de la máquina virtual (normalmente /dev/sda) y seleccione Continuar.
    • Selecciona el tipo de partición (Intel/PC).
    • Selecciona Analizar y pulsa Intro.
    • Selecciona Búsqueda rápida y pulsa Intro.
    • Selecciona tu partición si la encuentras (en mi caso Linux – puede llamarse diferente dependiendo de tu SO/configuración) y pulsa intro.
    • Si la tabla de particiones parece correcta, elige la opción Escribir, y confírmalo en el siguiente paso pulsando Y.
    • Cuando termine, utiliza Quit para salir de testdisk.
    • Usa fdisk -l para listar y comprobar tu disco y partición.
    • NO REINICIES.

Reinstala GRUB

  1. Reinstala GRUB utilizando los siguientes comandos:
root@kali-live:~# mount /dev/sda1 /mnt
root@kali-live:~# mount --bind /dev /mnt/dev
root@kali-live:~# mount --bind /dev/pts /mnt/dev/pts
root@kali-live:~# mount --bind /proc /mnt/proc
root@kali-live:~# mount --bind /sys /mnt/sys
root@kali-live:~# chroot /mnt /bin/bash
root@kali-live:~# grub-install /dev/sda

Algunas guías que encontré en línea dicen que sólo se debe usar chroot /mnt cuando se usa el comando chroot. Esto no funcionó para mí y recibía los siguientes errores: chroot: failed to run command '/bin/bash' o chroot: failed to run command '/bin/zsh' – Esto es porque si no especificas la ruta para bash, Kali Linux intentará hacer chroot usando el entorno shell local, lo cual no puede funcionar. Necesitas especificar la ruta y el shell usado por el sistema operativo que tu máquina virtual estaba usando.

Algunas guías que he encontrado en Internet indican que hay que ejecutar update-grub después del comando grub-install. Yo no he hecho eso.

  1. Sal del chroot y reinicia la máquina.

Arranca la Maquina Virtual

Debería arrancar el sistema operativo de la máquina virtual desde el archivo -flat.vmdk. Deberías poder iniciar sesión y explorar la estructura de archivos.

Si esto ha funcionado, ¡el archivo base VMDK y el archivo Flat deberían estar bien! ✅ 🎉

Esperemos que alguien consiga encontrar una forma de recuperar Máquinas Virtuales que tienen snapshots. ¡Si eso sucede, voy a escribir sobre ello!

Informacion Adicional / fuentes

A continuación encontrarás una lista de enalces útiles con información adicional: