Productos y Servicios PRODUCTOS Y SERVICIOS

El error “HiveNightmare” de Windows podría filtrar contraseñas ¡Esto es lo que debes hacer!

Como si no fuera suficiente con que una pesadilla de Windows persiga a nuestras impresoras, tenemos otro error, revelado por Microsoft el 20/07/2021, que podría exponer datos críticos del registro de Windows.

Denominado CVE-2021-36934, este también es conocido como HiveNightmare y SeriousSAM.

El apodo de HiveNightmare proviene del hecho de que Windows almacena sus datos de registro en una pequeña cantidad de archivos de base de datos patentados, conocidos en la jerga de Microsoft como subárboles del registro (hives en inglés).

Estos subárboles del registro incluyen un trío llamado SAMSECURITY ySYSTEM, que entre ellos incluyen datos críticos que incluyen contraseñas y tokens de seguridad a los que se supone que los usuarios normales no pueden acceder.

Se guardan en una carpeta especial y supuestamente segura en el directorio de Windows llamada C:\Windows\System32\config, como puedes ver a continuación:

C:\Windows\System32\config> dir
[. . .]
Directory of C:\Windows\System32\config
[. . .]
21/07/2021  12:57           524,288 BBI
25/06/2021  06:21            28,672 BCD-Template
21/07/2021  14:45        32,768,000 COMPONENTS
21/07/2021  12:57           786,432 DEFAULT
21/07/2021  12:32         4,194,304 DRIVERS
[. . .]
21/07/2021  12:57            65,536 SAM       <--some system secrets included
21/07/2021  12:57            32,768 SECURITY  <--some system secrets included
21/07/2021  12:57        87,556,096 SOFTWARE
21/07/2021  12:57        11,272,192 SYSTEM    <--some system secrets included
[. . .]

El apodo SeriousSAM proviene del nombre de archivo SAM, que es la abreviatura de Security Account Manager, un nombre que suena tan serio como el contenido del archivo.

Si alguna vez has usado herramientas para descifrar o piratear contraseñas (o encontraste evidencia de ellas en tu red después de detectar un ataque activo), sabrás que la base de datos SAM es donde muchos ciberdelincuentes comienzan a excavar para intentar obtener credenciales de administrador para moverse por tu red.

Afortunadamente, debes tener acceso de administrador para obtener los datos de SAM en la memoria, y no puedes acceder al subárbol de registro de SAM en el disco mientras Windows se está ejecutando, incluso si eres un administrador, porque el archivo SAM que se muestra arriba está bloqueado para uso exclusivo del sistema operativo.

Hasta aquí todo bien.

¿Quién puede ver qué?

Escribimos un pequeño programa en C que puedes usar para obtener un “indicador de accesibilidad” para cualquier archivo en el sistema, simplemente intenta abrir el nombre de archivo o los nombres de archivo que has puesto en la línea de comando e informa del código de error de Windows si el archivo no pudo no se puedo abrir.

(El siguiente código es de dominio público, por lo que puedes hacer lo que quieras con él, pero úsalo bajo tu propia responsabilidad).

Ni siquiera necesitas los archivos de encabezado de Windows para compilarlo, solo necesitas decirle a tu compilador o enlazador que necesitas kernel32.dll y msvcrt.dll:

/* --- CHKIT.C --- */

void     *CreateFileA(char *name,unsigned mode,unsigned share,void *sec,unsigned disp,unsigned attr,void *tmpl);
int      CloseHandle(void *hnd);
unsigned GetLastError(void);
int      printf(char *fmt, ...);

int main(int argc, char **argv) {
   for (int i = 1; i < argc; i++) {
      printf("Opening file [%s]\n",argv[i]);
      void *hnd = CreateFileA(argv[i],0x80000000L,0,0,3,0x80,0);
      if ((long int)hnd == -1) {
         printf("Failed (GetLastError=0x%08X)\n",GetLastError());
      } else {
         printf("Worked (handle=%ld)\n",(long int)hnd);
         CloseHandle(hnd);
      }
   }
   return 0;
}

Desde un símbolo del sistema elevado (uno que se ejecuta con privilegios de administrador), obtenemos el siguiente resultado:

C:\Users\duck> chkit C:\Windows\System32\config\SAM C:\Windows\System32\config\SYSTEM C:\Windows\System32\config\SECURITY
Opening file [C:\Windows\System32\config\SAM]
Failed (GetLastError=0x00000020)
Opening file [C:\Windows\System32\config\SYSTEM]
Failed (GetLastError=0x00000020)
Opening file [C:\Windows\System32\config\SECURITY]
Failed (GetLastError=0x00000020)

El error 0x20 significa ERROR_SHARING_VIOLATION, descrito oficialmente por Microsoft como “El proceso no puede acceder al archivo porque está siendo utilizado por otro proceso”.

Hasta ahora, todavía está bien.

Intentemos de nuevo desde un símbolo del sistema no elevado, donde estamos ejecutando como un usuario normal:

C:\Users\duck> chkit C:\Windows\System32\config\SAM
Opening file [C:\Windows\System32\config\SAM]
Failed (GetLastError=0x00000020)

¡Eso no puede ser!

Deberíamos haber recibido el Error 0x05, abreviatura del autoexplicativo ERROR_ACCESS_DENIED, de inmediato.

Ver el error 0x20 significa que al programa se le permitió intentar abrir el archivo y falló en ese momento, en lugar de ser bloqueado para intentar acceder al archivo en primer lugar.

Y si vemos la ACL (lista de control de acceso) para el subárbol del registro SAM, por ejemplo, usando la utilidad ICACLS, vemos que este comportamiento se debe a un error de seguridad:

C:\Windows\System32> icacls config\SAM
config\SAM BUILTIN\Administrators:(I)(F)
           NT AUTHORITY\SYSTEM:(I)(F)
           BUILTIN\Users:(I)(RX)    <-- this is wrong - regular users should not have read access!
           APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
           APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)

Successfully processed 1 files; Failed processing 0 files

En otras palabras, los datos de registro de SAM (y también el subárbol del registro de SECURITY y SYSTEM) están protegidos en tiempo de ejecución contra el acceso de usuarios regulares porque los archivos están en uso en otros lugares, no porque los archivos estén fuera del alcance de los usuarios regulares desde el principio.

Necesitamos corregir esa vulnerabilidad, y la solución oficial de Microsoft es restringir las listas de control de acceso (ACL) en todo lo que esté dentro y debajo del directorio CONFIG.

Debes ser administrador y realizar el siguiente cambio de seguridad:

C:\Users\duck> icacls %windir%\system32\config\*.* /inheritance:e
processed file: C:\Windows\system32\config\BBI
[. . .]
processed file: C:\Windows\system32\config\SAM
[. . .]
processed file: C:\Windows\system32\config\SECURITY
[. . .]
processed file: C:\Windows\system32\config\SYSTEM
[. . .]
Successfully processed 45 files; Failed processing 0 files

Ahora, la ACL para el archivo SAM que verificamos arriba parece mucho más saludable:

C:\Windows\System32> icacls config\SAM
config\SAM NT AUTHORITY\SYSTEM:(I)(F)
           BUILTIN\Administrators:(I)(F)

Successfully processed 1 files; Failed processing 0 files

Además, si intentamos abrir el subárbol del registro SAM en vivo nuevamente desde un indicador de comando que no sea de administrador, ya no obtenemos el error 0x20.

Ahora obtenemos el error 0x05 más consciente de la seguridad, que nos dice ACCESS_DENIED:

C:\Users\duck> chkit C:\Windows\System32\config\SAM
Opening file [C:\Windows\System32\config\SAM]
Failed (GetLastError=0x00000005)

¡Aún no has terminado!

Pero eso no es suficiente.

Si tiene puntos de restauración del sistema (también conocidos como instantáneas de volumen) en tu ordenador, esos puntos incluyen copias de tus subárboles del registro SAM, SECURITY y SYSTEM original con la configuración de control de acceso antigua e insegura.

En otras palabras, cualquier usuario sin privilegios podría simplemente leer datos como los de control de acceso de Windows o los hashes de contraseña de las instantáneas.

Por cierto, es posible que tengas una o más instantáneas en tu ordenador, incluso si no has ido al menú Protección del sistema y no has hecho clic en el botón [Crear] para generar una.

(Un punto de restauración es como una instantánea en línea o una copia de seguridad temporal que puedes usar para “rebobinar” el contenido de tu disco duro y recuperar una versión anterior de tu sistema si algo se va mal, por ejemplo, después de una actualización que no funcionó).

TI puede haber realizado puntos de restauración en varios momentos; además, las actualizaciones del sistema e incluso algún software de seguridad pueden crear puntos de restauración automáticamente para su propio uso.

Puedes comprobar la presencia de instantáneas en tu equipo mediante la herramienta de línea de comandos administrativa del Servicio de instantáneas de volumen, vssadmin.

Tenemos una instantánea (la creamos a propósito para este artículo), como puedes ver a continuación:

C:\Users\duck> vssadmin list shadows

vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool
(C) Copyright 2001-2013 Microsoft Corp.

Contents of shadow copy set ID: {. . .}
   Contained 1 shadow copies at creation time: 21/07/2021 14:58:05
      Shadow Copy ID: {. . .}
         Original Volume: (C:)\\?\Volume{. . .}\
         Shadow Copy Volume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2  <--this is the directory tree where the shadow file copies can be found
         Originating Machine: W10
         Service Machine: W10
         Provider: 'Microsoft Software Shadow Copy provider 1.0'
         Type: ClientAccessibleWriters
         Attributes: Persistent, Client-accessible, No auto release, Differential, Auto recovered

Lo que este resultado nos dice es que las copias de los archivos del subárbol del registro, en el momento en que creamos el punto de restauración/instantánea, se pueden encontrar en este directorio instantáneo:

\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\Windows\System32\config

Simplemente toma el nombre del directorio raíz del volumen de la instantánea y agrega el nombre de archivo original de Windows, menos la letra de la unidad, por supuesto.

(En caso de que se lo esté preguntando, el prefijo \\? \ de aspecto extraño anterior le dice a Windows que lo trate como un nombre de archivo “ancho”, utilizando dos bytes para cada carácter, aunque esté escrito como una cadena de texto ASCII normal con un byte por carácter. Esto permite nombres de archivo de hasta 32 KB de longitud en lugar del límite habitual de nombres de archivo ASCII de 260 caracteres).

Entonces, probemos el programa chkit en las instantáneas de los archivos de la colmena del registro, en lugar de en las copias en vivo que nos dieron los errores SHARING_VIOLATION y luego ACCESS_DENIED anteriores.

Usando un símbolo del sistema que no es de administrador, obtenemos:

C:\Users\duck> chkit \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\Windows\System32\config\SAM
Opening file [\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\Windows\System32\config\SAM]
Worked (handle=136)

En pocas palabras, pudimos obtener acceso al archivo SAM (y también a otras copias de seguridad del subárbol del registro en el directorio de instantáneas) a pesar de que [a] el sistema se estaba ejecutando y [b] no teníamos poderes de administrador.

¿Qué hacer?

La solución oficial de Microsoft es bastante fácil:

  • Restablece las ACL en los archivos de subárbol de registro en vivo mediante el comando ICACLS, como se muestra arriba. Esto protege su sistema de ahora en adelante.
  • Elimina todos los puntos de restauración o instantáneas existentes. Esto garantiza que no queden archivos protegidos incorrectamente en un directorio de instantáneas.
  • Vuelve a crear un nuevo punto de restauración, si es necesario.

Por supuesto, como señala Microsoft con ironía, “Eliminar las instantáneas podría afectar las operaciones de restauración, incluida la capacidad de restaurar datos con aplicaciones de respaldo de terceros”.

Esa es una de las razones por las que los ciberdelincuentes de ransomware casi siempre eliminan todos tus puntos de restauración justo antes de que destruyan tu red, para que la recuperación sea más lenta y difícil.

En caso de que te lo estés preguntando, la forma rápida de eliminar todos tus puntos de restauración es usar el siguiente comando como administrador:

C:\Users\duck> vssadmin delete shadows /all
vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool
(C) Copyright 2001-2013 Microsoft Corp.

Do you really want to delete 1 shadow copies (Y/N): [N]? y

Successfully deleted 1 shadow copies.

En teoría, sospechamos que se podría escribir un script o programa para localizar cualquier copia de seguridad insegura del subárbol del registro dentro de cualquiera de tus directorios de instantáneas y luego establecer las ACL en esos archivos individuales, dejando así el resto del punto de restauración intacto.

Pero no hemos intentado hacer eso, y no estamos seguros de si un punto de restauración funcionaría correctamente si modificara su contenido “extraoficialmente” de esta manera, por lo que no lo recomendaremos.

Dejar un comentario

Your email address will not be published. Required fields are marked *