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
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
-flat
utilizando 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
.vmdk
existente conrm -rf xxx.vmdk
:
[root@esxihost:]$ rm VMNAME.vmdk
- Crea un disco temporal (
-flat.vmdk
y.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.vmdk
y unotemp.vmdk
. Los archivos-flat.vmdk
deberían tener exactamente el mismo tamaño.
- 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.
- 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.vmdk
VMNAME-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
.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.
- 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
testdisk
para 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
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 seleccioneContinuar
. - 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 pulsandoY
. - Cuando termine, utiliza
Quit
para salir de testdisk. - Usa
fdisk -l
para 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
- 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: