Ransomware y el Acceso controlado a carpetas en Windows 10

Hace unos días escribí un artículo uno de los tipos de ataques relacionados con el robo de credenciales y cómo Windows Defender Credential Guard podía evitarlo. En esta ocasión haré el mismo ejercicio de mostrar una característica nueva de seguridad en Windows 10, pero esta vez enfocado a un tipo de peligro mucho más común: ransomware.

Windows 10 Fall Creators Update introdujo una serie de características de seguridad agrupadas en una categoría llamada Windows Defender Exploit Guard, que a su vez viene siendo el remplazo mejorado de lo que antes se conocía como EMET, pero ya integrado en Windows. Una de las categorías de Exploit Guard es Controlled Folder Access o Controla el acceso a la carpeta, como está traducido al español (algo rara esa traducción, por cierto). Cada aplicación que se ejecute es evaluada por Windows Defender; si determina que es maliciosa o no confiable, es decir, sospechosa, impide que haga modificaciones a cualquier archivo que esté dentro de las carpetas protegidas. Aunque está pensado para cualquier aplicación maliciosa que intente escribir, es especialmente útil para combatir el ransomware, pues si las aplicaciones no pueden modificar nuestros archivos, tampoco podrán, obviamente, proceder a cifrarlos para pedir recompensas.

Predeterminadamente, Controla el acceso a la carpeta agrega las carpetas más comunes en donde el usuario puede almacenar información a las carpetas protegida; estos directorios no se pueden modificar:

image

Antes de entrar en detalle sobre cómo habilitar la característica y configurar las opciones que Windows nos provee a través de directivas de grupo, hagamos una simulación sobre lo que podría pasar en las carpetas con datos importantes.

Jugando a ser ransomware: MalFile.exe

Para poder probar con calma Controla el acceso a carpeta, decidí escribir una pequeña aplicación en C utilizando algunas API de Windows para crear y cifrar archivos. El cifrado está basado en Cryptography API: Next Generation (CNG), de Microsoft, por si están interesados.

Pueden ver el código fuente y la versión 1.0 de esta aplicación en caso de que quieran hacer las mismas pruebas: https://github.com/SergioCalderonR/MalFile/releases 

Si utilizamos el parámetro –ef, la aplicación tomará un archivo de texto plano como primer argumento, leerá el contenido, cifrará el contenido y lo guardará en el archivo que indiquemos como segundo argumento con cualquier extensión. Además de esto, la aplicación eliminará el archivo fuente, así que solo quedará el que está cifrado. En otras palabras, estoy tratando de jugar a ser ransomware.

Ahora, en mi escenario tengo una carpeta llamada C:\Info y allí, un archivo Confidential.txt que tiene texto plato:

image

MalFile.exe necesita tres parámetros para cifrar: –ef, la ruta del archivo a cifrar y la ruta del archivo cifrado con cualquier extensión o bien en texto plano (.txt).

Suponiendo que la aplicación fuera un ransomware, el ataque se podría efectuar sin ningún problema, pues para hacer cifrado ni siquiera se necesitan privilegios administrativos. Yo voy a simular el ataque enviándole los parámetros y cifrando el archivo con extensión .neu, así:

MalFile.exe –ef C:\Info\Confidential.txt C:\Info\Encrypted.neu

image

Noten que la aplicación indica, paso a paso, todo lo que se hizo sobre el contenido del archivo y que elimina el archivo original (para fines de demo, pues no sería lo que haría un ransomware).

Si abrimos el archivo con un bloc de notas, vamos a ver todo el contenido cifrado y una pequeña descripción que aparecerá en texto plano:

image

El texto que no aparece cifrado es porque la función CryptProtectData de la API de Windows permite agregarlo para que viaje con el contenido, pero no lo cifra.

Siendo un verdadero ransomware, no sería un solo archivo, sino múltiples y estaríamos ya preocupados por no poder tener la información.

Protegiendo las carpetas importantes activando Controla el acceso a carpeta

Como mencioné al principio, Controla el acceso a carpeta o Controlled Folder Acces en inglés permite restringir las operaciones de escritura sobre archivos que estén en las carpetas protegidas, así que el ransomware o cualquier otro archivo malicioso no podría actuar, a menos que logre ser confiable dentro de la base de datos de Microsoft. Veamos qué pasa cuando tratamos de hacer el ataque anterior con la característica activada.

Primero, abrimos el Centro de seguridad de Windows Defender desde el menú de inicio:

image

En el Centro de seguridad de Windows, hacemos clic en Protección antivirus y contra amenazas:

image

En la página de Protección antivirus y contra amenazas, clic en Configuración de antivirus y protección contra amenazas:

image

Luego bajamos y activamos deslizando a la derecha para activar Controla el acceso a la carpeta:

image

A menos que el directorio que deseamos proteger esté en alguna ubicación predeterminada de usuario (documentos, imágenes, etc), hacemos clic en Carpetas protegidas:

image

Finalmente, hacemos clic en Agregar una carpeta protegida, navegamos hasta el directorio raíz y aceptamos para que quede dentro de la lista de Controla el acceso a la carpeta:

image

Aceptamos el UAC y listo, nuestra carpeta estará protegida.

Como dato adicional, también pueden agregar la carpeta desde PowerShell así:

Add-MpPreference –ControlledFolderAccessProtectedFolders [CarpetaProtegida]

Donde [CarpetaProtegida] hace referencia al directorio que va a protegeer Controla el acceso a la carpeta de Windows 10. En mi caso, quedaría así:

 Add-MpPreference –ControlledFolderAccessProtectedFolders C:\Info

image

De cualquiera de las dos formas deberíamos ver nuestra carpeta en la lista:

image

Aunque no lo indicaré en este artículo, también se puede habilitar la característica a través de directivas de grupo, incluso podemos usar un modo de auditoría para no afectar a las aplicaciones sin estar seguros de que todo funcionará.

¿Qué pasa ahora cuando una aplicación malitencionada intente hacer algo?

Jugando a ser ransomware: revancha

Utilizando MalFile, voy a probar dos escenarios: creación de archivos y cifrado de archivos. La diferencia es que ahora los archivos están protegidos.

Para crear un simple archivo de texto plano basta con usar el parámetro –nf junto con la ruta y extensión. Si intento crear un archivo en la carpeta C:\Info, esto es lo que pasa:

image

El manejador de errores de Windows está devolviendo un código de error 2, que es cuando no puede encontrar el archivo especificado. Esto es porque en el código estoy utilizando la función de CreateFile, que sirve para abrir o crear archivos. En un funcionamiento normal, independiente de que el archivo exista o no, debería crearlo desde cero, pues eso es lo que explícitamente le pedí cuando la escribí:

image

Ignoro por qué no devuelve un error diferente, pero puede indicar que solo permite hacer las operaciones de lectura. A parte de devolver el error y no permitir hacer la escritura, Windows Defender muestra una notificación al usuario del bloqueo similar a la siguiente:

image

Supongamos que tenemos nuestro archivo Confidential.txt con información importante y hasta ahora sano y salvo en la carpeta segura y lo intento cifrar usando de nuevo el parámetro de –ef, así:

MalFile.exe –ef C:\Info\Confidential.txt C:\Info\Encrypted.tulpep

image

La aplicación puede leer los datos, pasarlos a otro buffer para cifrarlos, pero no puede escribir en la misma carpeta otra vez, así que el archivo continuará intacto. También veremos la notificación por parte del Centro de seguridad de Windows Defender.

También podríamos suponer que dejando leer los datos, podríamos cifrarlos y luego escribirlos nuevamente, esto sería posible si como segundo parámetro le indicamos el mismo archivo fuente, así:

MalFile.exe –ef C:\Info\Confidential.txt C:\Info\Confidential.txt

Sin embargo, Controla el acceso a la carpeta también evita que un proceso no confiable pueda escribir sobre el mismo archivo:

image

Como pueden ver, Windows devuelve Acceso denegado. Interesante, ¿no?

Permitir acceso a aplicaciones manualmente

Desde que sea una aplicación comercial o esté firmada digitalmente, no deberían tener problemas para modificar archivos en la carpetas protegidas; sin embargo, habrá excepciones que encontrarán en el camino. Afortunadamente Windows Defender permite solventar esto, basta con devolvernos a la pantalla de Protección antivirus y contra amenazas y en vez de hacer clic en Carpetas protegidas, hacemos clic en Permitir que una aplicación acceda a una de las carpetas controladas:

image

Luego hacemos clic en Agregar una aplicación permitida, buscamos el ejecutable y aceptamos:

image

Después de esto, así esté habilitado Controla el acceso a carpeta permitirá la escritura sin problemas:

image

Hay un poco más de contenido sobre este tema, pero con esto es suficiente para conocer la característica y experimentarla.

Espero sea de utilidad.

Saludos,

—Checho
Follow me on Twitter

Pass-The-Hash y Windows Defender Credential Guard en Windows 10

Desde el lanzamiento de Windows 10, Microsoft ha hecho enormes esfuerzos por mejorar la seguridad de la plataforma en diferentes frentes agregando más y más características en cada compilación, trabajo que va teniendo frutos, pues se ha convertido el sistema operativo Microsoft más seguro de todos.

Como vale la pena ir conociendo cómo implementar estas nuevas características, iré escribiendo, conforme pueda y sepa, lo que aprendo por aquí por si alguien más desea hacer pruebas en sus respectivas empresas. Por supuesto, todas las correcciones serán más que bienvenidas.

Una de las nuevas características de seguridad se llama Credential Guard, que básicamente utiliza seguridad basada en virtualización para aislar secretos que puedan llevar a ataques de robo de credenciales. Los secretos se protegen y almacenan en un nuevo componente llamado Insolated LSA; la comunicación con el proceso de LSA se hace a través de RPC. Básicamente previene los ataques protegiendo los hashes de las contraseñas NTLM, Kerberos y las contraseñas de dominio almacenadas en el Credential Manager. Pueden obtener más información del sitio oficial.

Pass-The-Hash es un ataque que utiliza una técnica para obtener los hashes de las contraseñas y reutilizarlos para autenticarse a través de la red en otros equipos hasta lograr ganar privilegios con una cuenta de Active Directory.

Veamos qué tan fácil puede llegar a ejecutarse un Pass-The-Hash en Windows 10 y cómo Windows Defender Credential Guard nos puede ayudar a prevenirlo.

Ejecutando un ataque de Pass-The-Hash

Antes que nada, por si desean seguir el ataque, esto es lo que necesitamos:

1. Mimikatz. Lo pueden descargar desde aquí: https://github.com/gentilkiwi/mimikatz/releases

2. PsExec. Lo pueden descargar desde aquí:
https://docs.microsoft.com/en-us/sysinternals/downloads/psexec

3. Entorno de directorio activo

4. Equipo cliente unido al dominio para probar

Notas:

  • Cabe aclarar que obviamente necesitaremos cuentas de dominio con diferentes privilegios para probar.
  • Es probable que deban darle permisos desde el antivirus al Mimikatz, pues normalmente lo bloquean.

Primer paso: obtener el hash NTLM de las contraseñas con Mimikatz

Para poder extraer el hash de las contraseñas de un equipo, cada cuenta de dominio tuvo que haberse conectado de alguna forma, pues al cerrar sesión ya no es posible que Mimikatz cree el hash, así que no lo mostraría en la consola.

No sé si sea diferente con otra aplicación; en mi caso, aunque pude extraer el NTLM hash después de cerrar sesión con otras cuentas, el ataque de Pass-The-Hash no funcionaba correctamente.

Ahora, para mi escenario tengo dos cuentas con las que voy a jugar: Sergio y Andy; la primera, Sergio, es una cuenta de dominio que solo es administradora en el equipo local (no estoy teniendo en cuenta aquí lo de ganar privilegios locales), mientras que la segunda, Andy, es una cuenta que tiene privilegios locales sobre todas las máquinas, incluyendo el controlador de dominio.

Si yo intento hacer conexión utilizando PsExec desde mi cuenta de Sergio, no podré hacerlo por ser una cuenta estándar, más allá de tener privilegios administrativos locales:

SNAGHTML14d1dec7

Afortunadamente, Andy está conectando al equipo, pero necesitamos obtener y reutilizar ese hash para nuestro ataque.

Desde una cuenta local o de dominio con privilegios administrativos en la máquina ejecutamos Mimikatz como administrador:

image

Lo primero es solicitar privilegios a Windows de depuración ejecutando:

privilege::debug

image

Una vez adquiridos los privilegios, es decir, que la consola responda con un OK, vamos a extraer toda la información sobre las contraseñas que están en memoria con el módulo de sekurlsa:

sekurlsa::logonpasswords

image

Inmediatamente veremos datos para todas las cuentas que estén conectadas, incluyendo el más importante para este dato que sería el hash NTLM:

image

Por supuesto, nosotros no estamos interesados el usuario de Sergio, sino en el de Andy. Mimikatz, como dije, me da también el hash de la contraseña correspondiente, siempre y cuando tenga una sesión abierta:

image

Noten que el campo de contraseña lo muestra en nulo porque la forma en que se almacenan en Windows 10 difiere de Windows 7 y anteriores, así que no la podemos ver. Si estuviésemos en un Windows 7, habríamos obtenido la contraseña sin problemas.

Como pueden ver, ya tenemos el hash NTLM y eso es todo lo que necesitamos para autenticarnos a través de la red como Andy.

Segundo paso: realizar el ataque de Pass-The-Hash con el hash obtenido

Desde Mimikatz, lanzamos nuestro ataque de Pass-The-Hash con los datos que ya tenemos:

sekurlsa::pth /user:andy /domain:winside.local /ntlm:a87f3a337d73085c45f9416be5787d86

image

Nota: obviamente los datos en usuario, dominio y NTLM van a ser diferentes en cada escenario, pero dejo el comando de forma ilustrativa.

Lo que va a pasar aquí es que Mimikatz va a lanzar el cmd con una identidad falsa, Windows va a creer que era el usuario actual, es decir, Sergio en este caso, pero va a utilizar el hash de la contraseña del usuario de Andy:

image

Nuestro último paso es simplemente utilizar la consola que se nos abrió para autenticarnos en las próximas máquinas como Andy. Por ejemplo, utilizando PsExec nuevamente sobre el controlador de dominio:

PsExec \\LEO cmd.exe

Si le doy un whoami, van a ver que estoy conectando como Andy, gracias a que reutilicé el hash de la contraseña almacenada en memoria de mi equipo:

SNAGHTML14e3f7a6

Suponiendo que logre burlar la seguridad para ejecutar Mimikatz, yo podría, por supuesto, seguir obteniendo el hash NTLM de las credenciales locales hasta llegar a un usuario que tenga realmente poderes sobre el dominio:

image

Implementando Windows Defender Credential Guard

La implementación de Credential Guard es relativamente sencilla, basta con cumplir los requerimientos en las máquinas físicas o virtuales y proceder a desplegarlo a través de una directiva de grupo, manualmente (Registro de Windows) o con un script de PowerShell liberado por Microsoft.

Para mayor claridad, crearemos la GPO para Credential Guard desde cero.

Nos conectamos a la consola de administración de directivas de grupo y creamos la GPO en la OU que corresponda:

image

Yo la llamaré Credential Guard Policies.

image

Hacemos clic derecho sobre la GPO, editamos y navegamos hasta:

Computer Configuration\Policies\Administrative Templates\System\Device Guard

Allí hacemos doble clic sobre la plantilla de Turn On Virtualization Based Security

image

En la plantilla, clic en Enabled, y debajo de Credential Guard Configuration seleccionamos la opción de Enabled with UEFI Lock, esto es para que remotamente no se pueda deshabilitar, pues está protegido por UEFI.

image

Nota: para fines de prueba pueden utilizar la de Enabled Without Lock.

Actualizamos directivas de grupo en el equipo cliente y reiniciamos.

Después de reiniciar, ejecutamos Msinfo32 y verificamos que en la parte inferior la característica de Virtualization Based Security esté en ejecución y lo demás haga referencia a Credential Guard:

image

En caso de que esté habilitado pero no en ejecución, es necesario habilitar manualmente la característica de Hyper-V Hypervisor desde Activar o desactivar características de Windows y reiniciar nuevamente:

image

Obteniendo el hash de las contraseñas con Credential Guard habilitado

Después de que Windows Defender Credential Guard esté habilitado y funcionando, podemos intentar nuevamente utilizar Mimikatz o cualquier otra herramienta que obtenga el hash NTLM de las cuentas y nos encontraremos con algo completamente diferente:

image

Como pueden ver, ya no tengo forma de obtener el hash porque ahora Windows, utilizando la tecnología de seguridad basada en virtualización, más específicamente la de Insolated User Mode, está protegiendo los secretos (credenciales) para que solo unos binarios autorizados puedan llegar a ellos. Si no tengo el hash NTLM, naturalmente, no puedo hacer el ataque de Pass-The-Hash en las máquinas.

Credential Guard está disponible solo en ediciones Enterprise y Education de Windows 10.

Espero sea de utilidad y pueda seguir compartiendo otras tecnologías nuevas de seguridad en Windows 10.

Saludos,

—Checho