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
- Apunta el tamaño original del archivo
-flatutilizando el comandols -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
- Borra el archivo
.vmdkexistente conrm -rf xxx.vmdk:
[root@esxihost:]$ rm VMNAME.vmdk
- Crea un disco temporal (
-flat.vmdky.vmdk) utilizando el commandovmkfstools. 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.
- Debería haber dos nuevos archivos, uno
temp-flat.vmdky unotemp.vmdk. Los archivos-flat.vmdkdeberían tener exactamente el mismo tamaño.
- Edita el archivo
temp.vmdk:- En la línea 9, reemplaza
temp-flat.vmdkpor el nombre del archivo-flatoriginal, 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.
- En la línea 9, reemplaza
# 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
- 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.
- Copia los siguientes archivos a esta carpeta:
VMNAME.vmdkVMNAME-flat.vmdk
- 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 .
vmdkque 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.
- Inicia la VM.

Recupera tu Partición con Testdisk
- 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.
- Abre una terminal y usa
testdiskpara recuperar tu tabla de particiones. Yo seguí esta guía para recuperar mi particiónLinux. NO REINICIES como se indica en esta guía.- Instala
testdisksi no está instalado (viene incluido con Kali Linux). - Inicia
testdisk. - Selecciona la opción
No Logy procede. - Seleccione el disco de la máquina virtual (normalmente
/dev/sda) y seleccioneContinuar. - Selecciona el tipo de partición (
Intel/PC). - Selecciona
Analizary pulsa Intro. - Selecciona
Búsqueda rápiday 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 pulsandoY. - Cuando termine, utiliza
Quitpara salir de testdisk. - Usa
fdisk -lpara listar y comprobar tu disco y partición. - NO REINICIES.
- Instala
Reinstala GRUB
- 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.
- Sal del
chrooty 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:



